Browse Source

#1099 优化客服消息接口菜单消息实现

billytomato 5 years ago
parent
commit
b3462243e5

+ 8 - 2
weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/WxMpKefuMessage.java

@@ -32,10 +32,10 @@ public class WxMpKefuMessage implements Serializable {
   private String mpNewsMediaId;
   private String miniProgramAppId;
   private String miniProgramPagePath;
-  private List<WxArticle> articles = new ArrayList<>();
-
   private String headContent;
   private String tailContent;
+  private List<WxArticle> articles = new ArrayList<>();
+  private List<WxMsgMenu> list = new ArrayList<>();
   /**
    * 菜单消息里的菜单内容.
    * 请使用逗号分割的形式将id和content连起来放在数组的里面
@@ -145,4 +145,10 @@ public class WxMpKefuMessage implements Serializable {
     private String url;
     private String picUrl;
   }
+
+  @Data
+  public static class WxMsgMenu implements Serializable {
+    private String id;
+    private String content;
+  }
 }

+ 25 - 14
weixin-java-mp/src/main/java/me/chanjar/weixin/mp/builder/kefu/WxMsgMenuBuilder.java

@@ -3,30 +3,37 @@ package me.chanjar.weixin.mp.builder.kefu;
 import me.chanjar.weixin.common.api.WxConsts;
 import me.chanjar.weixin.mp.bean.kefu.WxMpKefuMessage;
 
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
 /**
- * 卡券消息builder
+ * 菜单消息builder
  * <pre>
- * 用法: WxMpKefuMessage m = WxMpKefuMessage.WXCARD().cardId(...).toUser(...).build();
+ * 用法:
+ * WxMpKefuMessage m = WxMpKefuMessage.MSGMENU().addList(lists).headContent(headContent).tailContent(tailContent).toUser(...).build();
  * </pre>
  *
- * @author <a href="https://github.com/binarywang">Binary Wang</a>
+ * @author billytomato
  */
 public final class WxMsgMenuBuilder extends BaseBuilder<WxMsgMenuBuilder> {
+  private List<WxMpKefuMessage.WxMsgMenu> list = new ArrayList<>();
   private String headContent;
   private String tailContent;
-  private String[] msgMenuList;
+
 
   public WxMsgMenuBuilder() {
     this.msgType = WxConsts.KefuMsgType.MSGMENU;
   }
 
-  @Override
-  public WxMpKefuMessage build() {
-    WxMpKefuMessage m = super.build();
-    m.setHeadContent(this.headContent);
-    m.setMsgMenuList(this.msgMenuList);
-    m.setTailContent(this.tailContent);
-    return m;
+  public WxMsgMenuBuilder addList(WxMpKefuMessage.WxMsgMenu... list) {
+    Collections.addAll(this.list, list);
+    return this;
+  }
+
+  public WxMsgMenuBuilder list(List<WxMpKefuMessage.WxMsgMenu> list) {
+    this.list = list;
+    return this;
   }
 
   public WxMsgMenuBuilder headContent(String headContent) {
@@ -39,8 +46,12 @@ public final class WxMsgMenuBuilder extends BaseBuilder<WxMsgMenuBuilder> {
     return this;
   }
 
-  public WxMsgMenuBuilder msgMenuList(String... msgMenuList) {
-    this.msgMenuList = msgMenuList;
-    return this;
+  @Override
+  public WxMpKefuMessage build() {
+    WxMpKefuMessage m = super.build();
+    m.setHeadContent(this.headContent);
+    m.setTailContent(this.tailContent);
+    m.setList(this.list);
+    return m;
   }
 }

+ 12 - 13
weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpKefuMessageGsonAdapter.java

@@ -81,19 +81,18 @@ public class WxMpKefuMessageGsonAdapter implements JsonSerializer<WxMpKefuMessag
         messageJson.add("miniprogrampage", miniProgramPage);
         break;
       case KefuMsgType.MSGMENU: {
-        JsonObject msgMenu = new JsonObject();
-        JsonArray array = new JsonArray();
-        for (String s : message.getMsgMenuList()) {
-          JsonObject innerJson = new JsonObject();
-          final String[] split = s.split(",");
-          innerJson.addProperty("id", split[0]);
-          innerJson.addProperty("content", split[1]);
-          array.add(innerJson);
-        }
-        msgMenu.addProperty("head_content", message.getHeadContent());
-        msgMenu.add("list", array);
-        msgMenu.addProperty("tail_content", message.getTailContent());
-        messageJson.add("msgmenu", msgMenu);
+          JsonObject msgmenuJsonObject = new JsonObject();
+          JsonArray listJsonArray = new JsonArray();
+          for (WxMpKefuMessage.WxMsgMenu list : message.getList()) {
+            JsonObject listJson = new JsonObject();
+            listJson.addProperty("id", list.getId());
+            listJson.addProperty("content", list.getContent());
+            listJsonArray.add(listJson);
+          }
+          msgmenuJsonObject.addProperty("head_content",message.getHeadContent());
+          msgmenuJsonObject.add("list", listJsonArray);
+          msgmenuJsonObject.addProperty("tail_content",message.getTailContent());
+          messageJson.add("msgmenu", msgmenuJsonObject);
         break;
       }
       default: {

+ 14 - 5
weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/kefu/WxMpKefuMessageTest.java

@@ -156,15 +156,24 @@ public class WxMpKefuMessageTest {
   }
 
   public void testMsgMenuBuild() {
+
+    WxMpKefuMessage.WxMsgMenu wxMsgMenu1=new WxMpKefuMessage.WxMsgMenu();
+    wxMsgMenu1.setId("101");
+    wxMsgMenu1.setContent("msgmenu1");
+
+    WxMpKefuMessage.WxMsgMenu wxMsgMenu2=new WxMpKefuMessage.WxMsgMenu();
+    wxMsgMenu2.setId("102");
+    wxMsgMenu2.setContent("msgmenu2");
+
     WxMpKefuMessage reply = WxMpKefuMessage.MSGMENU()
       .toUser("OPENID")
-      .msgMenuList("101,满意", "102,不满意")
-      .headContent("您对本次服务是否满意呢?")
-      .tailContent("欢迎再次光临")
+      .addList(wxMsgMenu1).addList(wxMsgMenu2)
+      .headContent("head_content")
+      .tailContent("tail_content")
       .build();
 
-    assertThat(reply.toJson())
-      .isEqualTo("{\"touser\":\"OPENID\",\"msgtype\":\"msgmenu\",\"msgmenu\":{\"head_content\":\"您对本次服务是否满意呢?\",\"list\":[{\"id\":\"101\",\"content\":\"满意\"},{\"id\":\"102\",\"content\":\"不满意\"}],\"tail_content\":\"欢迎再次光临\"}}");
+    Assert.assertEquals(reply.toJson(),
+      "{\"touser\":\"OPENID\",\"msgtype\":\"msgmenu\",\"msgmenu\":{\"head_content\":\"head_content\",\"list\":[{\"id\":\"101\",\"content\":\"msgmenu1\"},{\"id\":\"102\",\"content\":\"msgmenu2\"}],\"tail_content\":\"tail_content\"}}");
   }
 
 }