使用场景

比如当用户下了订单,这时候应该告诉用户订单的状态发生了改变之类的消息。但是网上的博客不是解释不清,就是在复制黏贴,你搜小程序推送却跟你说公众号推送,所以写一篇博客来解决自己如何解决。

微信公众平台选择模板

进入公众平台后

选择功能->订阅消息

然后选择公共模板选择一次性订阅,然后去选择你所要的模板。之后模板会生成一个 id,以及所需要的参数

模板

引入 springboot 的 WXJava 依赖

WxJava 封装了许多关于微信公众号、小程序的各种操作,简便了开发。WxJava 文档

因为我们是要开发微信小程序的推送服务,所以我们需要引入 WxJava 中微信小程序的依赖

1
2
3
4
5
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-miniapp</artifactId>
<version>4.6.0</version>
</dependency>

引入之后我们可以开始编写如何推送的代码

springboot 代码编写

这里我以订单为参考

请求相关代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
GetMapping("/changeOrderState")
public ResultBase changeOrderState(@RequestParam String orderId, @RequestParam String orderState) {
int i = orderService.changeOrderState(orderState, orderId);
Order order = orderService.getOrderByOrderId(orderId); // 获取修改后的order

BaseUtil.putWxMessage(order, orderState); //这个是我编写的一个工具类

Map<String, Object> result = new HashMap<>();
if (i > 0) {
result.put("isOK", true);
return ResultBase.success(result);
} else {
result.put("isOK", false);
return ResultBase.success(result);
}
}

工具类代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public static void putWxMessage(Order order, String status) {
if (status.equals("待收货")) {
// 1,配置
WxMaDefaultConfigImpl wxStorage = new WxMaDefaultConfigImpl();
wxStorage.setAppid("你的小程序app");// appid
wxStorage.setSecret("你的密钥");// appsecret
WxMaService wxMaService = new WxMaServiceImpl();
wxMaService.setWxMaConfig(wxStorage);
//WxJava会自动帮我们获取微信的token并且会自动刷新。

// 2,推送消息
WxMaSubscribeMessage subscribeMessage = WxMaSubscribeMessage.builder()
.toUser(order.getUserId()) //这个是用户的openId具体如何获取微信的openId这里不细说
.templateId("前面我们选择的模板ID")
.lang("zh_CN") //字符格式这里可以去看小程序的文档
.page("/pages/order/order?orderId="+order.getOrderId()) //这里是预定信息下面查看详情跳转的小程序要页面
.miniprogramState("developer") //环境,具体参考小程序文档
.build();

//这里就是在设置模板中的各种参数,这里的phone_number25、thing1都是我们生成模板中自带的。
subscribeMessage.addData(new WxMaSubscribeMessage.MsgData("phone_number25", "05937777771"));
subscribeMessage.addData(new WxMaSubscribeMessage.MsgData("thing1", order.getOrderItems().size() + "个菜品"));
subscribeMessage.addData(new WxMaSubscribeMessage.MsgData("date3", order.getCreateTime()));
subscribeMessage.addData(new WxMaSubscribeMessage.MsgData("phrase2", order.getOrderState()));
if (order.getReceivingGoods().equals("到店自取")) {
subscribeMessage.addData(new WxMaSubscribeMessage.MsgData("thing5", "您的商品完成了,请及时取餐"));
} else {
subscribeMessage.addData(new WxMaSubscribeMessage.MsgData("thing5", "您的商品完成了,请等待配送"));
}
// 发起推送
try {
wxMaService.getSubscribeService().sendSubscribeMsg(subscribeMessage); //我们直接调用WxJava中小程序的sendSubscribeMsg方法并将我们的模板信息传递进去,接着我们就能收到信息了。
} catch (Exception e) {
System.out.println("推送失败:" + e.getMessage());
e.printStackTrace();
}
}
//.....这里省略点代码
}

uniapp 授权订阅

核心代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
uni.requestSubscribeMessage({
tmplIds: ["你的模板id"], //可以多个
success: (res) => {
if (this.peopleNum == "") {
uni.showToast({
title: "请选择就餐人数",
icon: "error",
});
} else {
const orderId = this.order.orderId;
const common = this.common;
const price = this.order.orderPrice;
console.log("this.order.orderId", this.order.orderId);
console.log("common", this.common);
uni.navigateTo({
url: `/pages/payPage/payPage?orderId=${orderId}&price=${price}&common=${common}`,
});
}
},
});

uni.requestSubscribeMessage会调用起让用户接收订阅的弹窗,用户确认后就订阅了一次该消息。,然后我们后端就能根据该用户的openId和模板ID对该用户订阅的模板发起一次信息。

然后我们就能收到消息啦

订阅消息提示

注意

请注意,这里用户授权只是代表该用户订阅了一次,我们后端也只能发送一次消息,如果你想发送多次请多订阅几个模板,然后让用户授权多个模板,后端根据条件发送不同的模板。