Skip to content

Commit 902ba61

Browse files
silloybinarywang
authored andcommitted
#1239 增加微信小程序订阅消息发送接口
1 parent e33601c commit 902ba61

File tree

8 files changed

+199
-4
lines changed

8 files changed

+199
-4
lines changed

weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxMaErrorMsgEnum.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -444,6 +444,14 @@ public enum WxMaErrorMsgEnum {
444444
CODE_85064(85064, "找不到模版/草稿"),
445445

446446
CODE_85065(85065, "模版库已满"),
447+
448+
/**
449+
* 小程序订阅消息错误码
450+
* https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.send.html
451+
*/
452+
CODE_43101(43101, "用户拒绝接受消息,如果用户之前曾经订阅过,则表示用户取消了订阅关系"),
453+
454+
CODE_47003(47003, "模板参数不准确,可能为空或者不满足规则,errmsg会提示具体是哪个字段出错"),
447455
;
448456

449457
private int code;

weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaMsgService.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package cn.binarywang.wx.miniapp.api;
22

33
import cn.binarywang.wx.miniapp.bean.WxMaKefuMessage;
4+
import cn.binarywang.wx.miniapp.bean.WxMaSubscribeMessage;
45
import cn.binarywang.wx.miniapp.bean.WxMaTemplateMessage;
56
import cn.binarywang.wx.miniapp.bean.WxMaUniformMessage;
67
import me.chanjar.weixin.common.error.WxErrorException;
@@ -15,6 +16,7 @@
1516
public interface WxMaMsgService {
1617
String KEFU_MESSAGE_SEND_URL = "https://api.weixin.qq.com/cgi-bin/message/custom/send";
1718
String TEMPLATE_MSG_SEND_URL = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send";
19+
String SUBSCRIBE_MSG_SEND_URL = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send";
1820
String UNIFORM_MSG_SEND_URL = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/uniform_send";
1921

2022
/**
@@ -36,6 +38,15 @@ public interface WxMaMsgService {
3638
void sendTemplateMsg(WxMaTemplateMessage templateMessage) throws WxErrorException;
3739

3840

41+
/**
42+
* <pre>
43+
* https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.send.html
44+
* </pre>
45+
* 发送订阅消息
46+
*/
47+
void sendSubscribeMsg(WxMaSubscribeMessage subscribeMessage) throws WxErrorException;
48+
49+
3950
/**
4051
* <pre>
4152
* 下发小程序和公众号统一的服务消息

weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImpl.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import cn.binarywang.wx.miniapp.api.WxMaMsgService;
44
import cn.binarywang.wx.miniapp.api.WxMaService;
55
import cn.binarywang.wx.miniapp.bean.WxMaKefuMessage;
6+
import cn.binarywang.wx.miniapp.bean.WxMaSubscribeMessage;
67
import cn.binarywang.wx.miniapp.bean.WxMaTemplateMessage;
78
import cn.binarywang.wx.miniapp.bean.WxMaUniformMessage;
89
import cn.binarywang.wx.miniapp.constant.WxMaConstants;
@@ -27,6 +28,11 @@ public boolean sendKefuMsg(WxMaKefuMessage message) throws WxErrorException {
2728
return responseContent != null;
2829
}
2930

31+
/**
32+
* <pre>
33+
* 小程序模板消息接口将于2020年1月10日下线,开发者可使用订阅消息功能
34+
* </pre>
35+
*/
3036
@Override
3137
public void sendTemplateMsg(WxMaTemplateMessage templateMessage) throws WxErrorException {
3238
String responseContent = this.wxMaService.post(TEMPLATE_MSG_SEND_URL, templateMessage.toJson());
@@ -36,6 +42,15 @@ public void sendTemplateMsg(WxMaTemplateMessage templateMessage) throws WxErrorE
3642
}
3743
}
3844

45+
@Override
46+
public void sendSubscribeMsg(WxMaSubscribeMessage subscribeMessage) throws WxErrorException {
47+
String responseContent = this.wxMaService.post(SUBSCRIBE_MSG_SEND_URL, subscribeMessage.toJson());
48+
JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject();
49+
if (jsonObject.get(WxMaConstants.ERRCODE).getAsInt() != 0) {
50+
throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
51+
}
52+
}
53+
3954
@Override
4055
public void sendUniformMsg(WxMaUniformMessage uniformMessage) throws WxErrorException {
4156
String responseContent = this.wxMaService.post(UNIFORM_MSG_SEND_URL, uniformMessage.toJson());
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package cn.binarywang.wx.miniapp.bean;
2+
3+
import lombok.Data;
4+
import lombok.NoArgsConstructor;
5+
6+
/**
7+
* <pre>
8+
* 参考文档 https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.send.html
9+
* </pre>
10+
*/
11+
@Data
12+
@NoArgsConstructor
13+
public class WxMaSubscribeData {
14+
private String name;
15+
private String value;
16+
private String color;
17+
18+
public WxMaSubscribeData(String name, String value) {
19+
this.name = name;
20+
this.value = value;
21+
}
22+
23+
public WxMaSubscribeData(String name, String value, String color) {
24+
this.name = name;
25+
this.value = value;
26+
this.color = color;
27+
}
28+
29+
30+
}
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package cn.binarywang.wx.miniapp.bean;
2+
3+
import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
4+
import lombok.*;
5+
6+
import java.io.Serializable;
7+
import java.util.ArrayList;
8+
import java.util.List;
9+
10+
/**
11+
* 订阅消息.
12+
* https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.send.html
13+
*/
14+
@Getter
15+
@Setter
16+
@NoArgsConstructor
17+
@AllArgsConstructor
18+
@Builder
19+
public class WxMaSubscribeMessage implements Serializable {
20+
21+
private static final long serialVersionUID = 6846729898251286686L;
22+
23+
/**
24+
* 接收者(用户)的 openid.
25+
* <pre>
26+
* 参数:touser
27+
* 是否必填: 是
28+
* 描述: 接收者(用户)的 openid
29+
* </pre>
30+
*/
31+
private String toUser;
32+
33+
/**
34+
* 所需下发的模板消息的id.
35+
* <pre>
36+
* 参数:template_id
37+
* 是否必填: 是
38+
* 描述: 所需下发的模板消息的id
39+
* </pre>
40+
*/
41+
private String templateId;
42+
43+
/**
44+
* 点击模板卡片后的跳转页面,仅限本小程序内的页面.
45+
* <pre>
46+
* 参数:page
47+
* 是否必填: 否
48+
* 描述: 点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转。
49+
* </pre>
50+
*/
51+
private String page;
52+
53+
/**
54+
* 模板内容,不填则下发空模板.
55+
* <pre>
56+
* 参数:data
57+
* 是否必填: 是
58+
* 描述: 模板内容,不填则下发空模板
59+
* </pre>
60+
*/
61+
private List<WxMaSubscribeData> data;
62+
63+
64+
public WxMaSubscribeMessage addData(WxMaSubscribeData datum) {
65+
if (this.data == null) {
66+
this.data = new ArrayList<>();
67+
}
68+
this.data.add(datum);
69+
70+
return this;
71+
}
72+
73+
public String toJson() {
74+
return WxMaGsonBuilder.create().toJson(this);
75+
}
76+
77+
}

weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/json/WxMaGsonBuilder.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package cn.binarywang.wx.miniapp.util.json;
22

3+
import cn.binarywang.wx.miniapp.bean.WxMaSubscribeMessage;
34
import cn.binarywang.wx.miniapp.bean.WxMaTemplateMessage;
45
import cn.binarywang.wx.miniapp.bean.WxMaUniformMessage;
56
import cn.binarywang.wx.miniapp.bean.analysis.WxMaRetainInfo;
@@ -19,6 +20,7 @@ public class WxMaGsonBuilder {
1920
static {
2021
INSTANCE.disableHtmlEscaping();
2122
INSTANCE.registerTypeAdapter(WxMaTemplateMessage.class, new WxMaTemplateMessageGsonAdapter());
23+
INSTANCE.registerTypeAdapter(WxMaSubscribeMessage.class, new WxMaSubscribeMessageGsonAdapter());
2224
INSTANCE.registerTypeAdapter(WxMaUniformMessage.class, new WxMaUniformMessageGsonAdapter());
2325
INSTANCE.registerTypeAdapter(WxMaCodeCommitRequest.class, new WxMaCodeCommitRequestGsonAdapter());
2426
INSTANCE.registerTypeAdapter(WxMaCodeVersionDistribution.class, new WxMaCodeVersionDistributionGsonAdapter());
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package cn.binarywang.wx.miniapp.util.json;
2+
3+
import cn.binarywang.wx.miniapp.bean.WxMaSubscribeData;
4+
import cn.binarywang.wx.miniapp.bean.WxMaSubscribeMessage;
5+
import com.google.gson.JsonElement;
6+
import com.google.gson.JsonObject;
7+
import com.google.gson.JsonSerializationContext;
8+
import com.google.gson.JsonSerializer;
9+
10+
import java.lang.reflect.Type;
11+
12+
public class WxMaSubscribeMessageGsonAdapter implements JsonSerializer<WxMaSubscribeMessage> {
13+
14+
@Override
15+
public JsonElement serialize(WxMaSubscribeMessage message, Type typeOfSrc, JsonSerializationContext context) {
16+
JsonObject messageJson = new JsonObject();
17+
messageJson.addProperty("touser", message.getToUser());
18+
messageJson.addProperty("template_id", message.getTemplateId());
19+
if (message.getPage() != null) {
20+
messageJson.addProperty("page", message.getPage());
21+
}
22+
23+
24+
JsonObject data = new JsonObject();
25+
messageJson.add("data", data);
26+
27+
if (message.getData() == null) {
28+
return messageJson;
29+
}
30+
31+
for (WxMaSubscribeData datum : message.getData()) {
32+
JsonObject dataJson = new JsonObject();
33+
dataJson.addProperty("value", datum.getValue());
34+
data.add(datum.getName(), dataJson);
35+
}
36+
37+
return messageJson;
38+
}
39+
40+
}

weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImplTest.java

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,10 @@
33
import java.text.SimpleDateFormat;
44
import java.util.Date;
55

6+
import cn.binarywang.wx.miniapp.bean.*;
67
import org.testng.annotations.*;
78

89
import cn.binarywang.wx.miniapp.api.WxMaService;
9-
import cn.binarywang.wx.miniapp.bean.WxMaKefuMessage;
10-
import cn.binarywang.wx.miniapp.bean.WxMaTemplateData;
11-
import cn.binarywang.wx.miniapp.bean.WxMaTemplateMessage;
12-
import cn.binarywang.wx.miniapp.bean.WxMaUniformMessage;
1310
import cn.binarywang.wx.miniapp.test.ApiTestModule;
1411
import cn.binarywang.wx.miniapp.test.TestConfig;
1512
import com.google.common.collect.Lists;
@@ -59,6 +56,21 @@ public void testSendTemplateMsg() throws WxErrorException {
5956
this.wxService.getMsgService().sendTemplateMsg(templateMessage);
6057
}
6158

59+
60+
@Test
61+
public void testSendSubscribeMsg() throws WxErrorException {
62+
TestConfig config = (TestConfig) this.wxService.getWxMaConfig();
63+
64+
WxMaSubscribeMessage message = new WxMaSubscribeMessage();
65+
message.setTemplateId(config.getTemplateId());
66+
message.setToUser(config.getOpenid());
67+
message.addData(new WxMaSubscribeData("thing1", "苹果到货啦"));
68+
message.addData(new WxMaSubscribeData("amount3", "¥5"));
69+
message.addData(new WxMaSubscribeData("thing5", "记得领取哦"));
70+
this.wxService.getMsgService().sendSubscribeMsg(message);
71+
}
72+
73+
6274
@Test
6375
public void testSendUniformMsg() throws WxErrorException {
6476
TestConfig config = (TestConfig) this.wxService.getWxMaConfig();

0 commit comments

Comments
 (0)