> 技术文档 > 小程序通过模板消息发送通知(基于订阅消息实现)_小程序模板消息

小程序通过模板消息发送通知(基于订阅消息实现)_小程序模板消息


程序通过模板消息发送通知(基于订阅消息实现)

本文介绍如何在微信小程序中通过订阅消息向指定用户推送通知,完整流程涵盖:配置小程序、用户授权、获取 openid、发送订阅消息等,适合使用微信公众号管理后台的小程序开发者参考。


原文链接:https://mp.weixin.qq.com/s/cYsKBEGtsgW7TxstaI8dDA

一、配置小程序信息:获取 AppID 与 AppSecret

登录微信公众平台,找到对应的小程序,获取 AppIDAppSecret,用于后续接口调用。

小程序通过模板消息发送通知(基于订阅消息实现)_小程序模板消息


二、配置隐私协议

在「账号信息」中完善隐私保护指引,否则可能会导致订阅消息无法正常发送。

小程序通过模板消息发送通知(基于订阅消息实现)_小程序模板消息


三、配置订阅消息模板

进入【功能】-【订阅消息】,选择你需要的模板。

⚠️ 注意:

  • 个人小程序仅支持一次性订阅,用户每次都需主动授权。

  • 每个字段必须符合平台定义的格式,否则会报错,如:

    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
✅ 模板消息发送