小程序想要向用户的微信服务通知中发送消息,可以使用小程序开发文档里提供的订阅消息来实现,效果如图:
实现订阅消息需要前后端配合
前端工作:
1.获取订阅消息模板
打开微信公众平台,输入账号密码登录,进入到“订阅消息”页面去获取模板
2.获取openid
需要由前端先去调用 wx.login 方法去获取code,然后后端再根据这个code去调用微信服务端的api,获取openid,有了openid以后,才能向用户微信发送订阅消息(发送订阅消息的api是由后端调用的)
wx.login({
success (res) {
console.log(res.code) // 拿着这个code传给后端,后端调用微信服务端api去取得openid
}
})
注:openid的一般用法是,后端获取openid后,将其保存在用户表中,用户登录时,如果检测到该用户已有openid字段,就不需要再次获取;如果没有,则调用 wx.login 方法与后端配合去获取openid
3.检查用户是否有同意了订阅消息
wx.getSetting({ // getSetting方法用来获取小程序向用户请求过的权限
withSubscriptions: true, // 这个字段为true时,用来获取用户订阅消息的订阅状态
success (res) {
// 我们需要判断的是res.subscriptionsSetting.itemSettings这个字段
// 假设你的模板id为"abcd",itemSettings里,如果没有名为abcd的属性,表明用户还未订阅过消息
// 如果有名为adcd的属性,且属性值为reject,表明用户拒绝订阅该消息
// 如果有名为abcd的属性,且属性值为accept,表明用户已接受该订阅消息
console.log(res.subscriptionsSetting.itemSettings)
}
})
需要注意的是,检查用户是否有同意了订阅消息,必须要在真机上调试调用
4.如果用户没有订阅消息,则发起订阅消息弹窗
// 发起订阅消息弹窗
wx.requestSubscribeMessage({
tmplIds: ['abcd'], // 模板id列表
success (res) {},
fail (err) {}
})
需要注意的是,发起订阅弹窗的方法,必须手动触发(比如点击按钮触发)或者在支付回调中才能触发,在别的回调中是无法触发的,如下
wx.getSetting({
withSubscriptions: true,
success (res) {
// 先判断用户是否有订阅了该消息
if (res.subscriptionsSetting.itemSettings['模板id'] !== 'accept') {
wx.requestSubscribeMessage({
tmplIds: ['模板id'],
success (res) {}
})
}
}
})
这样的代码是错误的做法,除非是支付方法的回调,否则只能手动触发,一点击按钮,就要调用wx.requestSubscribeMessage方法。此外,该方法也必须在真机上调试
wx.requestSubscribeMessage方法的运行效果:
使用规则:
如果你勾选了“总是保持以上选择,不再询问”,那么不管你选择的是取消还是允许,只要是用你的微信号打开的小程序,都再也不会发起订阅消息弹窗。后续要更改设置的话,只能到小程序的设置中去设置
但是,若你一直不勾选“总是保持以上选择,不再询问”,则每一次都会发起订阅消息弹窗。且这个时候,在小程序的设置中是无法设置的,只能一次次地点击取消或允许。
除此之外,发送订阅消息的次数与你点击允许的次数成正比。如果不勾选“总是保持以上选择”,则你允许一次,后端只能发送一次消息给你,没办法发送多次后端工作:
1.获取openid,将openid保存在用户表中
2.根据模板id,openid,以及字段详情,调用微信服务端api,发送消息给微信用户
上诉各个api仅是简单介绍,实际开发中也够用了。更详细的用法,还是需要查看微信开发者文档