From 83e443b02f51874b110799a38b68fe9a891a7a72 Mon Sep 17 00:00:00 2001 From: miller Date: Wed, 1 Jun 2016 10:39:10 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B6=88=E6=81=AF=E7=BE=A4=E5=8F=91=E7=9A=84?= =?UTF-8?q?=E9=A2=84=E8=A7=88=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../me/chanjar/weixin/mp/api/WxMpService.java | 33 ++++++--- .../weixin/mp/api/WxMpServiceImpl.java | 7 ++ .../mp/bean/WxMpMassPreviewMessage.java | 68 +++++++++++++++++++ .../weixin/mp/util/json/WxMpGsonBuilder.java | 1 + .../WxMpMassPreviewMessageGsonAdapter.java | 48 +++++++++++++ 5 files changed, 146 insertions(+), 11 deletions(-) create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassPreviewMessage.java create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassPreviewMessageGsonAdapter.java diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java index 16ca6bca26..162ef6894f 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java @@ -351,7 +351,7 @@ public interface WxMpService { * @throws WxErrorException */ public void menuDelete(String menuid) throws WxErrorException; - + /** *
    * 自定义菜单查询接口
@@ -361,7 +361,7 @@ public interface WxMpService {
    * @throws WxErrorException
    */
   public WxMenu menuGet() throws WxErrorException;
-  
+
   /**
    * 
    * 测试个性化菜单匹配结果
@@ -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 getJSSDKPayInfo(Map parameters) throws WxErrorException;  	
-  	
+  Map getJSSDKPayInfo(Map 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) 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 {
      *        
  • total_fee *
  • refund_fee * @return 退款操作结果 - * @throws WxErrorException + * @throws WxErrorException */ public WxMpPayRefundResult refundPay(Map parameters) throws WxErrorException; - + /** *
          * 计算Map键值对是否和签名相符,
    @@ -914,7 +914,7 @@ public WxMpCardResult queryCardCode(String cardId, String code, boolean checkCon
          */
       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 void markCardCode(String code, String cardId, String openId, boolean isMa
        * @throws WxErrorException
        */
       public String getCardDetail(String cardId) throws WxErrorException;
    +
    +  /*
    +     * 
    +     * 预览接口
    +     * 详情请见: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
    +     * 
    + * @param wxMpMassPreviewMessage + * @return wxMpMassSendResult + * @throws WxErrorException + */ + public WxMpMassSendResult massMessagePreview(WxMpMassPreviewMessage wxMpMassPreviewMessage) throws Exception; } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpServiceImpl.java index 1805b27107..e2d6875219 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpServiceImpl.java @@ -1259,4 +1259,11 @@ public String getCardDetail(String cardId) throws WxErrorException { 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); + } + } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassPreviewMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassPreviewMessage.java new file mode 100644 index 0000000000..154195dbb7 --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassPreviewMessage.java @@ -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; + } + + /** + *
    +   * 请使用
    +   * {@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不匹配的话,会返回系统繁忙的错误
    +   * 
    + * + * @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); + } +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpGsonBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpGsonBuilder.java index 316f22f546..4458bf62a4 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpGsonBuilder.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpGsonBuilder.java @@ -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() { diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassPreviewMessageGsonAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassPreviewMessageGsonAdapter.java new file mode 100644 index 0000000000..fd3e52df3e --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassPreviewMessageGsonAdapter.java @@ -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 { + @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; + } +}