订阅消息功能介绍#
官方文档:https://developers.weixin.qq.com/minigame/dev/guide/open-ability/subscribe-message.html
微信小游戏/微信小程序中,用户订阅消息后,主动推送消息将通过"服务通知"推送给用户。
订阅消息分为三种:一次性订阅消息、关系链互动提醒、游戏更新提醒
一次性订阅消息#
客户端#
订阅消息#
// 在小游戏中,只有在以下接口的回调中才能正常使用,即响应用户的点击行为:
wx.onTouchEnd
wx.showModal
wx.showActionSheet提示:一次性订阅消息,订阅一次消息(即调用一次wx.requestSubscribeMessage())后,用户只能收到一条消息(即累计可接收消息次数+1)
开发者要推送多次消息,有如下两种方案:
方案一:引导玩家勾选“总是保持以上选择,不再询问”,在每次登录相关按钮静默触发订阅。
方案二:显式增加订阅消息次数的按钮,用户点击按钮后,可增加订阅次数(参考微信小程序:狐友)。
查询订阅消息状态#
官方文档:https://developers.weixin.qq.com/minigame/dev/api/open-api/setting/wx.getSetting.html
wx.getSetting()
// 带上withSubscriptions 同时获取用户订阅消息的订阅状态。
// 注意:只返回用户勾选过订阅面板中的“总是保持以上选择,不再询问”的订阅消息。
服务端#
发送订阅消息#
官方文档:https://developers.weixin.qq.com/minigame/dev/api-backend/subscribe-message/api_sendmessage.html
接口query参数 必填 access_token 接口调用凭据
接口请求体参数:
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| template_id | string | 是 | 所需下发的订阅模板id |
| page | string | 否 | 点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转 |
| touser | string | 是 | 接收者(用户)的 openid |
| data | object | 是 | 模板内容,格式形如{ “phrase3”: { “value”: “审核通过” }, “name1”: { “value”: “订阅” }, “date2”: { “value”: “2019-12-25 09:42” } } |
| miniprogram_state | string | 否 | 跳转小程序类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版 |
| lang | string | 否 | 进入小程序查看”的语言类型,支持zh_CN(简体中文)、en_US(英文)、zh_HK(繁体中文)、zh_TW(繁体中文),默认为zh_CN |
错误码#
| 错误码 | 错误描述 | 解决方案 |
|---|---|---|
| 40001 | invalid credential,access_token无效 | 获取access_token时AppSecret错误,或access_token无效。需核对AppSecret,或确认是否为正确的账号调用接口 |
| 40003 | invalid openid | 不合法的openid,需确认touser是否为本小游戏下的openid |
| 40014 | invalid access_token | 不合法的access_token,需核对其有效性(如是否过期) |
| 40037 | invalid template_id | 不合法的template_id |
| 43101 | 用户未订阅消息 | 检查订阅弹窗回调结果或确认是否订阅成功,检查一次性订阅次数是否已下发完 |
| 43107 | 订阅消息能力封禁 | 检查账号是否被封禁订阅消息能力,检查模板id对应的模板是否被封禁 |
| 43108 | 并发下发消息给同一个用户 | 检查是否同时下发多个消息给同一用户 |
| 45168 | 命中敏感词 | 检查下发消息中是否带有敏感词 |
| 47003 | 参数错误 | 检查data结构格式是否正确,检查各关键词是否满足对应规则 |
建议方案#
维护用户订阅状态#
- 服务端只维护每个用户对不同模版消息的订阅次数
服务端向客户端提供两个API
订阅成功上报(订阅次数+1),在客户端订阅消息成功时上报
拒绝消息上报(订阅次数清零),在客户端查询订阅消息状态“订阅消息总开关关闭"或者"订阅状态变更为refuse"时上报
微信小游戏设置中关闭订阅消息总开关、或者拒绝某个订阅消息模版后,该模板累计订阅次数会清零
发送消息#
检验模板参数规范
检验订阅次数
发送成功后扣订阅次数
微信API#
openid 用户唯一标识(不同小游戏/小程序独立)#
获取方式:客户端login()获取code后,传入服务端调用code2Session()获取
官方文档:https://developers.weixin.qq.com/minigame/dev/api/open-api/login/wx.login.html
接口调用凭据 access_token#
官方文档:https://developers.weixin.qq.com/doc/oplatform/developers/dev/AccessToken.html
有两个API可以获取access_token接口调用凭据,推荐使用稳定版接口。 通过appid和secret调用接口,获取access_token。access_token 的有效期为 2 个小时,需定时刷新。稳定版接口有效期内重复调用不会更新 access_token(不强制刷新),若需要强制刷新可带force_refresh参数,强制刷新至少间隔30s。
封装SDK#
github仓库:https://github.com/muzimu/wechat-sdk
基础使用方法:
import (
"github.com/muzimu/wechat-sdk/cache"
"github.com/muzimu/wechat-sdk/client"
"github.com/muzimu/wechat-sdk/config"
"github.com/muzimu/wechat-sdk/subscribe"
)
func main() {
// 创建配置
cfg := &config.Config{
AppID: "your_app_id",
AppSecret: "your_app_secret",
Cache: cache.NewMemory(), // 使用内置内存缓存
}
// 创建客户端
cli := client.NewClient(cfg)
sub := cli.GetSubscribe()
// 发送订阅消息
msg := &subscribe.Message{
ToUser: "user_openid",
TemplateID: "template_id",
Page: "pages/index/index",
Data: map[string]*subscribe.DataItem{
"thing1": {Value: "订单内容"},
"amount2": {Value: "100.00"},
},
}
err := sub.Send(msg)
if err != nil {
// 处理错误
}
}