微信小程序订阅消息推送的实现步骤

2,821 阅读2分钟

微信小程序订阅消息推送的实现步骤

一、后台配置模板消息:

首先打开微信后台mp.weixin.qq.com/,找到订阅消息那里进行…

image.png

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

image.png

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

image.png

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

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

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

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

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

image.png

三、后端获取Token:

private TokenObj getAccessToken() {
    Map<String, Object> params = new HashMap<>();
    params.put("grant_type", "client_credential");
    params.put("appid", appletsConfig.getWxAppId());
    params.put("secret", appletsConfig.getWxAppSecret());
    String wxAppletDomain = "https://api.weixin.qq.com/cgi-bin/token";
    String res = HttpClientUtils.get(HttpClientUtils.getDefaultPoolClient(),wxAppletDomain,params);
    TokenObj obj = null;
    if (StringUtils.hasText(res)) {
        obj = JSON.parseObject(res, TokenObj.class);
    }
    if (obj == null || StringUtils.isEmpty(obj.getAccess_token())) {
        throw new BusinessException("获取token失败:" + res);
    }
    return obj;
}

四、后端发送消息:

public String sendMsg(HttpServletRequest request){    
    //请求 微信接口 获取 accessToken
    String accessToken = getAccessToken();
    String openid = "接收消息的微信用户的openId";
    String templateId = "微信订阅消息模板";
    String page = "点击消息的跳转路径";
    // 构建订阅消息内容的JSON对象
    // 构建订阅消息内容的JSON对象
    JSONObject messageData = new JSONObject();
    messageData.put("name2", createDataItem("张三"));
    messageData.put("name3", createDataItem("李四"));
    messageData.put("time4", createDataItem("2023-06-30"));
    // 将订阅消息内容转换为JSON字符串
    String jsonData = messageData.toJSONString();
    pushMessage(accessToken,openid,templateId,page,jsonData);
    return "success";
}
private static Map<String, Object> createDataItem(String value) {
    Map<String, Object> item = new HashMap<>();
    item.put("value", value);
    return item;
}

public void pushMessage(String accessToken, String openId, String templateId, String page, Map<String, Map<String,Object>> jsonData) {
    try {
        Map<String, Object> params=new HashMap<>();
        params.put("touser",openId);
        params.put("data", jsonData);
        if(StringUtils.hasText(page)){
            params.put("page",page);
        }
        params.put("miniprogram_state", "trial");
        params.put("template_id",templateId); 
        String pushUrl = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=%s";
        String result= HttpClientUtils.post(HttpClientUtils.getDefaultPoolClient(), String.format(pushUrl, accessToken), params);
        logger.info("【微信推送】微信推送返回结果 ,{}",result);        
    } catch (Exception e) {        
        logger.error("【微信推送】微信推送请求失败", e);
    }
}