Skip to content

Commit 183bdb2

Browse files
authored
🆕 binarywang#2142 【企业微信】被动回复消息内容新增任务卡片格式
1 parent c7c834b commit 183bdb2

File tree

8 files changed

+130
-13
lines changed

8 files changed

+130
-13
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ public static class XmlMsgType {
4444
public static final String DEVICE_STATUS = "device_status";
4545
public static final String HARDWARE = "hardware";
4646
public static final String TRANSFER_CUSTOMER_SERVICE = "transfer_customer_service";
47+
public static final String UPDATE_TASKCARD = "update_taskcard";
4748
}
4849

4950
/**

weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/XStreamInitializer.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,17 @@ public HierarchicalStreamWriter createWriter(Writer out) {
2828
private static final String SUFFIX_CDATA = "]]>";
2929
private static final String PREFIX_MEDIA_ID = "<MediaId>";
3030
private static final String SUFFIX_MEDIA_ID = "</MediaId>";
31+
private static final String PREFIX_REPLACE_NAME = "<ReplaceName>";
32+
private static final String SUFFIX_REPLACE_NAME = "</ReplaceName>";
3133

3234
@Override
3335
protected void writeText(QuickWriter writer, String text) {
3436
if (text.startsWith(PREFIX_CDATA) && text.endsWith(SUFFIX_CDATA)) {
3537
writer.write(text);
3638
} else if (text.startsWith(PREFIX_MEDIA_ID) && text.endsWith(SUFFIX_MEDIA_ID)) {
3739
writer.write(text);
40+
} else if (text.startsWith(PREFIX_REPLACE_NAME) && text.endsWith(SUFFIX_REPLACE_NAME)){
41+
writer.write(text);
3842
} else {
3943
super.writeText(writer, text);
4044
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package me.chanjar.weixin.common.util.xml;
2+
3+
public class XStreamReplaceNameConverter extends XStreamCDataConverter {
4+
@Override
5+
public String toString(Object obj) {
6+
return "<ReplaceName>" + super.toString(obj) + "</ReplaceName>";
7+
}
8+
}

weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpXmlOutMessage.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,7 @@
66
import com.thoughtworks.xstream.annotations.XStreamConverter;
77
import lombok.Data;
88
import me.chanjar.weixin.common.util.xml.XStreamCDataConverter;
9-
import me.chanjar.weixin.cp.bean.outxmlbuilder.ImageBuilder;
10-
import me.chanjar.weixin.cp.bean.outxmlbuilder.NewsBuilder;
11-
import me.chanjar.weixin.cp.bean.outxmlbuilder.TextBuilder;
12-
import me.chanjar.weixin.cp.bean.outxmlbuilder.VideoBuilder;
13-
import me.chanjar.weixin.cp.bean.outxmlbuilder.VoiceBuilder;
9+
import me.chanjar.weixin.cp.bean.outxmlbuilder.*;
1410
import me.chanjar.weixin.cp.config.WxCpConfigStorage;
1511
import me.chanjar.weixin.cp.util.crypto.WxCpCryptUtil;
1612
import me.chanjar.weixin.cp.util.xml.XStreamTransformer;
@@ -76,6 +72,12 @@ public static NewsBuilder NEWS() {
7672
return new NewsBuilder();
7773
}
7874

75+
/**
76+
* 获得任务卡片消息builder.
77+
*/
78+
public static TaskCardBuilder TASK_CARD() {
79+
return new TaskCardBuilder();
80+
}
7981
protected String toXml() {
8082
return XStreamTransformer.toXml((Class) this.getClass(), this);
8183
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package me.chanjar.weixin.cp.bean.message;
2+
3+
import com.thoughtworks.xstream.annotations.XStreamAlias;
4+
import com.thoughtworks.xstream.annotations.XStreamConverter;
5+
import lombok.Data;
6+
import lombok.EqualsAndHashCode;
7+
import me.chanjar.weixin.common.api.WxConsts;
8+
import me.chanjar.weixin.common.util.xml.XStreamReplaceNameConverter;
9+
10+
@XStreamAlias("xml")
11+
@Data
12+
@EqualsAndHashCode(callSuper = false)
13+
public class WxCpXmlOutTaskCardMessage extends WxCpXmlOutMessage {
14+
private static final long serialVersionUID = 7028014900972827324L;
15+
16+
@XStreamAlias("TaskCard")
17+
@XStreamConverter(value = XStreamReplaceNameConverter.class)
18+
private String replaceName;
19+
20+
public WxCpXmlOutTaskCardMessage() {
21+
this.msgType = WxConsts.XmlMsgType.UPDATE_TASKCARD;
22+
}
23+
24+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package me.chanjar.weixin.cp.bean.outxmlbuilder;
2+
3+
import me.chanjar.weixin.cp.bean.message.WxCpXmlOutTaskCardMessage;
4+
5+
/**
6+
* 任务卡片消息builder
7+
*
8+
* @author tao zhang
9+
*/
10+
public final class TaskCardBuilder extends BaseBuilder<TaskCardBuilder, WxCpXmlOutTaskCardMessage> {
11+
12+
private String replaceName;
13+
14+
public TaskCardBuilder replaceName(String replaceName) {
15+
this.replaceName = replaceName;
16+
return this;
17+
}
18+
19+
@Override
20+
public WxCpXmlOutTaskCardMessage build() {
21+
WxCpXmlOutTaskCardMessage m = new WxCpXmlOutTaskCardMessage();
22+
setCommon(m);
23+
m.setReplaceName(this.replaceName);
24+
return m;
25+
}
26+
27+
}

weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/xml/XStreamTransformer.java

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,8 @@
66

77
import com.thoughtworks.xstream.XStream;
88
import me.chanjar.weixin.common.util.xml.XStreamInitializer;
9-
import me.chanjar.weixin.cp.bean.message.WxCpTpXmlMessage;
9+
import me.chanjar.weixin.cp.bean.message.*;
1010
import me.chanjar.weixin.cp.bean.WxCpTpXmlPackage;
11-
import me.chanjar.weixin.cp.bean.message.WxCpXmlMessage;
12-
import me.chanjar.weixin.cp.bean.message.WxCpXmlOutImageMessage;
13-
import me.chanjar.weixin.cp.bean.message.WxCpXmlOutMessage;
14-
import me.chanjar.weixin.cp.bean.message.WxCpXmlOutNewsMessage;
15-
import me.chanjar.weixin.cp.bean.message.WxCpXmlOutTextMessage;
16-
import me.chanjar.weixin.cp.bean.message.WxCpXmlOutVideoMessage;
17-
import me.chanjar.weixin.cp.bean.message.WxCpXmlOutVoiceMessage;
1811

1912
public class XStreamTransformer {
2013

@@ -60,6 +53,7 @@ private static Map<Class, XStream> configXStreamInstance() {
6053
map.put(WxCpXmlOutImageMessage.class, configWxCpXmlOutImageMessage());
6154
map.put(WxCpXmlOutVideoMessage.class, configWxCpXmlOutVideoMessage());
6255
map.put(WxCpXmlOutVoiceMessage.class, configWxCpXmlOutVoiceMessage());
56+
map.put(WxCpXmlOutTaskCardMessage.class, configWxCpXmlOutTaskCardMessage());
6357
map.put(WxCpTpXmlPackage.class, configWxCpTpXmlPackage());
6458
map.put(WxCpTpXmlMessage.class, configWxCpTpXmlMessage());
6559
return map;
@@ -118,6 +112,14 @@ private static XStream configWxCpXmlOutVoiceMessage() {
118112
return xstream;
119113
}
120114

115+
private static XStream configWxCpXmlOutTaskCardMessage() {
116+
XStream xstream = XStreamInitializer.getInstance();
117+
118+
xstream.processAnnotations(WxCpXmlOutMessage.class);
119+
xstream.processAnnotations(WxCpXmlOutTaskCardMessage.class);
120+
return xstream;
121+
}
122+
121123
private static XStream configWxCpTpXmlPackage() {
122124
XStream xstream = XStreamInitializer.getInstance();
123125
xstream.processAnnotations(WxCpTpXmlPackage.class);
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package me.chanjar.weixin.cp.bean.message;
2+
3+
import me.chanjar.weixin.cp.bean.message.WxCpXmlOutTaskCardMessage;
4+
import org.testng.Assert;
5+
import org.testng.annotations.Test;
6+
7+
@Test
8+
public class WxCpXmlOutTaskCardMessageTest {
9+
10+
public void test() {
11+
WxCpXmlOutTaskCardMessage m = new WxCpXmlOutTaskCardMessage();
12+
m.setReplaceName("已驳回");
13+
m.setCreateTime(1122L);
14+
m.setFromUserName("from");
15+
m.setToUserName("to");
16+
17+
String expected = "<xml>"
18+
+ "<ToUserName><![CDATA[to]]></ToUserName>"
19+
+ "<FromUserName><![CDATA[from]]></FromUserName>"
20+
+ "<CreateTime>1122</CreateTime>"
21+
+ "<MsgType><![CDATA[update_taskcard]]></MsgType>"
22+
+ "<TaskCard><ReplaceName><![CDATA[已驳回]]></ReplaceName></TaskCard>"
23+
+ "</xml>";
24+
System.out.println(m.toXml());
25+
Assert.assertEquals(m.toXml().replaceAll("\\s", ""), expected.replaceAll("\\s", ""));
26+
}
27+
28+
public void testBuild() {
29+
WxCpXmlOutTaskCardMessage m = WxCpXmlOutMessage.TASK_CARD().replaceName("已驳回").fromUser("from").toUser("to").build();
30+
String expected = "<xml>"
31+
+ "<ToUserName><![CDATA[to]]></ToUserName>"
32+
+ "<FromUserName><![CDATA[from]]></FromUserName>"
33+
+ "<CreateTime>1122</CreateTime>"
34+
+ "<MsgType><![CDATA[update_taskcard]]></MsgType>"
35+
+ "<TaskCard><ReplaceName><![CDATA[已驳回]]></ReplaceName></TaskCard>"
36+
+ "</xml>";
37+
System.out.println(m.toXml());
38+
Assert.assertEquals(
39+
m
40+
.toXml()
41+
.replaceAll("\\s", "")
42+
.replaceAll("<CreateTime>.*?</CreateTime>", ""),
43+
expected
44+
.replaceAll("\\s", "")
45+
.replaceAll("<CreateTime>.*?</CreateTime>", "")
46+
);
47+
}
48+
49+
}

0 commit comments

Comments
 (0)