小程序通过模板消息发送通知(基于订阅消息实现)_小程序模板消息
小程序通过模板消息发送通知(基于订阅消息实现)
本文介绍如何在微信小程序中通过订阅消息向指定用户推送通知,完整流程涵盖:配置小程序、用户授权、获取
openid
、发送订阅消息等,适合使用微信公众号管理后台的小程序开发者参考。
原文链接:https://mp.weixin.qq.com/s/cYsKBEGtsgW7TxstaI8dDA
一、配置小程序信息:获取 AppID 与 AppSecret
登录微信公众平台,找到对应的小程序,获取 AppID
和 AppSecret
,用于后续接口调用。
二、配置隐私协议
在「账号信息」中完善隐私保护指引,否则可能会导致订阅消息无法正常发送。
三、配置订阅消息模板
进入【功能】-【订阅消息】,选择你需要的模板。
⚠️ 注意:
-
个人小程序仅支持一次性订阅,用户每次都需主动授权。
-
每个字段必须符合平台定义的格式,否则会报错,如:
data format error rid: 670c8333-386618ab-24cc7dbf
👉 官方字段限制文档:点击查看
四、小程序端用户授权订阅
用户必须主动点击按钮触发订阅授权,核心接口为:
wx.requestSubscribeMessage
示例代码(订阅按钮)
export default { methods: { sub() { const tempIds = [\"xxx\"] // 模板ID wx.requestSubscribeMessage({ tmplIds: tempIds, success(res) { console.log(\"授权成功\", res) }, fail(err) { console.log(\"授权失败\", err) } }) } }}
五、获取用户 openid
小程序必须先调用 wx.login()
获取 code
,再由后端使用此 code
获取用户的 openid
。
前端代码:
<button @click=\"login\">登录</button>
login() {uni.login({provider: \'weixin\',success(res) {console.log(res)if (res.errMsg === \"login:ok\") {let jsCode = res.codeconsole.log(res.code)const params = {code: jsCode}// 发送请求uni.request({url: \"xxxx\",data: params,method:\'POST\',success(res) {console.log(res)}})} else {console.log(\"登录失败,请联系管理员\")}},})}
后端示例代码(Java):
public class WxLoginService { private static final String WX_LOGIN_URL = \"https://api.weixin.qq.com/sns/jscode2session\"; public String getOpenid(String code) { Map<String, Object> params = new HashMap<>(); params.put(\"appid\", \"你的AppID\"); params.put(\"secret\", \"你的AppSecret\"); params.put(\"js_code\", code); params.put(\"grant_type\", \"authorization_code\"); String result = HttpUtil.get(WX_LOGIN_URL, params); JSONObject json = JSON.parseObject(result); return json.getString(\"openid\"); }}
后端实现订阅消息发送
一、依赖引入(Maven)
<dependency> <groupId>com.github.binarywang</groupId> <artifactId>weixin-java-miniapp</artifactId> <version>3.8.0</version></dependency><dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.8.26</version></dependency>
二、获取小程序 access_token
官方文档:access_token 获取方式
public class WechatTokenUtil { private static final String GET_TOKEN_URL = \"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={APPID}&secret={APPSECRET}\"; public static String getAccessToken(String appId, String appSecret) { String url = GET_TOKEN_URL.replace(\"{APPID}\", appId).replace(\"{APPSECRET}\", appSecret); String res = HttpUtil.get(url); Map<String, String> token = (Map<String, String>) JSONUtil.parse(res); return token.get(\"access_token\"); }}
三、发送订阅消息
官方接口文档:订阅消息发送
public class WechatMessageUtil { private static final String SEND_MSG_URL = \"https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token={ACCESS_TOKEN}\"; public static boolean sendTemplateMessage(String accessToken, String toUser, String templateId, Map<String, Object> data) { String url = SEND_MSG_URL.replace(\"{ACCESS_TOKEN}\", accessToken); Map<String, Object> message = new HashMap<>(); message.put(\"touser\", toUser); message.put(\"template_id\", templateId); message.put(\"data\", data); String res = HttpUtil.post(url, JSONUtil.toJsonStr(message)); Map<String, Object> result = (Map<String, Object>) JSONUtil.parse(res); return result.get(\"errcode\").equals(0); }}
四、完整测试示例
public class Main { private static final String APP_ID = \"你的AppID\"; private static final String APP_SECRET = \"你的AppSecret\"; private static final String TEMPLATE_ID = \"你的模板ID\"; private static final String TO_USER = \"目标用户openid\"; public static void main(String[] args) { String token = WechatTokenUtil.getAccessToken(APP_ID, APP_SECRET); Map<String, Object> data = setTemplateData(); boolean success = WechatMessageUtil.sendTemplateMessage(token, TO_USER, TEMPLATE_ID, data); System.out.println(success ? \"消息发送成功!\" : \"消息发送失败!\"); } private static Map<String, Object> setTemplateData() { Map<String, Object> data = new HashMap<>(); data.put(\"thing1\", Map.of(\"value\", \"测试商家\")); data.put(\"thing2\", Map.of(\"value\", \"测试商品\")); data.put(\"thing3\", Map.of(\"value\", \"测试地址\")); data.put(\"date4\", Map.of(\"value\", \"2022-01-01 12:00\")); data.put(\"character_string6\", Map.of(\"value\", \"202201010001\")); return data; }}
总结
通过以上步骤,我们实现了:
✅ 用户授权订阅
✅ 后端解析 openid
✅ 获取 access_token
✅ 模板消息发送