2019年10月12日微信开放了小程序订阅消息的功能。按官方的说法,目前的模板消息在实现小程序服务闭环上存在缺陷:
1. 部分开发者在用户无预期或未进行服务的情况下发送与用户无关的消息,对用户产生了骚扰;
2. 模板消息需在用户访问小程序后的 7 天内下发,不能满足部分业务的时间要求
模板消息确实存在上述的硬伤,不利于小程序的用户留存和用户体验。为了解决这些问题,微信官方推出了用户订阅消息功能。我在微慕专业版上加了订阅消息的功能,并验证了这个功能。这个功能是否能都达到官方的预期,这个我感觉不那么乐观。这里我先说我的感受:目前的订阅消息还不完善,后续还有很大的优化空间。
目前,官方只开放了“一次性订阅消息”,尚未开放“长期性订阅消息”,因此我只尝试了“一次性订阅消息”。
一次性订阅消息:用于解决用户使用小程序后,后续服务环节的通知问题。用户自主订阅后,开发者可不限时间地下发一条对应的服务消息;每条消息可单独订阅或退订。
订阅消息推送位置:服务通知
订阅消息下发条件:用户自主订阅
订阅消息卡片跳转能力:点击查看详情可跳转至该小程序的页面
以下我简单说明订阅消息的开发过程和使用体验。
一.订阅消息的开发
1.获取订阅消息的模板ID
在微信小程序的管理后台,在左侧“功能”菜单,选择“订阅消息”,然后点击“添加”
然后选择你需要的消息模板,并配置关键词。
配置完成后,如下图所示。
值得关注的是,在配置好的模板详情页面里的“详细内容”很重要,这个就是开发订阅消息时需要遵循的消息格式,这个格式和模板消息有细微的差别
根据微慕小程序的需要,我选用了“新的评论提醒”和“内容更新提醒”这两个消息模版。前者用于提醒发表话题或文章的作者,有新的话题或文章评论,增强作者与读者之间的交流互动;后者是提醒订阅用户,小程序有新的文章发布,引导用户回归小程序。
订阅消息申请模板的时候,需要选择所属类目,只能选择当前小程序相关的类目模板,对于模板消息不需要选择对应类目。如果删除小程序类目,就会把订阅消息模板一起删除。因此删除类目要小心谨慎。
2.触发用户订阅,获取下发的权限
触发用户订阅,微信小程序提供的api是: wx.requestSubscribeMessage
,用户发生点击行为或者发起支付回调后,才可以调起订阅消息界面。
注意:微信小程序开发工具尚不支持此功能,在开发工具触发订阅的api,会提示:
requestSubscribeMessage:fail 开发者工具暂时不支持此 API 调试,请使用真机进行开发
调用api的代码示例如下:
wx.requestSubscribeMessage({
tmplIds: ["模板A","模板B"],
success: function (res) {
//成功
},
fail(err) {
//失败
console.error(err);
}
})
wx.requestSubscribeMessage(Object object) 的回调函数object.success
参数有两个:errMsg和TEMPLATE_ID; 接口调用成功时errMsg值为’requestSubscribeMessage:ok’。TEMPLATE_ID是动态的键,即模板id,值包括’accept’、’reject’、’ban’。’accept’表示用户同意订阅该条id对应的模板消息,’reject’表示用户拒绝订阅该条id对应的模板消息,’ban’表示已被后台封禁。例如
{ errMsg: “requestSubscribeMessage:ok”, zun-LzcQyW-edafCVvzPkK4de2Rllr1fFpw2A_x0oXE: “accept”} 表示用户同意订阅zun-LzcQyW-edafCVvzPkK4de2Rllr1fFpw2A_x0oXE这条消息。
个人觉得这个动态键不是特别合理,代码处理起来有些麻烦,如果改成静态键的json格式比较方便处理,例如:
{
errMsg:"requestSubscribeMessage:ok",
result: [
{ templateId:"zun-LzcQyW-edafCVvzPkK4de2Rllr1fFpw2A_x0oXE",
status:"accept"
}
]
}
在手机上调用此api方法会调出订阅消息的界面,如下图所示:
关于这个订阅消息的授权有几点要注意:
1) 在确认提示框里,如果用户选择“取消”表示拒绝(取消)订阅消息,选择“允许”表示用户订阅一次消息。
2) 如果用户不勾选“总是保持以上选择,不再询问”,那么每次用户触发都会弹出提示框。
3) 如果用户勾选“总是保持以上选择,不再询问”,那么将再也不会唤起这个对话框。同时,如果选择“取消”,那么以后每次调用这个api的时候,都会自动拒绝;如果选择“允许”,那么以后每次调用此api,都会自动允许授权。
目前小程序没有提供获取用户是否授权订阅消息的方法。通过wx.openSetting 方法无法获取用户是否授权消息订阅的信息,scope 列表没有订阅消息的内容。
如果想从自动拒绝转换到自动自动运行,需要打开小程序的设置去配置。设置方法:点击小程序右上角的三个点,打开如下对话框
然后选择“设置”,在设置项里选择“订阅消息”
4)对于同一种消息,用户可以订阅多次,订阅多少次,就会收到多少次订阅消息,这个订阅次数是否有上限,官方没有说明,初步判断是不限的。但是,微信不会提供订阅的次数,因此需要在小程序的后端服务里存储用户订阅的次数。因此,我在微慕小程序专业版里,提供了一个给用户多次订阅的设置,并记录用户订阅的次数。
如果用户需要某个消息服务,可以订阅多次,当然也可以在点击“订阅”的对话框里选择“取消”,“取消”一次也就减少一次订阅。
5)对于支付的场景,也需要用户确认是否订阅,这个我觉得不合理,支付后给用户一个订单推送消息应该是刚性需求,不需要再询问一遍用户是否订阅。
2.调用接口下发订阅消息
订阅消息下发的接口是小程序后台服务端调用:subscribeMessage.send,此方法类似下发模板消息的方法,详细调用说明见参考官方的链接:
订阅消息的下发接口方法和模板消息稍有不同,
模板消息的json格式如下
"data": {
"keyword1": {
"value": "内容1",
"color": "#000"
},
"keyword2": {
"value": "内容2",
"color": "#000"
}
}
而订阅消息的json格式如下:
"data": {
"thing1": {
"value": "内容"
},
"number2": {
"value": 20
}
订阅消息的字段key是和数据类型有关,value的参数需要严格按照设置的类型提交,如果不按类型提交,会导致发送失败。同时如果是文本型的内容,字数也有限制,超过限制也会发送失败,但具体字数是多少,官方没有给出,同时中英文混合计算的长度也有差异,据我目前测试25个中文字符是可以的。希望官方能给出具体的字符长度限制的明确数字。
如果调用下发的次数大于用户的订阅次数,调用接口下发订阅消息会返回失败。报如下错误
二.订阅消息使用心得
1.订阅消息虽然把订阅的授权的交给了用户,但是也增加了用户使用难度,同时,一次性订阅只能收到一次,操作起来比较繁琐,如果不是刚需用户可能会首次就拒绝了这个服务,要想重新获取授权,需要用户自己打开小程序设置里去配置,颇为麻烦,小程序没有提供更简便的方法去唤起。
2.小程序的服务商为了获得更多给用户发送订阅消息的次数,肯定会想方设法去埋点引诱用户去点击订阅,这种诱导估计也是违规。
3.用户使用门槛和学习比较高,比如某个预约的服务,原来的场景是用户只要有提交表单,小程序就可以推送消息给用户,但是现在需要用户主动去订阅,无形中多了一步,如果用户不熟悉订阅消息或者直接点了“取消”,小程序就没法通知到用户了,用户可能因此错失服务,对商家和用户都是损失。
4.微信小程序将采用订阅消息,并逐步取消模板消息,虽然微信官方试图在方便用户和不打扰用户这两种选择里去寻求平衡,但订阅消息目前的模式恐怕无法达到这个期望,至少在我看来,无论对小程序的服务商,还是小程序的用户,都感到不方便。
update:2020年5月18日,日前订阅消息已经支持微信小程序开发工具。
我感觉是太的蛋疼啊,不是一般的蛋疼,我这业务场景还稍稍有点区别。我这边是有一个场景是团长收货后,java后台判断发送给用户提醒用户来团长这儿取货,问题是这个值主动发送过去,而不是触发某个按钮实现,我在用户提交订单的时候进行了消息订阅的确认推送,用户确认了,下面的以后不再提醒也点了,一直都是允许的,但是现在用户那边收不到,我测试了好久发现这问题真的太恼火了。想打人的那种感觉
请问大佬消息内容如何修改为动态的,比如关键字日期。我可以根据用户选择的日期来自动修改所发消息的日期?
不懂
如何让发送出去的订阅消息的字体变大,比如以前的模板消息就有一个变大的字段
大佬,我这边是开放平台代理小程序的;用户点击小程序勾选具体模板,“允许”后 ;服务器后台怎么查到具体这个用户使勾选了哪些模板?有具体的接口?还是前端用户勾选后,自己写一个接口进行记录呢?还是开发平台“消息与事件接收URL”接收通知呢?
但是这个接口也不能知道,前端小程序到底勾选了哪个模板。尴尬
我用小程序体验版订阅消息,后台服务发送消息 返回的OK,但是微信服务通知里确没有收到消息?
string Url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token="+ token;
var postdata = new
{
touser = openId,
template_id = templeteId,
page = "pages/index/index",
data = new
{
thing1 = new
{
value = "今日行程"
},
date2 = new
{
value = "2020-02-20"
},
thing4 = new
{
value = "请做好准备,即将出发"
}
}
};
wenXinResult = HttpHelper.HttpPostJson(Url, JsonHelper.Serialize(postdata), false);
wenXinResult 里返回的是成功!服务通知里确没有收到消息,请教下这是什么原因呢?
还有那个累加数据库不需要保存什么参数吗,例如之前的formid。是不是用户授权一次发一次,用户一直授权我就可以一直发,不需要保存触发条件
我想问一下 程序怎么判断用户是点击拒绝还是同意呢,用那个动态键好像判断不了吧
tmplIds: [subscribeMesagesId],
success: function (res) {
var scopeSubscribeMessage = "";
if (res.errMsg === "requestSubscribeMessage:ok") {
for (var k in res) {
if (res[k] == 'accept') {
scopeSubscribeMessage = 'accept';
break;
}
else if (res[k] == 'reject') {
scopeSubscribeMessage = 'reject';
break;
}
else if (res[k] == 'ban') {
scopeSubscribeMessage = 'ban';
break;
}
}
}
)
大佬,用户可以订阅多次,这个订阅多次是累计的吧?有没有时间限制,会不会失效?
请问你的订阅次数是靠用户多次点击订阅得到的还是一次点击多次调用api拿到的?如果是前者那么用户要点很多次授权,除非他开启不再询问。
场景大概是,发了一个帖子,然后别人给他回复,那么他需要收到通知,这种情况是无法预知有多少回复的