| @@ -351,7 +351,7 @@ public interface WxMpService { | |||||
| * @throws WxErrorException | * @throws WxErrorException | ||||
| */ | */ | ||||
| public void menuDelete(String menuid) throws WxErrorException; | public void menuDelete(String menuid) throws WxErrorException; | ||||
| /** | /** | ||||
| * <pre> | * <pre> | ||||
| * 自定义菜单查询接口 | * 自定义菜单查询接口 | ||||
| @@ -361,7 +361,7 @@ public interface WxMpService { | |||||
| * @throws WxErrorException | * @throws WxErrorException | ||||
| */ | */ | ||||
| public WxMenu menuGet() throws WxErrorException; | public WxMenu menuGet() throws WxErrorException; | ||||
| /** | /** | ||||
| * <pre> | * <pre> | ||||
| * 测试个性化菜单匹配结果 | * 测试个性化菜单匹配结果 | ||||
| @@ -723,7 +723,7 @@ public interface WxMpService { | |||||
| /** | /** | ||||
| * 统一下单(详见http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1) | * 统一下单(详见http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1) | ||||
| * 在发起微信支付前,需要调用统一下单接口,获取"预支付交易会话标识" | * 在发起微信支付前,需要调用统一下单接口,获取"预支付交易会话标识" | ||||
| * | |||||
| * | |||||
| * @param parameters | * @param parameters | ||||
| * All required/optional parameters for weixin payment | * All required/optional parameters for weixin payment | ||||
| * @return | * @return | ||||
| @@ -737,10 +737,10 @@ public interface WxMpService { | |||||
| * @param parameters | * @param parameters | ||||
| * the required or optional parameters | * the required or optional parameters | ||||
| * @return | * @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发起支付请求需要的参数 | * 该接口调用“统一下单”接口,并拼装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 | * 详见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 ip 发起支付的客户端IP | ||||
| * @param notifyUrl 通知地址 | * @param notifyUrl 通知地址 | ||||
| * @return | * @return | ||||
| * @throws WxErrorException | |||||
| * @throws WxErrorException | |||||
| * @deprecated Use me.chanjar.weixin.mp.api.WxMpService.getJSSDKPayInfo(Map<String, String>) instead | * @deprecated Use me.chanjar.weixin.mp.api.WxMpService.getJSSDKPayInfo(Map<String, String>) instead | ||||
| */ | */ | ||||
| @Deprecated | @Deprecated | ||||
| @@ -773,7 +773,7 @@ public interface WxMpService { | |||||
| * @return | * @return | ||||
| */ | */ | ||||
| WxMpPayCallback getJSSDKCallbackData(String xmlData); | WxMpPayCallback getJSSDKCallbackData(String xmlData); | ||||
| /** | /** | ||||
| * 微信支付-申请退款 | * 微信支付-申请退款 | ||||
| * 详见 https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_4 | * 详见 https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_4 | ||||
| @@ -784,10 +784,10 @@ public interface WxMpService { | |||||
| * <li/> total_fee | * <li/> total_fee | ||||
| * <li/> refund_fee | * <li/> refund_fee | ||||
| * @return 退款操作结果 | * @return 退款操作结果 | ||||
| * @throws WxErrorException | |||||
| * @throws WxErrorException | |||||
| */ | */ | ||||
| public WxMpPayRefundResult refundPay(Map<String, String> parameters) throws WxErrorException; | public WxMpPayRefundResult refundPay(Map<String, String> parameters) throws WxErrorException; | ||||
| /** | /** | ||||
| * <pre> | * <pre> | ||||
| * 计算Map键值对是否和签名相符, | * 计算Map键值对是否和签名相符, | ||||
| @@ -914,7 +914,7 @@ public interface WxMpService { | |||||
| */ | */ | ||||
| public void markCardCode(String code, String cardId, String openId, boolean isMark) throws | public void markCardCode(String code, String cardId, String openId, boolean isMark) throws | ||||
| WxErrorException; | 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 | * 详见 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 | * @throws WxErrorException | ||||
| */ | */ | ||||
| public String getCardDetail(String cardId) 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; | 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(WxMpMaterialFileBatchGetResult.WxMaterialFileBatchGetNewsItem.class, new WxMpMaterialFileBatchGetGsonItemAdapter()); | ||||
| INSTANCE.registerTypeAdapter(WxMpCardResult.class, new WxMpCardResultGsonAdapter()); | INSTANCE.registerTypeAdapter(WxMpCardResult.class, new WxMpCardResultGsonAdapter()); | ||||
| INSTANCE.registerTypeAdapter(WxMpCard.class, new WxMpCardGsonAdapter()); | INSTANCE.registerTypeAdapter(WxMpCard.class, new WxMpCardGsonAdapter()); | ||||
| INSTANCE.registerTypeAdapter(WxMpMassPreviewMessage.class, new WxMpMassPreviewMessageGsonAdapter()); | |||||
| } | } | ||||
| public static Gson create() { | 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; | |||||
| } | |||||
| } | |||||