简单说一下流程:
在页面带参数跳转到 mp.weixin.qq.com/mp/subscrib… ,然后用户授权确认或者取消以后,会返回参数里面 redirect_url 的地址,并且带上openid 等相应参数,在前端的页面判断链接里面携带了相关参数后就告诉后端,用户订阅消息的结果,最后由后端触发订阅消息的发送,后端调用 api.weixin.qq.com/cgi-bin/mes… 去发送订阅消息。
下面看看代码:
1.让用户授权订阅消息:
let redirect_url = encodeURIComponent(location.href);
let appId = '你的appid'
let scene = '场景值,可以填id或者其它值'
let template_id = '订阅消息的模板id'
const href = `https://mp.weixin.qq.com/mp/subscribemsg?action=get_confirm&appid=${appId}&scene=${id}&template_id=${template_id}&redirect_url=${redirect_url}#wechat_redirect`;
location.href = href;
2.在页面接收用户授权订阅消息的回调信息
onLoad: function(options) {
const { openid, action } = options;
if (action == 'confirm') {
const { class_id } = JSON.parse(uni.getStorageSync('courseInfo') || '{}');
//subscribe() 是封装的接口请求,用户告诉后端授权结果
subscribe({ class_id: class_id }).then(res => {
if (res.data.code == 0) {
uni.navigateTo({
url: '/pages/classRoom/courseList/courseList?id=' + class_id
});
} else {
uni.showToast({
title: res.data.msg,
icon: 'none'
});
}
});
}
}
下面看看官方文档的介绍
公众号或网页使用一次性订阅消息流程如下:
第一步:需要用户同意授权,获取一次给用户推送一条订阅模板消息的机会
在确保微信公众帐号拥有订阅消息授权的权限的前提下(已认证的公众号即有权限,可登录公众平台在接口权限列表处查看),引导用户在微信客户端打开如下链接:
参数说明
参数 | 是否必须 | 说明 |
---|---|---|
action | 是 | 直接填get_confirm即可 |
appid | 是 | 公众号的唯一标识 |
scene | 是 | 重定向后会带上scene参数,开发者可以填0-10000的整形值,用来标识订阅场景值 |
template_id | 是 | 订阅消息模板ID,登录公众平台后台,在接口权限列表处可查看订阅模板ID |
redirect_url | 是 | 授权后重定向的回调地址,请使用UrlEncode对链接进行处理。 注:要求redirect_url的域名要跟登记的业务域名一致,且业务域名不能带路径。 业务域名需登录公众号,在设置-公众号设置-功能设置里面对业务域名设置。 |
reserved | 否 | 用于保持请求和回调的状态,授权请后原样带回给第三方。该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加session进行校验,开发者可以填写a-zA-Z0-9的参数值,最多128字节,要求做urlencode |
#wechat_redirect | 是 | 无论直接打开还是做页面302重定向时,必须带此参数 |
用户同意或取消授权后会返回相关信息
如果用户点击同意或取消授权,页面将跳转至:
redirect_url/?openid=OPENID&template_id=TEMPLATE_ID&action=ACTION&scene=SCENE
参数说明
参数 | 说明 |
---|---|
openid | 用户唯一标识,只在用户确认授权时才会带上 |
template_id | 订阅消息模板ID |
action | 用户点击动作,"confirm"代表用户确认授权,"cancel"代表用户取消授权 |
scene | 订阅场景值 |
reserved | 请求带入原样返回 |
第二步:通过API推送订阅模板消息给到授权微信用户
接口请求说明
http请求方式: post
post数据示例
{
"touser":"OPENID",
"template_id":"TEMPLATE_ID",
"url":"URL",
"miniprogram":{
"appid":"xiaochengxuappid12345",
"pagepath":"index?foo=bar"
},
"scene":"SCENE",
"title":"TITLE",
"data":{
"content":{
"value":"VALUE",
"color":"COLOR"
}
}
}
参数说明
参数 | 是否必须 | 说明 |
---|---|---|
touser | 是 | 填接收消息的用户openid |
template_id | 是 | 订阅消息模板ID |
url | 否 | 点击消息跳转的链接,需要有ICP备案 |
miniprogram | 否 | 跳小程序所需数据,不需跳小程序可不用传该数据 |
appid | 是 | 所需跳转到的小程序appid(该小程序appid必须与发模板消息的公众号是绑定关联关系,并且小程序要求是已发布的) |
pagepath | 是 | 所需跳转到小程序的具体页面路径,支持带参数,(示例index?foo=bar) |
scene | 是 | 订阅场景值 |
title | 是 | 消息标题,15字以内 |
data | 是 | 消息正文,value为消息内容文本(200字以内),没有固定格式,可用\n换行,color为整段消息内容的字体颜色(目前仅支持整段消息为一种颜色) |
注:url和miniprogram都是非必填字段,若都不传则模板无跳转;若都传,会优先跳转至小程序。开发者可根据实际需要选择其中一种跳转方式即可。当用户的微信客户端版本不支持跳小程序时,将会跳转至url。
返回说明
在调用接口后,会返回JSON数据包。正常时的返回JSON数据包示例:
{
"errcode":0,
"errmsg":"ok"
}