微信小程序订阅消息推送

发布时间 2023-12-13 14:51:30作者: honeybee003

一、后台配置模板消息:

首先打开微信后台https://mp.weixin.qq.com/,找到订阅消息那里进行模板配置:

 点击选用按钮,选择指定的模板,选择字段,确定后可以看到下面的信息:

 复制上面的模板ID,这个在模板消息推送时要用的。点击详情,可以看到下面的信息:

这里面的模板ID和详细内容是需要记录下来的,推送消息时都要传递进去的。

 

二、前端小程序获取用户授权:

在小程序中获取用户订阅消息的授权:在小程序中,你需要调用wx.requestSubscribeMessage接口获取用户的订阅消息授权。用户同意授权后,你可以得到用户的订阅消息订阅状态:

1 uni.requestSubscribeMessage({
2  tmplIds: ['你的消息模板ID],
3   success (res) {
4       console.log(res);
5   }
6 })

点击调用了上述方法的按钮,就会弹出如下页面,选择允许后,就可以接收后端推送的通知消息了:

三、后端获取Token:

 1 private TokenObj getAccessToken() {
 2     Map<String, Object> params = new HashMap<>();
 3     params.put("grant_type", "client_credential");
 4     params.put("appid", appletsConfig.getWxAppId());
 5     params.put("secret", appletsConfig.getWxAppSecret());
 6     String wxAppletDomain = "https://api.weixin.qq.com/cgi-bin/token";
 7     String res = HttpClientUtils.get(HttpClientUtils.getDefaultPoolClient(),wxAppletDomain,params);
 8     TokenObj obj = null;
 9     if (StringUtils.hasText(res)) {
10         obj = JSON.parseObject(res, TokenObj.class);
11     }
12     if (obj == null || StringUtils.isEmpty(obj.getAccess_token())) {
13         throw new BusinessException("获取token失败:" + res);
14     }
15     return obj;
16 }

四、后端发送消息:

 1 public String sendMsg(HttpServletRequest request){    
 2     //请求 微信接口 获取 accessToken
 3     String accessToken = getAccessToken();
 4     String openid = "接收消息的微信用户的openId";
 5     String templateId = "微信订阅消息模板";
 6     String page = "点击消息的跳转路径";
 7     // 构建订阅消息内容的JSON对象
 8     // 构建订阅消息内容的JSON对象
 9     JSONObject messageData = new JSONObject();
10     messageData.put("name2", createDataItem("张三"));
11     messageData.put("name3", createDataItem("李四"));
12     messageData.put("time4", createDataItem("2023-06-30"));
13     // 将订阅消息内容转换为JSON字符串
14     String jsonData = messageData.toJSONString();
15     pushMessage(accessToken,openid,templateId,page,jsonData);
16     return "success";
17 }
18 private static Map<String, Object> createDataItem(String value) {
19     Map<String, Object> item = new HashMap<>();
20     item.put("value", value);
21     return item;
22 }
23 
24 public void pushMessage(String accessToken, String openId, String templateId, String page, Map<String, Map<String,Object>> jsonData) {
25     try {
26         Map<String, Object> params=new HashMap<>();
27         params.put("touser",openId);
28         params.put("data", jsonData);
29         if(StringUtils.hasText(page)){
30             params.put("page",page);
31         }
32         params.put("miniprogram_state", "trial");
33         params.put("template_id",templateId); 
34         String pushUrl = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=%s";
35         String result= HttpClientUtils.post(HttpClientUtils.getDefaultPoolClient(), String.format(pushUrl, accessToken), params);
36         logger.info("【微信推送】微信推送返回结果 ,{}",result);        
37     } catch (Exception e) {        
38         logger.error("【微信推送】微信推送请求失败", e);
39     }
40 }