| @@ -351,7 +351,7 @@ public interface WxMpService { | |||
| * @throws WxErrorException | |||
| */ | |||
| public void menuDelete(String menuid) throws WxErrorException; | |||
| /** | |||
| * <pre> | |||
| * 自定义菜单查询接口 | |||
| @@ -361,7 +361,7 @@ public interface WxMpService { | |||
| * @throws WxErrorException | |||
| */ | |||
| public WxMenu menuGet() throws WxErrorException; | |||
| /** | |||
| * <pre> | |||
| * 测试个性化菜单匹配结果 | |||
| @@ -723,7 +723,7 @@ public interface WxMpService { | |||
| /** | |||
| * 统一下单(详见http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1) | |||
| * 在发起微信支付前,需要调用统一下单接口,获取"预支付交易会话标识" | |||
| * | |||
| * | |||
| * @param parameters | |||
| * All required/optional parameters for weixin payment | |||
| * @return | |||
| @@ -737,10 +737,10 @@ public interface WxMpService { | |||
| * @param parameters | |||
| * the required or optional parameters | |||
| * @return | |||
| * @throws WxErrorException | |||
| * @throws WxErrorException | |||
| */ | |||
| Map<String, String> getJSSDKPayInfo(Map<String, String> parameters) throws WxErrorException; | |||
| Map<String, String> getJSSDKPayInfo(Map<String, String> parameters) throws WxErrorException; | |||
| /** | |||
| * 该接口调用“统一下单”接口,并拼装JSSDK发起支付请求需要的参数 | |||
| * 详见http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html#.E5.8F.91.E8.B5.B7.E4.B8.80.E4.B8.AA.E5.BE.AE.E4.BF.A1.E6.94.AF.E4.BB.98.E8.AF.B7.E6.B1.82 | |||
| @@ -752,7 +752,7 @@ public interface WxMpService { | |||
| * @param ip 发起支付的客户端IP | |||
| * @param notifyUrl 通知地址 | |||
| * @return | |||
| * @throws WxErrorException | |||
| * @throws WxErrorException | |||
| * @deprecated Use me.chanjar.weixin.mp.api.WxMpService.getJSSDKPayInfo(Map<String, String>) instead | |||
| */ | |||
| @Deprecated | |||
| @@ -773,7 +773,7 @@ public interface WxMpService { | |||
| * @return | |||
| */ | |||
| WxMpPayCallback getJSSDKCallbackData(String xmlData); | |||
| /** | |||
| * 微信支付-申请退款 | |||
| * 详见 https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_4 | |||
| @@ -784,10 +784,10 @@ public interface WxMpService { | |||
| * <li/> total_fee | |||
| * <li/> refund_fee | |||
| * @return 退款操作结果 | |||
| * @throws WxErrorException | |||
| * @throws WxErrorException | |||
| */ | |||
| public WxMpPayRefundResult refundPay(Map<String, String> parameters) throws WxErrorException; | |||
| /** | |||
| * <pre> | |||
| * 计算Map键值对是否和签名相符, | |||
| @@ -914,7 +914,7 @@ public interface WxMpService { | |||
| */ | |||
| public void markCardCode(String code, String cardId, String openId, boolean isMark) throws | |||
| WxErrorException; | |||
| /** | |||
| * 查看卡券详情接口 | |||
| * 详见 https://mp.weixin.qq.com/wiki/14/8dd77aeaee85f922db5f8aa6386d385e.html#.E6.9F.A5.E7.9C.8B.E5.8D.A1.E5.88.B8.E8.AF.A6.E6.83.85 | |||
| @@ -925,4 +925,15 @@ public interface WxMpService { | |||
| * @throws WxErrorException | |||
| */ | |||
| public String getCardDetail(String cardId) throws WxErrorException; | |||
| /* | |||
| * <pre> | |||
| * 预览接口 | |||
| * 详情请见:http://mp.weixin.qq.com/wiki/15/40b6865b893947b764e2de8e4a1fb55f.html#.E9.A2.84.E8.A7.88.E6.8E.A5.E5.8F.A3.E3.80.90.E8.AE.A2.E9.98.85.E5.8F.B7.E4.B8.8E.E6.9C.8D.E5.8A.A1.E5.8F.B7.E8.AE.A4.E8.AF.81.E5.90.8E.E5.9D.87.E5.8F.AF.E7.94.A8.E3.80.91 | |||
| * </pre> | |||
| * @param wxMpMassPreviewMessage | |||
| * @return wxMpMassSendResult | |||
| * @throws WxErrorException | |||
| */ | |||
| public WxMpMassSendResult massMessagePreview(WxMpMassPreviewMessage wxMpMassPreviewMessage) throws Exception; | |||
| } | |||
| @@ -1259,4 +1259,11 @@ public class WxMpServiceImpl implements WxMpService { | |||
| return responseContent; | |||
| } | |||
| @Override | |||
| public WxMpMassSendResult massMessagePreview(WxMpMassPreviewMessage wxMpMassPreviewMessage) throws Exception { | |||
| String url = "https://api.weixin.qq.com/cgi-bin/message/mass/preview"; | |||
| String responseContent = execute(new SimplePostRequestExecutor(), url, wxMpMassPreviewMessage.toJson()); | |||
| return WxMpMassSendResult.fromJson(responseContent); | |||
| } | |||
| } | |||
| @@ -0,0 +1,68 @@ | |||
| package me.chanjar.weixin.mp.bean; | |||
| import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; | |||
| import java.io.Serializable; | |||
| /** | |||
| * @author miller | |||
| */ | |||
| public class WxMpMassPreviewMessage implements Serializable { | |||
| private String toWxUsername; | |||
| private String msgType; | |||
| private String content; | |||
| private String mediaId; | |||
| public WxMpMassPreviewMessage() { | |||
| super(); | |||
| } | |||
| public String getToWxUsername() { | |||
| return toWxUsername; | |||
| } | |||
| public void setToWxUsername(String toWxUsername) { | |||
| this.toWxUsername = toWxUsername; | |||
| } | |||
| public String getMsgType() { | |||
| return msgType; | |||
| } | |||
| /** | |||
| * <pre> | |||
| * 请使用 | |||
| * {@link me.chanjar.weixin.common.api.WxConsts#MASS_MSG_IMAGE} | |||
| * {@link me.chanjar.weixin.common.api.WxConsts#MASS_MSG_NEWS} | |||
| * {@link me.chanjar.weixin.common.api.WxConsts#MASS_MSG_TEXT} | |||
| * {@link me.chanjar.weixin.common.api.WxConsts#MASS_MSG_VIDEO} | |||
| * {@link me.chanjar.weixin.common.api.WxConsts#MASS_MSG_VOICE} | |||
| * 如果msgtype和media_id不匹配的话,会返回系统繁忙的错误 | |||
| * </pre> | |||
| * | |||
| * @param msgType | |||
| */ | |||
| public void setMsgType(String msgType) { | |||
| this.msgType = msgType; | |||
| } | |||
| public String getContent() { | |||
| return content; | |||
| } | |||
| public void setContent(String content) { | |||
| this.content = content; | |||
| } | |||
| public String getMediaId() { | |||
| return mediaId; | |||
| } | |||
| public void setMediaId(String mediaId) { | |||
| this.mediaId = mediaId; | |||
| } | |||
| public String toJson() { | |||
| return WxMpGsonBuilder.INSTANCE.create().toJson(this); | |||
| } | |||
| } | |||
| @@ -40,6 +40,7 @@ public class WxMpGsonBuilder { | |||
| INSTANCE.registerTypeAdapter(WxMpMaterialFileBatchGetResult.WxMaterialFileBatchGetNewsItem.class, new WxMpMaterialFileBatchGetGsonItemAdapter()); | |||
| INSTANCE.registerTypeAdapter(WxMpCardResult.class, new WxMpCardResultGsonAdapter()); | |||
| INSTANCE.registerTypeAdapter(WxMpCard.class, new WxMpCardGsonAdapter()); | |||
| INSTANCE.registerTypeAdapter(WxMpMassPreviewMessage.class, new WxMpMassPreviewMessageGsonAdapter()); | |||
| } | |||
| public static Gson create() { | |||
| @@ -0,0 +1,48 @@ | |||
| package me.chanjar.weixin.mp.util.json; | |||
| import com.google.gson.JsonElement; | |||
| import com.google.gson.JsonObject; | |||
| import com.google.gson.JsonSerializationContext; | |||
| import com.google.gson.JsonSerializer; | |||
| import me.chanjar.weixin.common.api.WxConsts; | |||
| import me.chanjar.weixin.mp.bean.WxMpMassPreviewMessage; | |||
| import java.lang.reflect.Type; | |||
| /** | |||
| * @author miller | |||
| */ | |||
| public class WxMpMassPreviewMessageGsonAdapter implements JsonSerializer<WxMpMassPreviewMessage> { | |||
| @Override | |||
| public JsonElement serialize(WxMpMassPreviewMessage wxMpMassPreviewMessage, Type type, JsonSerializationContext jsonSerializationContext) { | |||
| JsonObject jsonObject = new JsonObject(); | |||
| jsonObject.addProperty("towxname", wxMpMassPreviewMessage.getToWxUsername()); | |||
| if (WxConsts.MASS_MSG_NEWS.equals(wxMpMassPreviewMessage.getMsgType())) { | |||
| JsonObject news = new JsonObject(); | |||
| news.addProperty("media_id", wxMpMassPreviewMessage.getMediaId()); | |||
| jsonObject.add(WxConsts.MASS_MSG_NEWS, news); | |||
| } | |||
| if (WxConsts.MASS_MSG_TEXT.equals(wxMpMassPreviewMessage.getMsgType())) { | |||
| JsonObject sub = new JsonObject(); | |||
| sub.addProperty("content", wxMpMassPreviewMessage.getContent()); | |||
| jsonObject.add(WxConsts.MASS_MSG_TEXT, sub); | |||
| } | |||
| if (WxConsts.MASS_MSG_VOICE.equals(wxMpMassPreviewMessage.getMsgType())) { | |||
| JsonObject sub = new JsonObject(); | |||
| sub.addProperty("media_id", wxMpMassPreviewMessage.getMediaId()); | |||
| jsonObject.add(WxConsts.MASS_MSG_VOICE, sub); | |||
| } | |||
| if (WxConsts.MASS_MSG_IMAGE.equals(wxMpMassPreviewMessage.getMsgType())) { | |||
| JsonObject sub = new JsonObject(); | |||
| sub.addProperty("media_id", wxMpMassPreviewMessage.getMediaId()); | |||
| jsonObject.add(WxConsts.MASS_MSG_IMAGE, sub); | |||
| } | |||
| if (WxConsts.MASS_MSG_VIDEO.equals(wxMpMassPreviewMessage.getMsgType())) { | |||
| JsonObject sub = new JsonObject(); | |||
| sub.addProperty("media_id", wxMpMassPreviewMessage.getMediaId()); | |||
| jsonObject.add(WxConsts.MASS_MSG_VIDEO, sub); | |||
| } | |||
| jsonObject.addProperty("msgtype", wxMpMassPreviewMessage.getMsgType()); | |||
| return jsonObject; | |||
| } | |||
| } | |||