注:模板消息没了。
正常开发肯定需要前后端配合,此处都在小程序里写了
参考文档:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/subscribe-message.html
订阅消息是个很好的功能,但是现在被不良商家用烂了,特别是拼多多,有毒。
目录
小程序消息推送首先需要用户自主订阅,分为一次性订阅消息和长期订阅消息,长期订阅消息仅向政务民生、医疗、交通、金融、教育等线下公共服务开放。
一次性订阅消息很麻烦,用户授权一次发一次,再发就提示invalid。
整体流程就是先在小程序后台配置模板消息,获取到用户订阅后在代码里给模板填充字段,然后发送。
主要分三步走:
一、获取模板ID
添加模板之后就可以得到了。
需要做的就是填充详细内容那些字段。
二、获取权限(提示用户订阅)
wx.requestSubscribeMessage({
tmplIds: ['模板ID'],
success (res) {
console.log("订阅成功:"+JSON.stringify(res))
},
fail(res){
console.log("订阅失败:"+JSON.stringify(res))
}
})
//注意把模板ID换为自己的
tmplIds是模板消息id的集合,最多三条,而且一次性订阅消息和长期订阅消息是不能放在一起的,还有,模板消息的标题也是不能相同的。
效果是这样的:
三、消息推送
消息推送有两个条件:有openid和access_token,正常开发肯定是需要这个的,一定会有,这里演示用。
1、获取openid
//获取openid
wx.login({
success: res => {
//获取openid
this.getOpenID(res.code)
}
})
getOpenID: function(code){
wx.request({
url: 'https://api.weixin.qq.com/sns/jscode2session?appid=AppID&secret=Appsecret&js_code='+code+'&grant_type=authorization_code',
method:'GET',
success(res){
getApp().globalData.oopenidi = res.data.openid;
console.log("获取openid成功:"+res.data.openid)
}
})
}
//注意把AppID和Appsecret换为自己的
2、获取access_token
//获取access_token
wx.request({
url: 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=AppID&secret=Appsecret',
method:'GET',
success(res){
getApp().globalData.access_token = res.data.access_token;
console.log("获取access_token成功:"+res.data.access_token)
}
})
//注意把AppID和Appsecret换为自己的
3、发送
这里其实就是对模板消息的字段进行填充。
touser就是openid
page是用户点击推送消息的时候跳转的页面,但是仅限当前小程序。
这个字段有或没有在页面是有区别的。如果没有,下方的进入小程序查看是没有的。
最重要的就是data,这里面就是对模板消息字段的填充,格式也是非常简单,和日常用的一样。
wx.request({
url: getApp().globalData.messageurl+getApp().globalData.access_token,
method:'POST',
data:{
access_token:getApp().globalData.access_token,
touser:getApp().globalData.oopenidi,
template_id:'模板ID',
page:'pages/index/index',
data:{
"character_string2": {
"value": "370406199393939939"
},
"name1":{
"value":"李三"
},
"thing6":{
"value":"西药"
},
"thing3":{
"value":"医保门诊"
},
"amount5":{
"value":"20.00"
}
}
},
success(res){
console.log(JSON.stringify(res))
},fail(res){
console.log(JSON.stringify(res))
}
})
这最后一步看似简单,但是搞不好就会报个错,我看网上很多人都会报invalid openid 或者invalid access_token,实际上并不是很难的bug,只是不够细心导致的。