From e9e7f6e46bd5a70309a6b592421a6cf461c21d02 Mon Sep 17 00:00:00 2001 From: Jeff Date: Fri, 17 May 2019 11:21:57 +0800 Subject: [PATCH] =?UTF-8?q?#1046=20=E4=BC=81=E4=B8=9A=E5=BE=AE=E4=BF=A1?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=94=AF=E6=8C=81=E6=9C=80=E6=96=B0=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E7=9A=84=E4=BB=BB=E5=8A=A1=E5=8D=A1=E7=89=87=E6=B6=88?= =?UTF-8?q?=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chanjar/weixin/common/api/WxConsts.java | 5 ++ .../java/me/chanjar/weixin/cp/WxCpConsts.java | 5 ++ .../me/chanjar/weixin/cp/api/WxCpService.java | 7 ++ .../weixin/cp/api/WxCpTaskCardService.java | 30 ++++++++ .../cp/api/impl/BaseWxCpServiceImpl.java | 6 ++ .../cp/api/impl/WxCpTaskCardServiceImpl.java | 39 ++++++++++ .../chanjar/weixin/cp/bean/WxCpMessage.java | 72 +++++++++++++++---- .../cp/bean/WxCpTaskCardUpdateResult.java | 42 +++++++++++ .../weixin/cp/bean/WxCpXmlMessage.java | 25 ++++--- .../bean/messagebuilder/TaskCardBuilder.java | 68 ++++++++++++++++++ .../cp/bean/taskcard/TaskCardButton.java | 23 ++++++ .../api/impl/WxCpTaskCardServiceImplTest.java | 65 +++++++++++++++++ .../weixin/cp/bean/WxCpMessageTest.java | 36 ++++++++-- .../weixin/cp/bean/WxCpXmlMessageTest.java | 28 +++++++- .../weixin/mp/bean/kefu/WxMpKefuMessage.java | 1 + 15 files changed, 420 insertions(+), 32 deletions(-) create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpTaskCardService.java create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpTaskCardServiceImpl.java create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpTaskCardUpdateResult.java create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/messagebuilder/TaskCardBuilder.java create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/taskcard/TaskCardButton.java create mode 100644 weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpTaskCardServiceImplTest.java diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java index 557d1fc10e..9af7811c82 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java @@ -88,6 +88,11 @@ public static class KefuMsgType { * 小程序卡片(要求小程序与公众号已关联) */ public static final String MINIPROGRAMPAGE = "miniprogrampage"; + + /** + * 任务卡片消息 + */ + public static final String TASKCARD = "taskcard"; } /** diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/WxCpConsts.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/WxCpConsts.java index 168bcf7492..87892eccdd 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/WxCpConsts.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/WxCpConsts.java @@ -84,6 +84,11 @@ public static class EventType { */ public static final String LOCATION_SELECT = "location_select"; + /** + * 任务卡片事件推送. + */ + public static final String TASKCARD_CLICK = "taskcard_click"; + } /** diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java index 732c1449ee..364723db87 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java @@ -301,6 +301,13 @@ public interface WxCpService { */ WxCpChatService getChatService(); + /** + * 获取任务卡片服务 + * + * @return 任务卡片服务 + */ + WxCpTaskCardService getTaskCardService(); + WxCpAgentService getAgentService(); WxCpOAService getOAService(); diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpTaskCardService.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpTaskCardService.java new file mode 100644 index 0000000000..038c2dd3bf --- /dev/null +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpTaskCardService.java @@ -0,0 +1,30 @@ +package me.chanjar.weixin.cp.api; + +import me.chanjar.weixin.common.error.WxErrorException; + +import java.util.List; + +/** + *
+ *  任务卡片管理接口.
+ *  Created by Jeff on 2019-05-16.
+ * 
+ * + * @author Jeff + * @date 2019-05-16 + */ +public interface WxCpTaskCardService { + /** + *
+   * 更新任务卡片消息状态
+   * 详情请见: https://work.weixin.qq.com/api/doc#90000/90135/91579
+   *
+   * 注意: 这个方法使用WxCpConfigStorage里的agentId
+   * 
+ * + * @param userIds 企业的成员ID列表 + * @param taskId 任务卡片ID + * @param clickedKey 已点击按钮的Key + */ + void update(List userIds, String taskId, String clickedKey) throws WxErrorException; +} diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImpl.java index 161c747c69..3eb99b79d2 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImpl.java @@ -46,6 +46,7 @@ public abstract class BaseWxCpServiceImpl implements WxCpService, RequestH private WxCpTagService tagService = new WxCpTagServiceImpl(this); private WxCpAgentService agentService = new WxCpAgentServiceImpl(this); private WxCpOAService oaService = new WxCpOAServiceImpl(this); + private WxCpTaskCardService taskCardService = new WxCpTaskCardServiceImpl(this); /** * 全局的是否正在刷新access token的锁 @@ -392,6 +393,11 @@ public WxCpOAService getOAService() { return oaService; } + @Override + public WxCpTaskCardService getTaskCardService() { + return taskCardService; + } + @Override public RequestHttp getRequestHttp() { return this; diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpTaskCardServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpTaskCardServiceImpl.java new file mode 100644 index 0000000000..3011320d50 --- /dev/null +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpTaskCardServiceImpl.java @@ -0,0 +1,39 @@ +package me.chanjar.weixin.cp.api.impl; + +import lombok.RequiredArgsConstructor; +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.common.util.json.WxGsonBuilder; +import me.chanjar.weixin.cp.api.WxCpService; +import me.chanjar.weixin.cp.api.WxCpTaskCardService; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + *
+ *  任务卡片管理接口.
+ *  Created by Jeff on 2019-05-16.
+ * 
+ * + * @author Jeff + * @date 2019-05-16 + */ +@RequiredArgsConstructor +public class WxCpTaskCardServiceImpl implements WxCpTaskCardService { + private final WxCpService mainService; + + @Override + public void update(List userIds, String taskId, String clickedKey) throws WxErrorException { + Integer agentId = this.mainService.getWxCpConfigStorage().getAgentId(); + + Map data = new HashMap<>(4); + data.put("userids", userIds); + data.put("agentid", agentId); + data.put("task_id", taskId); + data.put("clicked_key", clickedKey); + + String url = "https://qyapi.weixin.qq.com/cgi-bin/message/update_taskcard"; + this.mainService.post(url, WxGsonBuilder.create().toJson(data)); + } +} diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpMessage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpMessage.java index df90775b5e..a22efd0e45 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpMessage.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpMessage.java @@ -1,26 +1,18 @@ package me.chanjar.weixin.cp.bean; -import java.io.Serializable; -import java.util.ArrayList; -import java.util.List; - -import org.apache.commons.lang3.StringUtils; - import com.google.gson.JsonArray; import com.google.gson.JsonObject; import lombok.Data; import me.chanjar.weixin.common.api.WxConsts.KefuMsgType; import me.chanjar.weixin.cp.bean.article.MpnewsArticle; import me.chanjar.weixin.cp.bean.article.NewArticle; -import me.chanjar.weixin.cp.bean.messagebuilder.FileBuilder; -import me.chanjar.weixin.cp.bean.messagebuilder.ImageBuilder; -import me.chanjar.weixin.cp.bean.messagebuilder.MarkdownMsgBuilder; -import me.chanjar.weixin.cp.bean.messagebuilder.MpnewsBuilder; -import me.chanjar.weixin.cp.bean.messagebuilder.NewsBuilder; -import me.chanjar.weixin.cp.bean.messagebuilder.TextBuilder; -import me.chanjar.weixin.cp.bean.messagebuilder.TextCardBuilder; -import me.chanjar.weixin.cp.bean.messagebuilder.VideoBuilder; -import me.chanjar.weixin.cp.bean.messagebuilder.VoiceBuilder; +import me.chanjar.weixin.cp.bean.messagebuilder.*; +import me.chanjar.weixin.cp.bean.taskcard.TaskCardButton; +import org.apache.commons.lang3.StringUtils; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; /** * 消息. @@ -49,6 +41,12 @@ public class WxCpMessage implements Serializable { private List articles = new ArrayList<>(); private List mpnewsArticles = new ArrayList<>(); + /** + * 任务卡片特有的属性 + */ + private String taskId; + private List taskButtons = new ArrayList<>(); + /** * 获得文本消息builder. */ @@ -112,6 +110,13 @@ public static FileBuilder FILE() { return new FileBuilder(); } + /** + * 获得任务卡片消息builder. + */ + public static TaskCardBuilder TASKCARD() { + return new TaskCardBuilder(); + } + /** *
@@ -124,6 +129,7 @@ public static FileBuilder FILE() {
    * {@link KefuMsgType#NEWS}
    * {@link KefuMsgType#MPNEWS}
    * {@link KefuMsgType#MARKDOWN}
+   * {@link KefuMsgType#TASKCARD}
    * 
* * @param msgType 消息类型 @@ -249,6 +255,42 @@ private void handleMsgType(JsonObject messageJson) { messageJson.add("mpnews", newsJsonObject); break; } + case KefuMsgType.TASKCARD: { + JsonObject text = new JsonObject(); + text.addProperty("title", this.getTitle()); + text.addProperty("description", this.getDescription()); + + if (StringUtils.isNotBlank(this.getUrl())) { + text.addProperty("url", this.getUrl()); + } + + text.addProperty("task_id", this.getTaskId()); + + JsonArray buttonJsonArray = new JsonArray(); + for (TaskCardButton button : this.getTaskButtons()) { + JsonObject buttonJson = new JsonObject(); + buttonJson.addProperty("key", button.getKey()); + buttonJson.addProperty("name", button.getName()); + + if (StringUtils.isNotBlank(button.getReplaceName())) { + buttonJson.addProperty("replace_name", button.getReplaceName()); + } + + if (StringUtils.isNotBlank(button.getColor())) { + buttonJson.addProperty("color", button.getColor()); + } + + if (button.getBold() != null) { + buttonJson.addProperty("is_bold", button.getBold()); + } + + buttonJsonArray.add(buttonJson); + } + text.add("btn", buttonJsonArray); + + messageJson.add("taskcard", text); + break; + } default: { // do nothing } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpTaskCardUpdateResult.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpTaskCardUpdateResult.java new file mode 100644 index 0000000000..c86b255b44 --- /dev/null +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpTaskCardUpdateResult.java @@ -0,0 +1,42 @@ +package me.chanjar.weixin.cp.bean; + +import com.google.gson.annotations.SerializedName; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; + +import java.io.Serializable; +import java.util.List; + +/** + *
+ *  更新任务卡片消息状态的返回类
+ *  参考文档:https://work.weixin.qq.com/api/doc#90000/90135/91579
+ *  Created by Jeff on 2019-05-16.
+ * 
+ * + * @author Jeff + * @date 2019-05-16 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class WxCpTaskCardUpdateResult implements Serializable { + + @SerializedName("errcode") + private Integer errcode; + + @SerializedName("errmsg") + private String errmsg; + + /** + * 用户列表 + */ + @SerializedName("invaliduser") + private List invalidUsers; + + public static WxCpTaskCardUpdateResult fromJson(String json) { + return WxCpGsonBuilder.create().fromJson(json, WxCpTaskCardUpdateResult.class); + } +} diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlMessage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlMessage.java index 5a6a05293b..e6b2be197a 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlMessage.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlMessage.java @@ -1,18 +1,8 @@ package me.chanjar.weixin.cp.bean; -import java.io.IOException; -import java.io.InputStream; -import java.io.Serializable; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import com.thoughtworks.xstream.annotations.XStreamImplicit; -import org.apache.commons.io.IOUtils; - import com.thoughtworks.xstream.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamConverter; +import com.thoughtworks.xstream.annotations.XStreamImplicit; import lombok.Data; import lombok.extern.slf4j.Slf4j; import me.chanjar.weixin.common.api.WxConsts; @@ -22,6 +12,15 @@ import me.chanjar.weixin.cp.util.crypto.WxCpCryptUtil; import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; import me.chanjar.weixin.cp.util.xml.XStreamTransformer; +import org.apache.commons.io.IOUtils; + +import java.io.IOException; +import java.io.InputStream; +import java.io.Serializable; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; /** *
@@ -157,6 +156,10 @@ public class WxCpXmlMessage implements Serializable {
   @XStreamConverter(value = XStreamCDataConverter.class)
   private String recognition;
 
+  @XStreamAlias("TaskId")
+  @XStreamConverter(value = XStreamCDataConverter.class)
+  private String taskId;
+
   /**
    * 通讯录变更事件.
    * 请参考常量 me.chanjar.weixin.cp.WxCpConsts.ContactChangeType
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/messagebuilder/TaskCardBuilder.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/messagebuilder/TaskCardBuilder.java
new file mode 100644
index 0000000000..3c2d77924d
--- /dev/null
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/messagebuilder/TaskCardBuilder.java
@@ -0,0 +1,68 @@
+package me.chanjar.weixin.cp.bean.messagebuilder;
+
+import me.chanjar.weixin.common.api.WxConsts;
+import me.chanjar.weixin.cp.bean.WxCpMessage;
+import me.chanjar.weixin.cp.bean.taskcard.TaskCardButton;
+
+import java.util.List;
+
+/**
+ * 
+ * 任务卡片消息Builder
+ * 用法: WxCustomMessage m = WxCustomMessage.TASKCARD().title(...)....toUser(...).build();
+ * 
+ * + * @author Jeff + * @date 2019-05-16 + */ +public class TaskCardBuilder extends BaseBuilder { + private String title; + private String description; + private String url; + private String taskId; + /** + * 按钮个数为1~2个 + */ + private List buttons; + + public TaskCardBuilder() { + this.msgType = WxConsts.KefuMsgType.TASKCARD; + } + + public TaskCardBuilder title(String title) { + this.title = title; + return this; + } + + public TaskCardBuilder description(String description) { + this.description = description; + return this; + } + + public TaskCardBuilder url(String url) { + this.url = url; + return this; + } + + public TaskCardBuilder taskId(String taskId) { + this.taskId = taskId; + return this; + } + + public TaskCardBuilder buttons(List buttons) { + this.buttons = buttons; + return this; + } + + @Override + public WxCpMessage build() { + WxCpMessage m = super.build(); + m.setSafe(null); + m.setTitle(this.title); + m.setDescription(this.description); + m.setUrl(this.url); + m.setTaskId(this.taskId); + m.setTaskButtons(this.buttons); + return m; + } +} diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/taskcard/TaskCardButton.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/taskcard/TaskCardButton.java new file mode 100644 index 0000000000..0ffe49ce58 --- /dev/null +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/taskcard/TaskCardButton.java @@ -0,0 +1,23 @@ +package me.chanjar.weixin.cp.bean.taskcard; + +import lombok.Builder; +import lombok.Data; + +/** + *
+ *  任务卡片按钮
+ *  Created by Jeff on 2019-05-16.
+ * 
+ * + * @author Jeff + * @date 2019-05-16 + */ +@Data +@Builder +public class TaskCardButton { + private String key; + private String name; + private String replaceName; + private String color; + private Boolean bold; +} diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpTaskCardServiceImplTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpTaskCardServiceImplTest.java new file mode 100644 index 0000000000..be387548b9 --- /dev/null +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpTaskCardServiceImplTest.java @@ -0,0 +1,65 @@ +package me.chanjar.weixin.cp.api.impl; + +import com.google.inject.Inject; +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.cp.api.ApiTestModule; +import me.chanjar.weixin.cp.api.WxCpService; +import me.chanjar.weixin.cp.bean.WxCpMessage; +import me.chanjar.weixin.cp.bean.WxCpMessageSendResult; +import me.chanjar.weixin.cp.bean.taskcard.TaskCardButton; +import org.testng.annotations.Guice; +import org.testng.annotations.Test; + +import java.util.Arrays; + +import static org.testng.Assert.assertNotNull; + +/** + * 测试任务卡片服务 + * + * @author Jeff + * @date 2019-05-16 + */ +@Guice(modules = ApiTestModule.class) +public class WxCpTaskCardServiceImplTest { + + @Inject + private WxCpService wxCpService; + + @Test + public void testSendTaskCard() throws WxErrorException { + TaskCardButton btn1 = TaskCardButton.builder() + .key("key1") + .name("同意") + .replaceName("已同意") + .bold(true) + .build(); + TaskCardButton btn2 = TaskCardButton.builder() + .key("key2") + .name("拒绝") + .replaceName("已拒绝") + .color("red") + .build(); + WxCpMessage message = WxCpMessage.TASKCARD() + .toUser("jeff|mr.t") + .title("有一个待审批的请求") + .description("申请:购买图书\n金额:100 元") + .taskId("task_1") + .url("http://www.qq.com") + .buttons(Arrays.asList(btn1, btn2)) + .build(); + + WxCpMessageSendResult messageSendResult = this.wxCpService.messageSend(message); + assertNotNull(messageSendResult); + System.out.println(messageSendResult); + System.out.println(messageSendResult.getInvalidPartyList()); + System.out.println(messageSendResult.getInvalidUserList()); + System.out.println(messageSendResult.getInvalidTagList()); + } + + @Test + public void testUpdate() throws Exception { + wxCpService.getTaskCardService().update(Arrays.asList("jeff", "mr.t"), "task_1", "key1"); + } + +} diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpMessageTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpMessageTest.java index 344d1e8251..c54211758b 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpMessageTest.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpMessageTest.java @@ -1,9 +1,11 @@ package me.chanjar.weixin.cp.bean; -import org.testng.annotations.*; - import me.chanjar.weixin.cp.bean.article.MpnewsArticle; import me.chanjar.weixin.cp.bean.article.NewArticle; +import me.chanjar.weixin.cp.bean.taskcard.TaskCardButton; +import org.testng.annotations.Test; + +import java.util.Arrays; import static org.assertj.core.api.Assertions.assertThat; @@ -67,7 +69,7 @@ public void testNewsBuild() { WxCpMessage reply = WxCpMessage.NEWS().toUser("OPENID").addArticle(article1).addArticle(article2).build(); assertThat(reply.toJson()) - .isEqualTo( "{\"touser\":\"OPENID\",\"msgtype\":\"news\",\"news\":{\"articles\":" + + .isEqualTo("{\"touser\":\"OPENID\",\"msgtype\":\"news\",\"news\":{\"articles\":" + "[{\"title\":\"Happy Day\",\"description\":\"Is Really A Happy Day\",\"url\":\"URL\",\"picurl\":\"PIC_URL\"}," + "{\"title\":\"Happy Day\",\"description\":\"Is Really A Happy Day\",\"url\":\"URL\",\"picurl\":\"PIC_URL\"}]}," + "\"safe\":\"0\"}"); @@ -97,7 +99,7 @@ public void testMpnewsBuild_with_articles() { WxCpMessage reply = WxCpMessage.MPNEWS().toUser("OPENID").addArticle(article1, article2).build(); assertThat(reply.toJson()) - .isEqualTo( "{\"touser\":\"OPENID\",\"msgtype\":\"mpnews\",\"mpnews\":{\"articles\":" + + .isEqualTo("{\"touser\":\"OPENID\",\"msgtype\":\"mpnews\",\"mpnews\":{\"articles\":" + "[{\"title\":\"Happy Day\",\"thumb_media_id\":\"thumb\",\"author\":\"aaaaaa\"," + "\"content_source_url\":\"nice url\",\"content\":\"hahaha\",\"digest\":\"digest\",\"show_cover_pic\":\"heihei\"}" + ",{\"title\":\"Happy Day\",\"thumb_media_id\":\"thumb\",\"author\":\"aaaaaa\"," + @@ -112,4 +114,30 @@ public void testMpnewsBuild_with_media_id() { .isEqualTo("{\"touser\":\"OPENID\",\"msgtype\":\"mpnews\",\"mpnews\":{\"media_id\":\"mmm\"},\"safe\":\"0\"}"); } + public void testTaskCardBuilder() { + TaskCardButton button1 = TaskCardButton.builder() + .key("yes") + .name("批准") + .replaceName("已批准") + .color("blue") + .bold(true) + .build(); + TaskCardButton button2 = TaskCardButton.builder() + .key("yes") + .name("拒绝") + .replaceName("已拒绝") + .color("red") + .bold(false) + .build(); + WxCpMessage reply = WxCpMessage.TASKCARD().toUser("OPENID") + .title("任务卡片") + .description("有一条待处理任务") + .url("http://www.qq.com") + .taskId("task_123") + .buttons(Arrays.asList(button1, button2)) + .build(); + assertThat(reply.toJson()) + .isEqualTo("{\"touser\":\"OPENID\",\"msgtype\":\"taskcard\",\"taskcard\":{\"title\":\"任务卡片\",\"description\":\"有一条待处理任务\",\"url\":\"http://www.qq.com\",\"task_id\":\"task_123\",\"btn\":[{\"key\":\"yes\",\"name\":\"批准\",\"replace_name\":\"已批准\",\"color\":\"blue\",\"is_bold\":true},{\"key\":\"yes\",\"name\":\"拒绝\",\"replace_name\":\"已拒绝\",\"color\":\"red\",\"is_bold\":false}]}}"); + } + } diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpXmlMessageTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpXmlMessageTest.java index aaf4032427..89c0396e08 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpXmlMessageTest.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpXmlMessageTest.java @@ -1,9 +1,11 @@ package me.chanjar.weixin.cp.bean; import me.chanjar.weixin.common.api.WxConsts; -import org.testng.annotations.*; +import org.testng.annotations.Test; -import static org.testng.Assert.*; +import static me.chanjar.weixin.cp.WxCpConsts.EventType.TASKCARD_CLICK; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNotNull; @Test public class WxCpXmlMessageTest { @@ -149,4 +151,26 @@ public void testExtAttr() { assertEquals(wxMessage.getExtAttrs().getItems().get(0).getName(), "爱好"); } + + public void testTaskCardEvent() { + String xml = "" + + "" + + "" + + "123456789" + + "" + + "" + + "" + + "" + + "1" + + ""; + WxCpXmlMessage wxMessage = WxCpXmlMessage.fromXml(xml); + assertEquals(wxMessage.getToUserName(), "toUser"); + assertEquals(wxMessage.getFromUserName(), "FromUser"); + assertEquals(wxMessage.getCreateTime(), Long.valueOf(123456789L)); + assertEquals(wxMessage.getMsgType(), WxConsts.XmlMsgType.EVENT); + assertEquals(wxMessage.getAgentId(), Integer.valueOf(1)); + assertEquals(wxMessage.getEvent(), TASKCARD_CLICK); + assertEquals(wxMessage.getEventKey(), "key111"); + assertEquals(wxMessage.getTaskId(), "taskid111"); + } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/WxMpKefuMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/WxMpKefuMessage.java index 92c298a647..560add6042 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/WxMpKefuMessage.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/WxMpKefuMessage.java @@ -109,6 +109,7 @@ public static MiniProgramPageBuilder MINIPROGRAMPAGE() { * {@link WxConsts.KefuMsgType#MPNEWS} * {@link WxConsts.KefuMsgType#WXCARD} * {@link WxConsts.KefuMsgType#MINIPROGRAMPAGE} + * {@link WxConsts.KefuMsgType#TASKCARD} *
* */