tencent cloud

小游戏订阅消息实践教程
最后更新时间:2025-06-03 18:00:37
小游戏订阅消息实践教程
最后更新时间: 2025-06-03 18:00:37

前言

基于 superapp 的通知渠道,我们为开发者提供了订阅消息能力,以便实现服务的闭环,带给 superapp 用户更优的体验。
开发者在游戏内,可向用户发起消息订阅。开发者需在后台自行记录用户是否订阅成功及订阅成功的次数。
用户在小游戏中订阅指定的消息内容后,开发者可以在后台通过下发消息的 send 接口把一条模板消息发送给用户。用户成功订阅一次,开发者可在游戏内认为场景适合的时机,向该用户下发一条模板消息。
针对上述场景,您可通过以下方案来实现订阅消息功能:

流程说明

前提条件

为实现 superapp 和小游戏的订阅消息功能,您的 superapp 需要开通推送服务,否则小游戏订阅消息无法通过 superapp 的推送渠道触达用户。

添加消息模版

开发者需在控制台-小游戏管理-订阅消息,从公共模板库中选择适用的消息模板,配置推送的字段后,添加为“我的模板”。详细流程可参考 小游戏管理-订阅消息

小游戏实现订阅消息触发

第 1 步:获取模版 ID

按上述添加消息模板成功后,可以获取到已经配置的模板 ID,用于后续消息订阅操作。

第 2 步:获取下发权限

在小游戏中一次性订阅消息通过 wx.requestSubscribeMessage 调起 superapp 订阅消息界面,用户操作后返回用户订阅消息的操作结果,结果为"accept"时表示用户同意订阅模板 ID 对应的模板消息且模板可用。

示例代码如下:

JAVASCRIPT
// tmplIds:Array of template IDs that need to be subscribed
requestSubscribeMessage(tmplIds) {
wx.requestSubscribeMessage({
tmplIds,
success: (res) => {
console.log('wx.requestSubscribeMessage success', res)
const keysWithAccept = Object.entries(res)
.filter(([key, value]) => value === "accept")
.map(([key]) => key);
if (keysWithAccept.length > 0) {
// Send subscription message
this.orderSubscribe(keysWithAccept)
} else {
wx.showModal({
title: 'No available message templates',
confirmText: 'Confirm',
showCancel: false
})
}
},
fail: (res) => {
console.log('wx.requestSubscribeMessage fail', res)
wx.showModal({
title: 'wx.requestSubscribeMessage fail',
confirmText: 'Confirm',
content: `${res.errMsg}【${res.errCode}】`,
showCancel: false
})
}
})
}

第 3 步:调用接口下发订阅消息

当用户在小游戏中触发了需要接收消息的操作后,小游戏通过自定义接口调用小游戏服务端并传递可用的模板 ID,再由小游戏服务端调用 SAS 服务端(OpenServer)提供的 send 接口发送订阅消息。

小游戏服务端下发订阅消息

小游戏发送订阅消息的前提是小游戏服务端需要接入 getAccessToken 接口。
通常情况下,小游戏服务端需要获取小游戏的订阅关系,如上述 示例代码 中的 this.orderSubscribe() 接口,小游戏服务端需要将用户订阅成功的模版、订阅时间、订阅者(openid) 持久化。
一般情况下订阅消息这个动作完成以后,发消息的动作是一个未来行为;小游戏服务端需要根据自身的需求提供一个消息发送的平台,或者通过其它中间件、接口去触发消息发送。
这里小游戏订阅消息的时候入参 tmplIds 可以通过 后台接口 去校验模版 ID 的有效性。
目前后台发送订阅消息的接口请参考如下 接口,需要特别注意 data 字段的格式, 下面给出参考示例。
若订阅消息模版如下:
name: {{name01.DATA}}
amount: {{amount01.DATA}}
journey: {{thing01.DATA}}
date: {{date01.DATA}}
那么对应的发送消息的 data 数据结构则如下:
{
"touser": "OPENID",
"template_id": "TEMPLATE_ID",
"page": "index",
"data": {
"name01": {
"value": "who "
},
"amount01": {
"value": "$100"
},
"thing01": {
"value": "from beijing to shanghai"
} ,
"date01": {
"value": "2018-01-01"
}
}
}

Supeapp 接收并展示订阅消息



在上一个步骤中,小游戏后台通过 SAS 平台向 superapp 后台推送订阅消息,superapp 需要通过 接受订阅消息 接口接收消息并完成后续自定义业务逻辑。 通常 superapp 后台需要向 superapp 提供一个拉取消息列表的接口,以便让 superapp 可以获取到从小游戏推送过来的订阅消息数据,并给 superapp 的用户展示。
注意:
Superapp 拉取消息列表的接口需要 superapp 后台自行开发。
以下是我们建议 superapp 接收并展示订阅消息的方式。
如果您的 superapp 是具备社交聊天功能,我们建议您将订阅消息的通知入口放置在聊天列表中,方便用户实时查看。

此外,如果您的 superapp 有系统消息功能,也可以将系统消息的入口作为订阅消息的入口。

当然,您也可以根据自己的喜好来决定订阅消息的入口,我们建议将入口放置在较为显眼的位置。
有了订阅消息入口后,接下来,您需要自定义一个订阅消息列表页面,我们称呼为“消息卡片”页面,用来展示订阅消息,可以参考下方图片来实现 UI。

以下是订阅消息列表和“消息卡片”的实现方法,供参考。
进入消息卡片页面时,调用 superapp 后台拉取订阅消息。示例代码:
// 定义一个数组变量 jsonDatas,用于存储获取到的数据,初始值为 nil
BLOCK_ARRAY jsonDatas = nil;

// 调用单例 SubscriptionManager 的 getMessage 方法获取消息数据
// 参数:
// - token: 获取登录用户 token
// - appId: 配置文件(tcmpp-ios-configurations.json或tcmpp-android-configurations.json) 中的appKey
// 成功回调:
// - message: 获取到的消息数据数组
// 失败回调:
// - error: 错误信息
[SubscriptionManager.sharedInstance getMessage: UserInfo.sharedInstance.token
appId: MiniAppSDKManager.sharedInstance.configAppKey
success:^(ARRAY message) {
// 检查 message 是否为数组类型,如果不是则直接返回
if (![message isArray]) {
return;
}

// 检查 message 数组是否为空,如果为空则直接返回
if ([message isEmpty]) {
return;
}

// 将获取到的消息数据数组赋值给 jsonDatas 变量
jsonDatas = message;

// 创建一个可变数组 arrayDatas,用于存储解析后的数据模型
MUTABLE_ARRAY arrayDatas = [NSMutableArray array];

// 遍历 jsonDatas 数组
for (DICTIONARY json in jsonDatas) {
// 将每个 json 数据解析成 SubscribeInfoModel 模型对象
SubscribeInfoModel *model = [[SubscribeInfoModel alloc] initWithJsonDatas: json];

// 将模型对象添加到 arrayDatas 数组中
[arrayDatas addObject: model];
}

// 将 arrayDatas 数组赋值给 self.modelDatas 属性
self.modelDatas = [NSArray arrayWithArray: arrayDatas];

// 在主线程上异步执行 tableView 的 reloadData 方法,刷新表格数据
[self.tableView performSelectorOnMainThread: @selector(reloadData)
withObject: nil
waitUntilDone: YES];
}
failure:^(ERROR error) {
// 处理获取消息数据失败的情况,这里可根据业务场景进行失败提示
}];
在示例代码中,我们通过 superapp 封装的 getMessage 接口,传入了用户 token 和 AppKey 参数来获取订阅卡片的数据,获取成功回调中,将对应的订阅数据进行反序列化,设置在视图容器中,最后进行刷新。
点击卡片后,可进入对应的小游戏,示例代码:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
// 获取当前点击卡片对应的订阅模型对象
SubscribeInfoModel *model = self.modelDatas[indexPath.row];
// 传入订阅模型对象的参数,调用SDK的打开小游戏接口
[[TMFMiniAppSDKManager sharedInstance] startUpMiniAppWithAppID:model.MnpId verType:model.vertype scene:0 firstPage:model.Page paramsStr:nil parentVC:self completion:^(NSError * _Nullable error) {
if(error) {
// 打开失败,可根据业务场景进行提示
return;
}
// 打开成功,可根据业务场景进行提示
}];
}
在示例代码中,我们通过点击的列表元素来获取对应的订阅对象,通过调用 startUpMiniAppWithAppID 方法,传入小游戏 appid、小游戏状态、小游戏入口页面等参数来实现打开小游戏。
本页内容是否解决了您的问题?
您也可以 联系销售 提交工单 以寻求帮助。

文档反馈