Skip to content

Commit 22344eb

Browse files
committed
binarywang#256 企业微信发送消息增加文本卡片消息的支持
1 parent 131402f commit 22344eb

File tree

7 files changed

+85
-66
lines changed

7 files changed

+85
-66
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
@@ -35,6 +35,7 @@ public class WxConsts {
3535
public static final String CUSTOM_MSG_NEWS = "news";//图文消息(点击跳转到外链)
3636
public static final String CUSTOM_MSG_MPNEWS = "mpnews";//图文消息(点击跳转到图文消息页面)
3737
public static final String CUSTOM_MSG_FILE = "file";//发送文件(CP专用)
38+
public static final String CUSTOM_MSG_TEXTCARD = "textcard";//文本卡片消息(CP专用)
3839
public static final String CUSTOM_MSG_WXCARD = "wxcard";//卡券消息
3940
public static final String CUSTOM_MSG_TRANSFER_CUSTOMER_SERVICE = "transfer_customer_service";
4041
public static final String CUSTOM_MSG_SAFE_NO = "0";

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ public class WxCpMessage implements Serializable {
3030
private String musicUrl;
3131
private String hqMusicUrl;
3232
private String safe;
33+
private String url;
3334
private List<NewArticle> articles = new ArrayList<>();
3435
private List<MpnewsArticle> mpnewsArticles = new ArrayList<>();
3536

@@ -40,6 +41,13 @@ public static TextBuilder TEXT() {
4041
return new TextBuilder();
4142
}
4243

44+
/**
45+
* 获得文本卡片消息builder
46+
*/
47+
public static TextCardBuilder TEXTCARD() {
48+
return new TextCardBuilder();
49+
}
50+
4351
/**
4452
* 获得图片消息builder
4553
*/
@@ -220,4 +228,11 @@ public String toJson() {
220228
return WxCpGsonBuilder.INSTANCE.create().toJson(this);
221229
}
222230

231+
public String getUrl() {
232+
return this.url;
233+
}
234+
235+
public void setUrl(String url) {
236+
this.url = url;
237+
}
223238
}

weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/messagebuilder/BaseBuilder.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import me.chanjar.weixin.common.api.WxConsts;
44
import me.chanjar.weixin.cp.bean.WxCpMessage;
5+
import org.apache.commons.lang3.StringUtils;
56

67
public class BaseBuilder<T> {
78
protected String msgType;
@@ -43,8 +44,7 @@ public WxCpMessage build() {
4344
m.setToUser(this.toUser);
4445
m.setToParty(this.toParty);
4546
m.setToTag(this.toTag);
46-
m.setSafe(
47-
(this.safe == null || "".equals(this.safe)) ? WxConsts.CUSTOM_MSG_SAFE_NO : this.safe);
47+
m.setSafe(StringUtils.defaultIfBlank(this.safe, WxConsts.CUSTOM_MSG_SAFE_NO));
4848
return m;
4949
}
5050

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package me.chanjar.weixin.cp.bean.messagebuilder;
2+
3+
import me.chanjar.weixin.common.api.WxConsts;
4+
import me.chanjar.weixin.cp.bean.WxCpMessage;
5+
6+
/**
7+
* <pre>
8+
* 文本卡片消息Builder
9+
* 用法: WxCustomMessage m = WxCustomMessage.TEXTCARD().title(...)....toUser(...).build();
10+
* Created by Binary Wang on 2017-7-2.
11+
* </pre>
12+
*
13+
* @author <a href="https://github.com/binarywang">Binary Wang</a>
14+
*/
15+
public class TextCardBuilder extends BaseBuilder<TextCardBuilder> {
16+
private String title;
17+
private String description;
18+
private String url;
19+
20+
public TextCardBuilder() {
21+
this.msgType = WxConsts.CUSTOM_MSG_TEXTCARD;
22+
}
23+
24+
public TextCardBuilder title(String title) {
25+
this.title = title;
26+
return this;
27+
}
28+
29+
public TextCardBuilder description(String description) {
30+
this.description = description;
31+
return this;
32+
}
33+
34+
public TextCardBuilder url(String url) {
35+
this.url = url;
36+
return this;
37+
}
38+
39+
@Override
40+
public WxCpMessage build() {
41+
WxCpMessage m = super.build();
42+
m.setTitle(this.title);
43+
m.setDescription(this.description);
44+
m.setUrl(this.url);
45+
return m;
46+
}
47+
}

weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpMessageGsonAdapter.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,14 @@ public JsonElement serialize(WxCpMessage message, Type typeOfSrc, JsonSerializat
4343
messageJson.add("text", text);
4444
}
4545

46+
if (WxConsts.CUSTOM_MSG_TEXTCARD.equals(message.getMsgType())) {
47+
JsonObject text = new JsonObject();
48+
text.addProperty("title", message.getTitle());
49+
text.addProperty("description", message.getDescription());
50+
text.addProperty("url", message.getUrl());
51+
messageJson.add("textcard", text);
52+
}
53+
4654
if (WxConsts.CUSTOM_MSG_IMAGE.equals(message.getMsgType())) {
4755
JsonObject image = new JsonObject();
4856
image.addProperty("media_id", message.getMediaId());

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,5 @@ public void testSendMessage1() throws WxErrorException {
5757
System.out.println(messageSendResult.getInvalidPartyList());
5858
System.out.println(messageSendResult.getInvalidUserList());
5959
System.out.println(messageSendResult.getInvalidTagList());
60-
6160
}
6261
}
Lines changed: 12 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package me.chanjar.weixin.cp.bean;
22

3-
import me.chanjar.weixin.common.api.WxConsts;
43
import me.chanjar.weixin.cp.bean.article.MpnewsArticle;
54
import me.chanjar.weixin.cp.bean.article.NewArticle;
65
import org.testng.annotations.*;
@@ -10,82 +9,32 @@
109
@Test
1110
public class WxCpMessageTest {
1211

13-
public void testTextReply() {
14-
WxCpMessage reply = new WxCpMessage();
15-
reply.setToUser("OPENID");
16-
reply.setMsgType(WxConsts.CUSTOM_MSG_TEXT);
17-
reply.setContent("sfsfdsdf");
18-
assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"text\",\"text\":{\"content\":\"sfsfdsdf\"}}");
19-
}
20-
2112
public void testTextBuild() {
2213
WxCpMessage reply = WxCpMessage.TEXT().toUser("OPENID").content("sfsfdsdf").build();
23-
assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"text\",\"text\":{\"content\":\"sfsfdsdf\"}}");
14+
assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"text\",\"text\":{\"content\":\"sfsfdsdf\"},\"safe\":\"0\"}");
2415
}
2516

26-
public void testImageReply() {
27-
WxCpMessage reply = new WxCpMessage();
28-
reply.setToUser("OPENID");
29-
reply.setMsgType(WxConsts.CUSTOM_MSG_IMAGE);
30-
reply.setMediaId("MEDIA_ID");
31-
assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"image\",\"image\":{\"media_id\":\"MEDIA_ID\"}}");
17+
public void testTextCardBuild() {
18+
WxCpMessage reply = WxCpMessage.TEXTCARD().toUser("OPENID")
19+
.title("领奖通知")
20+
.description( "<div class=\"gray\">2016年9月26日</div> <div class=\"normal\">恭喜你抽中iPhone 7一台,领奖码:xxxx</div><div class=\"highlight\">请于2016年10月10日前联系行政同事领取</div>")
21+
.url("http://www.qq.com").build();
22+
assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"textcard\",\"textcard\":{\"title\":\"领奖通知\",\"description\":\"<div class=\\\"gray\\\">2016年9月26日</div> <div class=\\\"normal\\\">恭喜你抽中iPhone 7一台,领奖码:xxxx</div><div class=\\\"highlight\\\">请于2016年10月10日前联系行政同事领取</div>\",\"url\":\"http://www.qq.com\"},\"safe\":\"0\"}");
3223
}
3324

3425
public void testImageBuild() {
3526
WxCpMessage reply = WxCpMessage.IMAGE().toUser("OPENID").mediaId("MEDIA_ID").build();
36-
assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"image\",\"image\":{\"media_id\":\"MEDIA_ID\"}}");
37-
}
38-
39-
public void testVoiceReply() {
40-
WxCpMessage reply = new WxCpMessage();
41-
reply.setToUser("OPENID");
42-
reply.setMsgType(WxConsts.CUSTOM_MSG_VOICE);
43-
reply.setMediaId("MEDIA_ID");
44-
assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"voice\",\"voice\":{\"media_id\":\"MEDIA_ID\"}}");
27+
assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"image\",\"image\":{\"media_id\":\"MEDIA_ID\"},\"safe\":\"0\"}");
4528
}
4629

4730
public void testVoiceBuild() {
4831
WxCpMessage reply = WxCpMessage.VOICE().toUser("OPENID").mediaId("MEDIA_ID").build();
49-
assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"voice\",\"voice\":{\"media_id\":\"MEDIA_ID\"}}");
50-
}
51-
52-
public void testVideoReply() {
53-
WxCpMessage reply = new WxCpMessage();
54-
reply.setToUser("OPENID");
55-
reply.setMsgType(WxConsts.CUSTOM_MSG_VIDEO);
56-
reply.setMediaId("MEDIA_ID");
57-
reply.setThumbMediaId("MEDIA_ID");
58-
reply.setTitle("TITLE");
59-
reply.setDescription("DESCRIPTION");
60-
assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"video\",\"video\":{\"media_id\":\"MEDIA_ID\",\"thumb_media_id\":\"MEDIA_ID\",\"title\":\"TITLE\",\"description\":\"DESCRIPTION\"}}");
32+
assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"voice\",\"voice\":{\"media_id\":\"MEDIA_ID\"},\"safe\":\"0\"}");
6133
}
6234

6335
public void testVideoBuild() {
6436
WxCpMessage reply = WxCpMessage.VIDEO().toUser("OPENID").title("TITLE").mediaId("MEDIA_ID").thumbMediaId("MEDIA_ID").description("DESCRIPTION").build();
65-
assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"video\",\"video\":{\"media_id\":\"MEDIA_ID\",\"thumb_media_id\":\"MEDIA_ID\",\"title\":\"TITLE\",\"description\":\"DESCRIPTION\"}}");
66-
}
67-
68-
public void testNewsReply() {
69-
WxCpMessage reply = new WxCpMessage();
70-
reply.setToUser("OPENID");
71-
reply.setMsgType(WxConsts.CUSTOM_MSG_NEWS);
72-
73-
NewArticle article1 = new NewArticle();
74-
article1.setUrl("URL");
75-
article1.setPicUrl("PIC_URL");
76-
article1.setDescription("Is Really A Happy Day");
77-
article1.setTitle("Happy Day");
78-
reply.getArticles().add(article1);
79-
80-
NewArticle article2 = new NewArticle();
81-
article2.setUrl("URL");
82-
article2.setPicUrl("PIC_URL");
83-
article2.setDescription("Is Really A Happy Day");
84-
article2.setTitle("Happy Day");
85-
reply.getArticles().add(article2);
86-
87-
88-
assertEquals(reply.toJson(), "{\"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\"}]}}");
37+
assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"video\",\"safe\":\"0\",\"video\":{\"media_id\":\"MEDIA_ID\",\"thumb_media_id\":\"MEDIA_ID\",\"title\":\"TITLE\",\"description\":\"DESCRIPTION\"}}");
8938
}
9039

9140
public void testNewsBuild() {
@@ -103,7 +52,7 @@ public void testNewsBuild() {
10352

10453
WxCpMessage reply = WxCpMessage.NEWS().toUser("OPENID").addArticle(article1).addArticle(article2).build();
10554

106-
assertEquals(reply.toJson(), "{\"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\"}]}}");
55+
assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"news\",\"safe\":\"0\",\"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\"}]}}");
10756
}
10857

10958
public void testMpnewsBuild_with_articles() {
@@ -136,7 +85,7 @@ public void testMpnewsBuild_with_media_id() {
13685
WxCpMessage reply = WxCpMessage.MPNEWS().toUser("OPENID").mediaId("mmm").build();
13786

13887
assertEquals(reply.toJson(),
139-
"{\"touser\":\"OPENID\",\"msgtype\":\"mpnews\",\"mpnews\":{\"media_id\":\"mmm\"}}");
88+
"{\"touser\":\"OPENID\",\"msgtype\":\"mpnews\",\"safe\":\"0\",\"mpnews\":{\"media_id\":\"mmm\"}}");
14089
}
14190

14291
}

0 commit comments

Comments
 (0)