Skip to content

Commit 96e7310

Browse files
borisbaobinarywang
authored andcommitted
binarywang#615 公众号客服消息添加 "发送小程序卡片" 类型
1 parent f704b1a commit 96e7310

File tree

5 files changed

+128
-16
lines changed

5 files changed

+128
-16
lines changed

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,11 @@ public static class KefuMsgType {
7878
* 转发到客服的消息.
7979
*/
8080
public static final String TRANSFER_CUSTOMER_SERVICE = "transfer_customer_service";
81+
82+
/**
83+
* 小程序卡片(要求小程序与公众号已关联)
84+
*/
85+
public static final String MINIPROGRAMPAGE="miniprogrampage";
8186
}
8287

8388
/**

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ public class WxMpKefuMessage implements Serializable {
3030
private String kfAccount;
3131
private String cardId;
3232
private String mpNewsMediaId;
33+
private String miniProgramAppId;
34+
private String miniProgramPagePath;
3335
private List<WxArticle> articles = new ArrayList<>();
3436

3537
/**
@@ -88,6 +90,13 @@ public static WxCardBuilder WXCARD() {
8890
return new WxCardBuilder();
8991
}
9092

93+
/**
94+
* 小程序卡片
95+
*/
96+
public static MiniProgramPageBuilder MINIPROGRAMPAGE() {
97+
return new MiniProgramPageBuilder();
98+
}
99+
91100
/**
92101
* <pre>
93102
* 请使用
@@ -99,6 +108,7 @@ public static WxCardBuilder WXCARD() {
99108
* {@link WxConsts.KefuMsgType#NEWS}
100109
* {@link WxConsts.KefuMsgType#MPNEWS}
101110
* {@link WxConsts.KefuMsgType#WXCARD}
111+
* {@link WxConsts.KefuMsgType#MINIPROGRAMPAGE}
102112
* </pre>
103113
*
104114
*/
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package me.chanjar.weixin.mp.builder.kefu;
2+
3+
import me.chanjar.weixin.common.api.WxConsts.KefuMsgType;
4+
import me.chanjar.weixin.mp.bean.kefu.WxMpKefuMessage;
5+
6+
/**
7+
* 小程序卡片 builder
8+
* <pre>
9+
* 用法:
10+
* WxMpKefuMessage m = WxMpKefuMessage.MINIPROGRAMPAGE().title("xxxx").thumbMediaId("xxxxx").appId("xxxx").pagePath("****").toUser(...).build();
11+
* </pre>
12+
*
13+
* @author boris.bao
14+
*/
15+
public final class MiniProgramPageBuilder extends BaseBuilder<MiniProgramPageBuilder> {
16+
17+
private String title;
18+
private String appId;
19+
private String pagePath;
20+
private String thumbMediaId;
21+
22+
public MiniProgramPageBuilder() {
23+
this.msgType = KefuMsgType.MINIPROGRAMPAGE;
24+
}
25+
26+
27+
public MiniProgramPageBuilder title(String title) {
28+
this.title = title;
29+
return this;
30+
}
31+
32+
public MiniProgramPageBuilder appId(String appId) {
33+
this.appId = appId;
34+
return this;
35+
}
36+
37+
38+
public MiniProgramPageBuilder pagePath(String pagePath) {
39+
this.pagePath = pagePath;
40+
return this;
41+
}
42+
43+
44+
public MiniProgramPageBuilder thumbMediaId(String thumbMediaId) {
45+
this.thumbMediaId = thumbMediaId;
46+
return this;
47+
}
48+
49+
50+
@Override
51+
public WxMpKefuMessage build() {
52+
WxMpKefuMessage m = super.build();
53+
m.setTitle(this.title);
54+
m.setMiniProgramAppId(this.appId);
55+
m.setMiniProgramPagePath(this.pagePath);
56+
m.setThumbMediaId(this.thumbMediaId);
57+
return m;
58+
}
59+
60+
61+
}

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

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

33
import com.google.gson.*;
44
import me.chanjar.weixin.common.api.WxConsts;
5+
import me.chanjar.weixin.common.api.WxConsts.KefuMsgType;
56
import me.chanjar.weixin.mp.bean.kefu.WxMpKefuMessage;
67
import org.apache.commons.lang3.StringUtils;
78

@@ -79,6 +80,15 @@ public JsonElement serialize(WxMpKefuMessage message, Type typeOfSrc, JsonSerial
7980
messageJson.add("wxcard", wxcard);
8081
}
8182

83+
if (KefuMsgType.MINIPROGRAMPAGE.equals(message.getMsgType())) {
84+
JsonObject miniProgramPage = new JsonObject();
85+
miniProgramPage.addProperty("title", message.getTitle());
86+
miniProgramPage.addProperty("appid", message.getMiniProgramAppId());
87+
miniProgramPage.addProperty("pagepath", message.getMiniProgramPagePath());
88+
miniProgramPage.addProperty("thumb_media_id", message.getThumbMediaId());
89+
messageJson.add("miniprogrampage", miniProgramPage);
90+
}
91+
8292
if (StringUtils.isNotBlank(message.getKfAccount())) {
8393
JsonObject newsJsonObject = new JsonObject();
8494
newsJsonObject.addProperty("kf_account", message.getKfAccount());

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

Lines changed: 42 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
import me.chanjar.weixin.common.api.WxConsts;
44
import me.chanjar.weixin.mp.bean.kefu.WxMpKefuMessage.WxArticle;
5-
import org.testng.*;
6-
import org.testng.annotations.*;
5+
import org.testng.Assert;
6+
import org.testng.annotations.Test;
77

88
@Test
99
public class WxMpKefuMessageTest {
@@ -13,38 +13,44 @@ public void testTextReply() {
1313
reply.setToUser("OPENID");
1414
reply.setMsgType(WxConsts.KefuMsgType.TEXT);
1515
reply.setContent("sfsfdsdf");
16-
Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"text\",\"text\":{\"content\":\"sfsfdsdf\"}}");
16+
Assert
17+
.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"text\",\"text\":{\"content\":\"sfsfdsdf\"}}");
1718
}
1819

1920
public void testTextBuild() {
2021
WxMpKefuMessage reply = WxMpKefuMessage.TEXT().toUser("OPENID").content("sfsfdsdf").build();
21-
Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"text\",\"text\":{\"content\":\"sfsfdsdf\"}}");
22+
Assert
23+
.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"text\",\"text\":{\"content\":\"sfsfdsdf\"}}");
2224
}
2325

2426
public void testImageReply() {
2527
WxMpKefuMessage reply = new WxMpKefuMessage();
2628
reply.setToUser("OPENID");
2729
reply.setMsgType(WxConsts.KefuMsgType.IMAGE);
2830
reply.setMediaId("MEDIA_ID");
29-
Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"image\",\"image\":{\"media_id\":\"MEDIA_ID\"}}");
31+
Assert.assertEquals(reply.toJson(),
32+
"{\"touser\":\"OPENID\",\"msgtype\":\"image\",\"image\":{\"media_id\":\"MEDIA_ID\"}}");
3033
}
3134

3235
public void testImageBuild() {
3336
WxMpKefuMessage reply = WxMpKefuMessage.IMAGE().toUser("OPENID").mediaId("MEDIA_ID").build();
34-
Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"image\",\"image\":{\"media_id\":\"MEDIA_ID\"}}");
37+
Assert.assertEquals(reply.toJson(),
38+
"{\"touser\":\"OPENID\",\"msgtype\":\"image\",\"image\":{\"media_id\":\"MEDIA_ID\"}}");
3539
}
3640

3741
public void testVoiceReply() {
3842
WxMpKefuMessage reply = new WxMpKefuMessage();
3943
reply.setToUser("OPENID");
4044
reply.setMsgType(WxConsts.KefuMsgType.VOICE);
4145
reply.setMediaId("MEDIA_ID");
42-
Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"voice\",\"voice\":{\"media_id\":\"MEDIA_ID\"}}");
46+
Assert.assertEquals(reply.toJson(),
47+
"{\"touser\":\"OPENID\",\"msgtype\":\"voice\",\"voice\":{\"media_id\":\"MEDIA_ID\"}}");
4348
}
4449

4550
public void testVoiceBuild() {
4651
WxMpKefuMessage reply = WxMpKefuMessage.VOICE().toUser("OPENID").mediaId("MEDIA_ID").build();
47-
Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"voice\",\"voice\":{\"media_id\":\"MEDIA_ID\"}}");
52+
Assert.assertEquals(reply.toJson(),
53+
"{\"touser\":\"OPENID\",\"msgtype\":\"voice\",\"voice\":{\"media_id\":\"MEDIA_ID\"}}");
4854
}
4955

5056
public void testVideoReply() {
@@ -55,12 +61,15 @@ public void testVideoReply() {
5561
reply.setThumbMediaId("MEDIA_ID");
5662
reply.setTitle("TITLE");
5763
reply.setDescription("DESCRIPTION");
58-
Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"video\",\"video\":{\"media_id\":\"MEDIA_ID\",\"thumb_media_id\":\"MEDIA_ID\",\"title\":\"TITLE\",\"description\":\"DESCRIPTION\"}}");
64+
Assert.assertEquals(reply.toJson(),
65+
"{\"touser\":\"OPENID\",\"msgtype\":\"video\",\"video\":{\"media_id\":\"MEDIA_ID\",\"thumb_media_id\":\"MEDIA_ID\",\"title\":\"TITLE\",\"description\":\"DESCRIPTION\"}}");
5966
}
6067

6168
public void testVideoBuild() {
62-
WxMpKefuMessage reply = WxMpKefuMessage.VIDEO().toUser("OPENID").title("TITLE").mediaId("MEDIA_ID").thumbMediaId("MEDIA_ID").description("DESCRIPTION").build();
63-
Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"video\",\"video\":{\"media_id\":\"MEDIA_ID\",\"thumb_media_id\":\"MEDIA_ID\",\"title\":\"TITLE\",\"description\":\"DESCRIPTION\"}}");
69+
WxMpKefuMessage reply = WxMpKefuMessage.VIDEO().toUser("OPENID").title("TITLE").mediaId("MEDIA_ID")
70+
.thumbMediaId("MEDIA_ID").description("DESCRIPTION").build();
71+
Assert.assertEquals(reply.toJson(),
72+
"{\"touser\":\"OPENID\",\"msgtype\":\"video\",\"video\":{\"media_id\":\"MEDIA_ID\",\"thumb_media_id\":\"MEDIA_ID\",\"title\":\"TITLE\",\"description\":\"DESCRIPTION\"}}");
6473
}
6574

6675
public void testMusicReply() {
@@ -72,7 +81,8 @@ public void testMusicReply() {
7281
reply.setTitle("TITLE");
7382
reply.setMusicUrl("MUSIC_URL");
7483
reply.setHqMusicUrl("HQ_MUSIC_URL");
75-
Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"music\",\"music\":{\"title\":\"TITLE\",\"description\":\"DESCRIPTION\",\"thumb_media_id\":\"MEDIA_ID\",\"musicurl\":\"MUSIC_URL\",\"hqmusicurl\":\"HQ_MUSIC_URL\"}}");
84+
Assert.assertEquals(reply.toJson(),
85+
"{\"touser\":\"OPENID\",\"msgtype\":\"music\",\"music\":{\"title\":\"TITLE\",\"description\":\"DESCRIPTION\",\"thumb_media_id\":\"MEDIA_ID\",\"musicurl\":\"MUSIC_URL\",\"hqmusicurl\":\"HQ_MUSIC_URL\"}}");
7686
}
7787

7888
public void testMusicBuild() {
@@ -84,7 +94,8 @@ public void testMusicBuild() {
8494
.musicUrl("MUSIC_URL")
8595
.hqMusicUrl("HQ_MUSIC_URL")
8696
.build();
87-
Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"music\",\"music\":{\"title\":\"TITLE\",\"description\":\"DESCRIPTION\",\"thumb_media_id\":\"MEDIA_ID\",\"musicurl\":\"MUSIC_URL\",\"hqmusicurl\":\"HQ_MUSIC_URL\"}}");
97+
Assert.assertEquals(reply.toJson(),
98+
"{\"touser\":\"OPENID\",\"msgtype\":\"music\",\"music\":{\"title\":\"TITLE\",\"description\":\"DESCRIPTION\",\"thumb_media_id\":\"MEDIA_ID\",\"musicurl\":\"MUSIC_URL\",\"hqmusicurl\":\"HQ_MUSIC_URL\"}}");
8899
}
89100

90101
public void testNewsReply() {
@@ -106,8 +117,8 @@ public void testNewsReply() {
106117
article2.setTitle("Happy Day");
107118
reply.getArticles().add(article2);
108119

109-
110-
Assert.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\"}]}}");
120+
Assert.assertEquals(reply.toJson(),
121+
"{\"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\"}]}}");
111122
}
112123

113124
public void testNewsBuild() {
@@ -125,7 +136,22 @@ public void testNewsBuild() {
125136

126137
WxMpKefuMessage reply = WxMpKefuMessage.NEWS().toUser("OPENID").addArticle(article1).addArticle(article2).build();
127138

128-
Assert.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\"}]}}");
139+
Assert.assertEquals(reply.toJson(),
140+
"{\"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\"}]}}");
141+
}
142+
143+
public void testMiniProgramPageBuild() {
144+
145+
WxMpKefuMessage reply = WxMpKefuMessage.MINIPROGRAMPAGE()
146+
.toUser("OPENID")
147+
.title("title")
148+
.appId("appid")
149+
.pagePath("pagepath")
150+
.thumbMediaId("thumb_media_id")
151+
.build();
152+
153+
Assert.assertEquals(reply.toJson(),
154+
"{\"touser\":\"OPENID\",\"msgtype\":\"miniprogrampage\",\"miniprogrampage\":{\"title\":\"title\",\"appid\":\"appid\",\"pagepath\":\"pagepath\",\"thumb_media_id\":\"thumb_media_id\"}}");
129155
}
130156

131157
}

0 commit comments

Comments
 (0)