使用场景
比如当用户下了订单,这时候应该告诉用户订单的状态发生了改变之类的消息。但是网上的博客不是解释不清,就是在复制黏贴,你搜小程序推送却跟你说公众号推送,所以写一篇博客来解决自己如何解决。
微信公众平台选择模板
进入公众平台后
选择功能->订阅消息
然后选择公共模板选择一次性订阅,然后去选择你所要的模板。之后模板会生成一个 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);
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("待收货")) { WxMaDefaultConfigImpl wxStorage = new WxMaDefaultConfigImpl(); wxStorage.setAppid("你的小程序app"); wxStorage.setSecret("你的密钥"); WxMaService wxMaService = new WxMaServiceImpl(); wxMaService.setWxMaConfig(wxStorage);
WxMaSubscribeMessage subscribeMessage = WxMaSubscribeMessage.builder() .toUser(order.getUserId()) .templateId("前面我们选择的模板ID") .lang("zh_CN") .page("/pages/order/order?orderId="+order.getOrderId()) .miniprogramState("developer") .build();
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); } 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对该用户订阅的模板发起一次信息。
然后我们就能收到消息啦
注意
请注意,这里用户授权只是代表该用户订阅了一次,我们后端也只能发送一次消息,如果你想发送多次请多订阅几个模板,然后让用户授权多个模板,后端根据条件发送不同的模板。