浏览代码

#1075 企业微信支持推送小程序通知消息

Binary Wang 6 年之前
父节点
当前提交
a4f5aa341b

+ 5 - 0
weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java

@@ -98,6 +98,11 @@ public class WxConsts {
      * 菜单消息.
      */
     public static final String MSGMENU = "msgmenu";
+
+    /**
+     * 小程序通知消息.
+     */
+    public static final String MINIPROGRAM_NOTICE = "miniprogram_notice";
   }
 
   /**

+ 46 - 12
weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpMessage.java

@@ -8,11 +8,15 @@ import me.chanjar.weixin.cp.bean.article.MpnewsArticle;
 import me.chanjar.weixin.cp.bean.article.NewArticle;
 import me.chanjar.weixin.cp.bean.messagebuilder.*;
 import me.chanjar.weixin.cp.bean.taskcard.TaskCardButton;
+import me.chanjar.weixin.cp.constant.WxCpConsts;
 import org.apache.commons.lang3.StringUtils;
 
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
+
+import static me.chanjar.weixin.common.api.WxConsts.KefuMsgType.*;
 
 /**
  * 消息.
@@ -40,9 +44,13 @@ public class WxCpMessage implements Serializable {
   private String btnTxt;
   private List<NewArticle> articles = new ArrayList<>();
   private List<MpnewsArticle> mpnewsArticles = new ArrayList<>();
+  private String appId;
+  private String page;
+  private Boolean emphasisFirstItem;
+  private Map<String, String> contentItems;
 
   /**
-   * 任务卡片特有的属性
+   * 任务卡片特有的属性.
    */
   private String taskId;
   private List<TaskCardButton> taskButtons = new ArrayList<>();
@@ -117,10 +125,16 @@ public class WxCpMessage implements Serializable {
     return new TaskCardBuilder();
   }
 
+  /**
+   * 获得小程序通知消息builder.
+   */
+  public static MiniProgramNoticeMsgBuilder newMiniProgramNoticeBuilder() {
+    return new MiniProgramNoticeMsgBuilder();
+  }
 
   /**
    * <pre>
-   * 请使用
+   * 请使用.
    * {@link KefuMsgType#TEXT}
    * {@link KefuMsgType#IMAGE}
    * {@link KefuMsgType#VOICE}
@@ -130,6 +144,7 @@ public class WxCpMessage implements Serializable {
    * {@link KefuMsgType#MPNEWS}
    * {@link KefuMsgType#MARKDOWN}
    * {@link KefuMsgType#TASKCARD}
+   * {@link KefuMsgType#MINIPROGRAM_NOTICE}
    * </pre>
    *
    * @param msgType 消息类型
@@ -169,19 +184,19 @@ public class WxCpMessage implements Serializable {
 
   private void handleMsgType(JsonObject messageJson) {
     switch (this.getMsgType()) {
-      case KefuMsgType.TEXT: {
+      case TEXT: {
         JsonObject text = new JsonObject();
         text.addProperty("content", this.getContent());
         messageJson.add("text", text);
         break;
       }
-      case KefuMsgType.MARKDOWN: {
+      case MARKDOWN: {
         JsonObject text = new JsonObject();
         text.addProperty("content", this.getContent());
         messageJson.add("markdown", text);
         break;
       }
-      case KefuMsgType.TEXTCARD: {
+      case TEXTCARD: {
         JsonObject text = new JsonObject();
         text.addProperty("title", this.getTitle());
         text.addProperty("description", this.getDescription());
@@ -190,25 +205,25 @@ public class WxCpMessage implements Serializable {
         messageJson.add("textcard", text);
         break;
       }
-      case KefuMsgType.IMAGE: {
+      case IMAGE: {
         JsonObject image = new JsonObject();
         image.addProperty("media_id", this.getMediaId());
         messageJson.add("image", image);
         break;
       }
-      case KefuMsgType.FILE: {
+      case FILE: {
         JsonObject image = new JsonObject();
         image.addProperty("media_id", this.getMediaId());
         messageJson.add("file", image);
         break;
       }
-      case KefuMsgType.VOICE: {
+      case VOICE: {
         JsonObject voice = new JsonObject();
         voice.addProperty("media_id", this.getMediaId());
         messageJson.add("voice", voice);
         break;
       }
-      case KefuMsgType.VIDEO: {
+      case VIDEO: {
         JsonObject video = new JsonObject();
         video.addProperty("media_id", this.getMediaId());
         video.addProperty("thumb_media_id", this.getThumbMediaId());
@@ -217,7 +232,7 @@ public class WxCpMessage implements Serializable {
         messageJson.add("video", video);
         break;
       }
-      case KefuMsgType.NEWS: {
+      case NEWS: {
         JsonObject newsJsonObject = new JsonObject();
         JsonArray articleJsonArray = new JsonArray();
         for (NewArticle article : this.getArticles()) {
@@ -232,7 +247,7 @@ public class WxCpMessage implements Serializable {
         messageJson.add("news", newsJsonObject);
         break;
       }
-      case KefuMsgType.MPNEWS: {
+      case MPNEWS: {
         JsonObject newsJsonObject = new JsonObject();
         if (this.getMediaId() != null) {
           newsJsonObject.addProperty("media_id", this.getMediaId());
@@ -255,7 +270,7 @@ public class WxCpMessage implements Serializable {
         messageJson.add("mpnews", newsJsonObject);
         break;
       }
-      case KefuMsgType.TASKCARD: {
+      case TASKCARD: {
         JsonObject text = new JsonObject();
         text.addProperty("title", this.getTitle());
         text.addProperty("description", this.getDescription());
@@ -291,6 +306,25 @@ public class WxCpMessage implements Serializable {
         messageJson.add("taskcard", text);
         break;
       }
+      case MINIPROGRAM_NOTICE: {
+        JsonObject notice = new JsonObject();
+        notice.addProperty("appid", this.getAppId());
+        notice.addProperty("page", this.getPage());
+        notice.addProperty("description", this.getDescription());
+        notice.addProperty("title", this.getTitle());
+        notice.addProperty("emphasis_first_item", this.getEmphasisFirstItem());
+        JsonArray content = new JsonArray();
+        for (Map.Entry<String, String> item : this.getContentItems().entrySet()) {
+          JsonObject articleJson = new JsonObject();
+          articleJson.addProperty("key", item.getKey());
+          articleJson.addProperty("value", item.getValue());
+          content.add(articleJson);
+        }
+        notice.add("content_item", content);
+
+        messageJson.add("miniprogram_notice", notice);
+        break;
+      }
       default: {
         // do nothing
       }

+ 69 - 0
weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/messagebuilder/MiniProgramNoticeMsgBuilder.java

@@ -0,0 +1,69 @@
+package me.chanjar.weixin.cp.bean.messagebuilder;
+
+import me.chanjar.weixin.common.api.WxConsts;
+import me.chanjar.weixin.cp.bean.WxCpMessage;
+
+import java.util.Map;
+
+/**
+ * <pre>
+ * miniprogram_notice 类型的消息 builder
+ * Created by Binary Wang on 2019/6/16.
+ * </pre>
+ *
+ * @author <a href="https://github.com/binarywang">Binary Wang</a>
+ */
+public class MiniProgramNoticeMsgBuilder extends BaseBuilder<MiniProgramNoticeMsgBuilder> {
+  private String title;
+  private String description;
+  private String appId;
+  private String page;
+  private Boolean emphasisFirstItem;
+  private Map<String, String> contentItems;
+
+  public MiniProgramNoticeMsgBuilder() {
+    this.msgType = WxConsts.KefuMsgType.MINIPROGRAM_NOTICE;
+  }
+
+  public MiniProgramNoticeMsgBuilder appId(String appId) {
+    this.appId = appId;
+    return this;
+  }
+
+  public MiniProgramNoticeMsgBuilder page(String page) {
+    this.page = page;
+    return this;
+  }
+
+  public MiniProgramNoticeMsgBuilder title(String title) {
+    this.title = title;
+    return this;
+  }
+
+  public MiniProgramNoticeMsgBuilder description(String description) {
+    this.description = description;
+    return this;
+  }
+
+  public MiniProgramNoticeMsgBuilder contentItems(Map<String, String> contentItems) {
+    this.contentItems = contentItems;
+    return this;
+  }
+
+  public MiniProgramNoticeMsgBuilder emphasisFirstItem(Boolean emphasisFirstItem) {
+    this.emphasisFirstItem = emphasisFirstItem;
+    return this;
+  }
+
+  @Override
+  public WxCpMessage build() {
+    WxCpMessage m = super.build();
+    m.setContentItems(this.contentItems);
+    m.setAppId(this.appId);
+    m.setDescription(this.description);
+    m.setTitle(this.title);
+    m.setEmphasisFirstItem(this.emphasisFirstItem);
+    m.setPage(this.page);
+    return m;
+  }
+}

+ 24 - 0
weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpMessageAPITest.java

@@ -1,5 +1,6 @@
 package me.chanjar.weixin.cp.api;
 
+import com.google.common.collect.ImmutableMap;
 import org.testng.annotations.*;
 
 import com.google.inject.Inject;
@@ -107,4 +108,27 @@ public class WxCpMessageAPITest {
     System.out.println(messageSendResult.getInvalidUserList());
     System.out.println(messageSendResult.getInvalidTagList());
   }
+
+  @Test
+  public void testSendMessage_miniprogram_notice() throws WxErrorException {
+    WxCpMessage message = WxCpMessage
+      .newMiniProgramNoticeBuilder()
+      .toUser(configStorage.getUserId())
+      .appId("wx123123123123123")
+      .page("pages/index?userid=zhangsan&orderid=123123123")
+      .title("会议室预订成功通知")
+      .description("4月27日 16:16")
+      .emphasisFirstItem(true)
+      .contentItems(ImmutableMap.of("会议室","402",
+        "会议地点","广州TIT-402会议室",
+        "会议时间","2018年8月1日 09:00-09:30"))
+      .build();
+
+    WxCpMessageSendResult messageSendResult = this.wxService.messageSend(message);
+    assertNotNull(messageSendResult);
+    System.out.println(messageSendResult);
+    System.out.println(messageSendResult.getInvalidPartyList());
+    System.out.println(messageSendResult.getInvalidUserList());
+    System.out.println(messageSendResult.getInvalidTagList());
+  }
 }