跳过正文
  1. 文章/

微信小游戏订阅消息

2318 字

订阅消息功能介绍
#

官方文档:https://developers.weixin.qq.com/minigame/dev/guide/open-ability/subscribe-message.html

微信小游戏/微信小程序中,用户订阅消息后,主动推送消息将通过"服务通知"推送给用户。

订阅消息分为三种:一次性订阅消息、关系链互动提醒、游戏更新提醒

一次性订阅消息
#

客户端
#

订阅消息
#

官方文档:https://developers.weixin.qq.com/minigame/dev/api/open-api/subscribe-message/wx.requestSubscribeMessage.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_idstring所需下发的订阅模板id
pagestring点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转
touserstring接收者(用户)的 openid
dataobject模板内容,格式形如{ “phrase3”: { “value”: “审核通过” }, “name1”: { “value”: “订阅” }, “date2”: { “value”: “2019-12-25 09:42” } }
miniprogram_statestring跳转小程序类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版
langstring进入小程序查看”的语言类型,支持zh_CN(简体中文)、en_US(英文)、zh_HK(繁体中文)、zh_TW(繁体中文),默认为zh_CN

错误码
#

错误码错误描述解决方案
40001invalid credential,access_token无效获取access_token时AppSecret错误,或access_token无效。需核对AppSecret,或确认是否为正确的账号调用接口
40003invalid openid不合法的openid,需确认touser是否为本小游戏下的openid
40014invalid access_token不合法的access_token,需核对其有效性(如是否过期)
40037invalid template_id不合法的template_id
43101用户未订阅消息检查订阅弹窗回调结果或确认是否订阅成功,检查一次性订阅次数是否已下发完
43107订阅消息能力封禁检查账号是否被封禁订阅消息能力,检查模板id对应的模板是否被封禁
43108并发下发消息给同一个用户检查是否同时下发多个消息给同一用户
45168命中敏感词检查下发消息中是否带有敏感词
47003参数错误检查data结构格式是否正确,检查各关键词是否满足对应规则

建议方案
#

维护用户订阅状态
#

  1. 服务端只维护每个用户对不同模版消息的订阅次数

服务端向客户端提供两个API

  1. 订阅成功上报(订阅次数+1),在客户端订阅消息成功时上报

  2. 拒绝消息上报(订阅次数清零),在客户端查询订阅消息状态“订阅消息总开关关闭"或者"订阅状态变更为refuse"时上报

微信小游戏设置中关闭订阅消息总开关、或者拒绝某个订阅消息模版后,该模板累计订阅次数会清零

发送消息
#

  1. 检验模板参数规范

  2. 检验订阅次数

  3. 发送成功后扣订阅次数

微信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 {
        // 处理错误
    }
}