内容简介:这几天在使用小程序的模板消息推送接口的时候,出现了个报错信息 “the formId is no longer available in develop or trial version”,去文档查看了一下才发现,模板消息功能在今年1月份已经下架了,现在统一都是使用订阅消息:那么这两个功能有什么区别呢?
这几天在使用小程序的模板消息推送接口的时候,出现了个报错信息 “the formId is no longer available in develop or trial version”,去文档查看了一下才发现,模板消息功能在今年1月份已经下架了,现在统一都是使用订阅消息:
那么这两个功能有什么区别呢?
模板消息推送
简单地说,用户每进行一次提交表单或是支付行为,都会产生一个 formId,开发者可以通过这个 formId 向用户推送消息。由于下发权限是在开发者这边,为了防止消息频繁推送对用户造成的骚扰,小程序做出了一个限制:一个 formId 只有 7 天有效期,每推送一次消息会消耗一个 formId,也就是说,正常情况下,开发者 7 天内可以推送的消息数量是有限的。这样当然对用户是友好的,但是对开发者来说,有些业务场景又确实推送多条消息:比如说 A 用户发布一个二手商品,B 用户点击了“感兴趣”,需要推送消息告知 A 用户,同理,C 用户也点击了“感兴趣”,同样需要推送消息告知 A 用户,这种情况下一个 formId 肯定是不够用的。于是在订阅消息出现以前,开发者就使用了一些黑科技来收集 formId:包括基于事件冒泡的多层嵌套表单,以及在小程序里埋藏大量的点击事件等,只要用户点击了就会触发表单提交,生成新的 formId,然后记录下有效期存放到数据库中,方便后续的使用。
不过有不少的黑科技已经被微信官方修复了,而且我们会发现,最终还是回到了起点,仍然没有解决用户受到消息骚扰的问题。微信大概也意识到了这一点,所以推出了订阅消息功能。
订阅消息推送
举个订阅消息的例子:当我们参与某个公众号的抽奖活动之后,会有弹窗提示我们是否接受抽奖结果的信息推送,这个弹窗就属于订阅消息功能的授权环节。
从使用体验来看,订阅消息推送最大的特征就在于,它对于用户和开发者都是友好的。首先,消息下发的权限交还给了用户,由用户自己来决定要不要接受消息推送,不再像之前那样被动接受了;其次,对于我们开发者来说,只需要调用接口询问用户是否接受消息推送即可,只要用户同意,那么我们就可以多次发送消息,不再需要像以前那样费力去收集 formId 了。
使用
首先登录微信公众平台,选择 订阅消息 —— 我的模板 —— 添加,然后根据自己的需求选择一个模板,配置关键字,提交之后即可获得模板对应的模板 Id,这个 Id 稍后调用 api 的时候会用到,当然,同样需要用到的还有关键字对应的参数:
小程序端代码:
let templateId = 'Ite6-mnfTlONu6rd35AJ-SGQYKQgj1WMvjVj0O5h9kE' wx.requestSubscribeMessage({ tmplIds: [templateId], success: (res)=> { // 如果用户点击允许 if(res[templateId] == 'accept'){ console.log('点击了允许') wx.cloud.callFunction({ name:'sendMessage', data:{ templateId, content: this.data.textContent, blogId: this.properties.blogid, } }).then(res => { this.setData({ textContent:'' }) }) } else { console.log('点击了取消') } } fail:(res) => {} })
wx.requestSubscribeMessage
这个 api 主要用来调起弹窗询问用户是否接受消息推送, tmplIds
数组存放各类模板 Id,因为开发者可能不止使用了一个模板。
这里要注意两个地方,第一个是这个 api 只能在点击事件或者触发支付回调后使用, bindsubmit
表单提交事件是用不了的;第二个是,不管用户点击允许还是拒绝,都会来到 success 回调,fail 回调是在 api 本身调用失败后执行的。那么怎么判断用户是点击了允许还是拒绝(取消)呢?如果用户点击了允许,那么 res 中模板 Id 键对应的键值会是 “accept”(反之则是 “reject”),然后调用相应的云函数并传参,进行消息推送。
在云函数中调用相关 api 之前,要先去云函数文件夹下的 config.JSON
文件设置调用权限:
{ "permissions": { "openapi": [ "subscribeMessage.send" ] } }
相关的云函数:
const cloud = require('wx-server-sdk') cloud.init() exports.main = async (event, context) => { const {OPENID} = cloud.getWXContext() return await cloud.openapi.subscribeMessage.send({ touser: OPENID, page: `/pages/blog-comments/blog-comments?blogId=${event.blogId}`, data:{ thing4:{ value:'评价完成' }, thing1:{ value: event.content } }, templateId: event.templateId }) }
主要是用到了 cloud.openapi.subscribeMessage.send()
这个 api,相关的参数就根据自己的实际情况来:这里的 OPENID
是消息发送目标的 openid
, page
则是用户点击消息后进入的页面(这里是评论详情页), data
就对应我们之前在微信公众平台设置的模板关键字,当然,这里要注意使用此前模板提供的键名( thing4
和 thing1
),最后还有一个参数就是我们的模板 Id 啦。其实和之前模板消息的用法是差不多的,只不过我们不再需要传参 fromId 了。
最后,对用户来说,他也可以在弹窗的时候点击允许和记住选择,这样就是默认每次都接受消息推送了,对应的就是默认执行 wx.requestSubscribeMessage
中的 if 代码块。
其实,不谈技术,单从用户的角度来看,这个功能的调整其实是很人性化的,选择权确实本就应该掌握在用户手中,如果用户没有权限拒收不需要的消息,这样的产品还谈什么用户体验呢?在查阅相关资料的时候,也看到了一篇从产品角度分析的 文章 ,感觉写得不错,感兴趣的可以看一看
参考:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 原 荐 MQTT协议的初浅认识之推送订阅
- 设计模式之发布订阅模式(2) Redis实现发布订阅模式
- 设计模式之发布订阅模式(1) 一文搞懂发布订阅模式
- 使用并解析 OPML 格式的订阅列表来转移自己的 RSS 订阅(解析篇)
- Redis订阅与发布
- 消息队列和发布订阅
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
XML Hacks
Michael Fitzgerald / O'Reilly Media, Inc. / 2004-07-27 / USD 24.95
Developers and system administrators alike are uncovering the true power of XML, the Extensible Markup Language that enables data to be sent over the Internet from one computer platform to another or ......一起来看看 《XML Hacks》 这本书的介绍吧!