> 技术文档 > 【微信小程序】订阅消息的一次性订阅 vs 长期订阅?其实一次性订阅也能实现长期发布订阅消息_微信小程序一次性订阅和长期订阅

【微信小程序】订阅消息的一次性订阅 vs 长期订阅?其实一次性订阅也能实现长期发布订阅消息_微信小程序一次性订阅和长期订阅


文章目录

  • 前言
    • 为何要订阅消息 & 订阅的好处
  • 一、一次性订阅 & 长期订阅
  • 二、操作步骤
    • 1. 创建模板
    • 2. 前端授权订阅消息
    • 3. 后端发送订阅消息
      • 引入依赖
      • 配置 application.yaml
      • 定义实体类
      • 发送请求
      • 拓展实现
  • 总结
  • 细节
    • 1. 为什么发请求不传 ACCESS_TOKEN?
    • 2. 我怎么知道用户授权订阅消息了没?

前言

为何要订阅消息 & 订阅的好处

相信你也曾被微信的服务通知所骚扰过(bushi)…

没错,微信的订阅消息会发送到用户的服务通知处;

服务通知不同于公众号/服务号等通知;

“服务通知”:属于强提醒,会以大红点的形式出现,而且还会在手机/电脑提醒消息

“公众号/服务号”:属于弱提醒,只会以小红点的形式出现,不会在手机/电脑中提醒。

如图(对比):

【微信小程序】订阅消息的一次性订阅 vs 长期订阅?其实一次性订阅也能实现长期发布订阅消息_微信小程序一次性订阅和长期订阅

因此,订阅消息的好处就不言而喻了,最显然的就是:提高用户的转化率


一、一次性订阅 & 长期订阅

一次性订阅:用户订阅后,在任意时间发一次消息给用户,不能发第二次。

长期订阅:用户订阅后,可长期发送多条信息。(但是这个要求行业和资质高,只有特定的几个类目才能选)

那么如何实现一次性订阅也能长期发送多条消息呢?

如图:

当你调用wx.requestSubscribeMessage接口时(最多可传入3个模板id),就会触发授权弹窗。

注意!细节来了!

弹窗授权为发送一次以下消息(即一次性订阅);
而下方的总是保持以上选择是默认的选择项(字体这么小而且还是灰色的,是不是不容易发现0.0);

简单来讲:授权发送一次以下消息 + 总是保持以上选择 = 只要你授权一次,我就可以无限次发订阅消息

但是需要用户手动开启授权模板,如下图留言通知/榜单更新通知/新活动通知的授权按钮默认是关闭的

虽然说是这么说,但是可以通过诱导(引导)用户来开启,如:不开启可能会导致功能无法使用…
(懂的都懂)

【微信小程序】订阅消息的一次性订阅 vs 长期订阅?其实一次性订阅也能实现长期发布订阅消息_微信小程序一次性订阅和长期订阅

二、操作步骤

接下来是简单的代码实现,具体的可以自己添加更多的业务逻辑

1. 创建模板

进入微信小程序后台—“基础功能”—“订阅消息”,进入\"公共模板库\"挑选合适的模板后,得到模板ID。

【微信小程序】订阅消息的一次性订阅 vs 长期订阅?其实一次性订阅也能实现长期发布订阅消息_微信小程序一次性订阅和长期订阅

2. 前端授权订阅消息

微信官方文档:小程序订阅消息(用户通过弹窗订阅)开发指南

使用 uni.requestSubscribeMessage 发起授权,传参为模板ID,若有多个则需要传数组。
(最多授权3个模板ID)

注:开发时使用了uni-app框架,微信官方的API为 wx.requestSubscribeMessage,效果是一致的。

代码如下(示例):

Tip:可以在关键业务按钮埋下授权订阅消息代码让用户授权,但也要注意用户体验。

// 创建问题const createQuestion = async () => {  // 检查模板消息订阅权限 try {  const subscribeResult = await uni.requestSubscribeMessage({  tmplIds: [ \'模板ID-1xxxxxx\', \'模板ID-2xxxxxx\', ], }) if (subscribeResult.errMsg === \'requestSubscribeMessage:ok\') {  // 用户同意了订阅或已经订阅过,继续创建问题 await handleCreateQuestion() } else {  // 用户拒绝了订阅,显示提示后继续创建 uni.showModal({  title: \'订阅提醒\', content: \'为了及时接收回复通知,建议您开启订阅消息\', confirmText: \'确定\', success: async (res) => {  if (res.confirm) {  // 用户点击确定,继续创建问题 await handleCreateQuestion() } }, })