升级微信订阅消息必知的 5 个细节 | 附实战教程

秃头程序员
• 阅读 6323

前言

微信官方为提升小程序模板消息的使用体验,调整了模板消息的下发条件。原有的模板消息将升级为「订阅消息」,而模板消息接口于2020 年 4 月 10 日下线(在 2020 年 1 月 10 日以后新发布的小程序只能使用订阅消息),届时将无法再使用原接口推送模板消息,因此需要开发者及时进行调整。

升级微信订阅消息必知的 5 个细节 | 附实战教程

△ 微信官方最新消息

模板消息与订阅消息的区别

无论是模板消息,还是现在新的订阅消息,发送小程序消息都是通过三步完成:

  • 获取模板 ID(即创建模板)
  • 获取下发的权限
  • 发送消息

从步骤来看,只有「获取下发的权限」这一步是有变化的,其余都是相同的。

模板消息

当用户在小程序内完成特定的交互行为(支付或提交表单行为)来收集 formid,后续利用该 formid 可以在 7 天内任意时间给该用户推送模板消息。

  • 发送模板消息一定要携带 formid
  • 推送的有效时间为 7 天
  • 用户只能被动选择接收,下发的权利掌握在开发者手上

订阅消息

当用户在小程序内点击特定按钮后会弹出申请订阅弹窗,同意后小程序可在后续任意时间给该用户推送服务通知。

  • 发送订阅消息需要用户先进行授权
  • 授权一次可发送一条服务通知,可以重复授权,每一次授权都会单独保存为一条记录
  • 推送时间不受限制
  • 用户自主选择接受,下发的权利掌握在用户手上

小结

之前的「模板消息」下发是不需要用户授权的,理论上可以设计成用户点击一次就获得一次权限,这个过程中用户是无感知的,只要有了 formid,在公共模板库里有的都能下发,且数据类型没有限制,用户收到什么消息完全取决于开发者。

现在的「订阅消息」更像是一个开关,需要用户主动点击授权之后才能获取下发消息权限,用户接不接收消息,接收什么订阅消息,决定权在用户手里。另外订阅消息还严格控制了数据类型和长度,不符合要求的将无法下发。(血泪教训啊,并且你只有在添加模板之后才能知道这个字段是属于什么类型,对于带变量的模板消息千万要注意变量是否符合字段要求)。

订阅消息使用场景

「模板消息」与「订阅消息」虽然都是为了召回用户以及推送消息提醒,但由于模板消息推送的时间限制过于严格,相对于一些服务周期较长的小程序来说,7 天的限制不能提供完整的服务。

例如机票类的小程序,用户从订票到出行,这间隔很大可能是超过 7 天的,如果想给用户发送“航班延误提醒”等消息,很有可能是无法实现的。因此,对于低频、长线服务的小程序来说,「订阅消息」是非常重要的。

另外,有少量的小程序会把「模板消息」当成营销工具,用来推送广告,诱导用户点击,这极大影响用户的使用体验。「订阅消息」的上线完美的弥补了这两个问题。

与「模板消息」不同,现在是需要用户授权订阅后才能下发消息,对于刚需的服务场景,例如外卖小程序的“外卖派送消息”以及电商小程序的“到货通知”等场景,订阅率都是比较高的。

而非刚需的服务场景,则可以对用户进行“引导订阅”,所以首先要让用户主动触发订阅。例如,对电商小程序来说,可以引导用户订阅心仪商品的“降价通知”;而内容类小程序,可以引导用户订阅其感兴趣的话题等。

升级订阅消息的防坑指南

1.调起订阅弹窗

触发用户订阅,微信小程序提供的 api 是:wx.requestSubscribeMessage,触发条件必须是用户点击行为(bindtap 事件)或发起支付回调后才能调起订阅消息界面。像 form 表单的 bindsubmit 事件就不行,如果原先在 form 表单中获取 formid 要升级成订阅消息,这里提供两个思路参考:

  • 将 form 表单的 bindsubmit 事件改成 bingtap 事件。手动获取 form 表单的数据,通过 bindtap 事件调起订阅消息界面,完成订阅后再提交表单。(适合表单数据量较少时用)
  • 在 bindsubmit 事件中增加引导用户订阅的弹窗。例如,使用 wx.showModal(回调函数是 bindtap 事件),通过用户是否确认来调起订阅消息界面,当完成订阅后再完成表单提交。

2.调起订阅弹窗同时跳转页面

当用户点击按钮触发订阅弹窗的时候,同时跳转页面的话,在安卓上是能正常在已跳转的页面显示订阅弹窗,在 iOS 上则不会正常显示,而是在上一个页面显示弹窗。所以从用户体验角度以及为了能正常收集到订阅记录,必须等完成订阅后才进行跳转。

3.用户勾选“总是保持以上选择,不再询问”

当用户勾选了“总是保持以上选择,不再询问”时,那么将再也不会唤起这个弹窗。同时,如果选择“取消”,那么以后每次调用这个 api 的时候,都会自动拒绝;如果选择“允许”,则每次都会自动允许授权。

目前,可以使用 wx.getSetting() 来获取用户订阅消息的订阅状态,详情可查看官方文档。所需基础版本库为 2.10.0 ,即微信版本 7.0.9 及以上。

在一些特定元素触发申请订阅权限的条件下(比如上述通过 wx.showModal 来唤起订阅界面),可以根据订阅状态来判断是否触发。使用 wx.getSetting() ,可以获取用户是否有勾选“总是保持以上选择,不再询问”以及对该条订阅消息的订阅状态。当 wx.getSetting() 返回用户拒绝订阅该条订阅消息就不显示 wx.showModal 的引导订阅弹窗。

4.一次订阅可以收集几条订阅消息?

wx.requestSubscribeMessage 一次调用最多可订阅 3 条消息,即 tmplIds 最多为 3 个。iOS 客户端 7.0.6 版本、Android 客户端 7.0.7 版本之后的一次性订阅/长期订阅才支持多个模板消息,iOS 客户端 7.0.5 版本、Android 客户端 7.0.6 版本之前的一次订阅只支持一个模板消息。详情可看官方文档

5.发送订阅消息的参数限制

发送订阅消息必须严格按照「订阅消息参数值内容限制说明」来进行填写。

升级微信订阅消息必知的 5 个细节 | 附实战教程

创建模板的时候,根据选择的关键字不同,在发送订阅消息的时候,需按照上述表格的说明进行填写内容,如不符合参数限制的,则会发送失败。例如,图上的 name.DATA 是10 个以内的纯汉字或 20 个以内的纯字母或符号,如果参数值是 知晓云 2020 则会报 data.name1.value invalid 错误;phrase.DATA 的参数值如果超过 5 个汉字同样是报错。

通过以上的防坑指南,可以让小程序开发者少走些弯路,在 deadline 的最后一刻,也能轻松快速完成升级。接下来将通过知晓云的「知晓推送」,手把手教你如何接入订阅消息。

知晓推送打通不同平台间的消息推送障碍,运营者可以同时将通知推送至微信小程序、QQ 小程序、支付宝小程序、Android、iOS 等多个平台。无需编码,开箱即用,一站式完成用户触达。轻松完成消息推送、用户转化、数据分析等多个层面的工作。”

接入订阅消息

开发者可以在知晓推送页面进入订阅消息接入向导:

升级微信订阅消息必知的 5 个细节 | 附实战教程

前三步与接入微信类似,详情可查看微信小程序接入,在「接入 SDK」处需要填入 AppScret,AppSecret 用于开通模板消息服务,在小程序后台“设置 - 开发设置”中查看。

升级微信订阅消息必知的 5 个细节 | 附实战教程

升级微信订阅消息必知的 5 个细节 | 附实战教程

根据引导进行上报订阅消息。

升级微信订阅消息必知的 5 个细节 | 附实战教程

通过校验后即完成接入。

获取模板 ID

升级微信订阅消息必知的 5 个细节 | 附实战教程

升级微信订阅消息必知的 5 个细节 | 附实战教程

在模板库中搜索合适的模板,点击选用,选择需要的关键词后提交即可完成模板创建。

升级微信订阅消息必知的 5 个细节 | 附实战教程

在「我的模板」可以查看、添加和删除模板,在这里获取模板 ID。

获取下发权限

微信小程序提供了 wx.requestSubscribeMessage 接口来发起申请订阅权限界面。

上报订阅状态的接口

知晓云提供了 wx.BaaS.subscribeMessage(options) SDK 来进行收集订阅状态。

参数说明

升级微信订阅消息必知的 5 个细节 | 附实战教程

Subscription

升级微信订阅消息必知的 5 个细节 | 附实战教程

用户发生点击行为或者发起支付回调后,调起订阅消息界面,通过 SDK 上报订阅状态。

示例代码

在函数内我们会调用微信 API wx.requestSubscribeMessage 申请发送订阅权限,弹窗出来后,我们会收到 success 回调,当用户在弹窗同意订阅后,即上报订阅结果为 accept ,将订阅的 template_id (模板 ID)和 subscription_type(订阅类型)存入 subscription 数组中,最后在调用 SDK 进行上报即可。

升级微信订阅消息必知的 5 个细节 | 附实战教程

  • 目前只支持一次性订阅;
  • 需要上报订阅结果为 accept 的模版 ID。

升级微信订阅消息必知的 5 个细节 | 附实战教程

在「订阅记录」查看和操作收集到的订阅记录。

发送订阅消息

  1. 在线发送
  2. 通过触发器触发
  3. 云函数发送

1.在线发送

升级微信订阅消息必知的 5 个细节 | 附实战教程

通过在「订阅消息」给用户在线发送订阅消息。填入所需的内容,可以选择立即发送或定时发送。

智能过滤

升级微信订阅消息必知的 5 个细节 | 附实战教程

在筛选目标用户时,建议开发者使用智能过滤服务,以保证模板消息的触达率和转化率。

2.通过触发器触发

创建触发器

升级微信订阅消息必知的 5 个细节 | 附实战教程

点击「引擎」-「触发器」即可创建新的触发器。

触发类型:即触发源,每个触发器都只能选定一种触发类型,不同的触发类型可执行的动作选项也不一样。

设置条件

升级微信订阅消息必知的 5 个细节 | 附实战教程

当选定触发类型后,开发者需要指定触发条件来触发后续动作的执行,触发条件与触发类型一一相关,当满足触发条件的时候即可触发该触发器。

设置动作

升级微信订阅消息必知的 5 个细节 | 附实战教程

动作类型选择「发送订阅消息」,与在线发送类似,填入相关内容,通过模板校验后即可完成触发器创建。如果所示,updated_at 存的是字符串,可以使用 {{updated_at | date:"Y年m月d日 H:i"}} 这种 filter 形式进行转换。另外可以点击「添加动作」继续设置动作。

更多内容可查看知晓云-触发器教程

3.通过云函数发送

创建云函数

升级微信订阅消息必知的 5 个细节 | 附实战教程

通过「引擎」-「云函数」-「添加」即可完成云函数的创建。

示例代码

升级微信订阅消息必知的 5 个细节 | 附实战教程

编写完云函数后点击保存即完成云函数的修改。

通过触发器搭配云函数使用

升级微信订阅消息必知的 5 个细节 | 附实战教程

当需要发送的订阅消息逻辑较为复杂时,可以通过编写云函数进行触发。

详情可参考开发文档中的章节《使用云函数发送订阅消息》。

注意事项

发送订阅消息必须严格按照「订阅消息参数值内容限制说明」来进行填写,「在线发送」以及「触发器」设置动作中已有模板对应的参数值限制。如参数值错误,将导致发送失败,发送详情可在「知晓推送」-「日志」处查看。

访问「知晓云」,让你的小程序开发快人一步

扫描下方二维码,关注知晓云公众号,回复「学技术」,即可获得更多小程序开发教程。
升级微信订阅消息必知的 5 个细节 | 附实战教程

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
梦
4年前
微信小程序new Date()转换时间异常问题
微信小程序苹果手机页面上显示时间异常,安卓机正常问题image(https://imghelloworld.osscnbeijing.aliyuncs.com/imgs/b691e1230e2f15efbd81fe11ef734d4f.png)错误代码vardate'2021030617:00:00'vardateT
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Wesley13 Wesley13
3年前
Uber准备放弃自动驾驶,转手卖给前谷歌无人车CTO,估值曾被孙正义炒到72.5亿美元
!(https://oscimg.oschina.net/oscnet/0fe7cb00a0cf4872b022342d1e21d47e.png)杨净发自凹非寺量子位报道|公众号QbitAI最新消息,Uber要出售无人驾驶部门(ATG)了。据TechCrunch报道,Uber有意向出售,而也有人愿意买。
Stella981 Stella981
3年前
Noark入门之协议映射
0x00消息控制器消息控制器,主要作用就是为每个模块提供消息处理的入口.这里的消息不仅仅是协议,还有内部指令,事件等等逻辑入口,这也是为了响应线程模型作出的一种支撑,只要入口在此消息控制器内,那必然走期望的线程调度。@Controller用于标识一个类为当前模块的消息控制器入口.@Controller(threadGroup
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
秃头程序员
秃头程序员
Lv1
路逐山光何处尽,春随草色向南深。
文章
2
粉丝
0
获赞
0