微信小程序-订阅消息

3,495 阅读5分钟

最近项目中用到了小程序-订阅消息功能,于是开始查阅文档,百度,最后实现订阅消息功能,记录一下如何实现的,温故而知新

功能介绍

  • 订阅消息推送位置:服务通知
  • 订阅消息下发条件:用户自主订阅
  • 订阅消息卡片跳转能力:点击查看详情可跳转至该小程序的页面

2.png

消息类型

1. 一次性订阅消息

一次性订阅消息用于解决用户使用小程序后,后续服务环节的通知问题。用户自主订阅后,开发者可不限时间地下发一条对应的服务消息;每条消息可单独订阅或退订。

2. 长期订阅消息

一次性订阅消息可满足小程序的大部分服务场景需求,但线下公共服务领域存在一次性订阅无法满足的场景,如航班延误,需根据航班实时动态来多次发送消息提醒。为便于服务,我们提供了长期性订阅消息,用户订阅一次后,开发者可长期下发多条消息。

订阅消息语音提醒

当前小程序订阅消息通知与微信消息的通知的提示音是一样的,对于部分订阅消息模板,增加语音提醒能力,播报预料部分字段支持开发者定义。

当开发者调用wx.requestSubscribeMessage时仅订阅1条消息且该模板支持开启语音提醒,用户在订阅时可以选择开启语音提醒。开启后将在接收订阅消息时会同步播报语音提醒。当用户开启了语音提醒,该模板的订阅状态为'acceptWithAudio'。

只支持银行-收款到账通知

使用说明

一:获取模板 ID

在微信公众平台手动配置获取模板 ID: 登录 mp.weixin.qq.com 获取模板,如果没有合适的模板,可以申请添加新模板,审核通过后可使用。

二:获取下发权限

wx.requestSubscribeMessage(Object object)

调起客户端小程序订阅消息界面,返回用户订阅消息的操作结果。当用户勾选了订阅面板中的“总是保持以上选择,不再询问”时,模板消息会被添加到用户的小程序设置页,通过 wx.getSetting 接口可获取用户对相关模板消息的订阅状态

参数 Object object
属性类型默认值必填说明
tmplIdsArray需要订阅的消息模板的id的集合,一次调用最多可订阅3条消息(注意:iOS客户端7.0.6版本、Android客户端7.0.7版本之后的一次性订阅/长期订阅才支持多个模板消息,iOS客户端7.0.5版本、Android客户端7.0.6版本之前的一次订阅只支持一个模板消息)消息模板id在[微信公众平台(mp.weixin.qq.com)-功能-订阅消息]中配置。每个tmplId对应的模板标题需要不相同,否则会被过滤。
successfunction接口调用成功的回调函数
failfunction接口调用失败的回调函数
completefunction接口调用结束的回调函数(调用成功、失败都会执行)
object.success 回调函数

参数 Object res

属性类型说明
errMsgString接口调用成功时errMsg值为'requestSubscribeMessage:ok'
[TEMPLATE_ID: string]String[TEMPLATE_ID]是动态的键,即模板id,值包括'accept'、'reject'、'ban'、'filter'。'accept'表示用户同意订阅该条id对应的模板消息,'reject'表示用户拒绝订阅该条id对应的模板消息,'ban'表示已被后台封禁,'filter'表示该模板因为模板标题同名被后台过滤。例如 { errMsg: "requestSubscribeMessage:ok", zun-LzcQyW-edafCVvzPkK4de2Rllr1fFpw2A_x0oXE: "accept"} 表示用户同意订阅zun-LzcQyW-edafCVvzPkK4de2Rllr1fFpw2A_x0oXE这条消息

三:调用接口下发订阅消息

subscribeMessage.send

请求地址
POST https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=ACCESS_TOKEN
请求参数
属性类型默认值必填说明
access_token / cloudbase_access_tokenstring接口调用凭证
touserstring接收者(用户)的 openid
template_idstring所需下发的订阅模板id
pagestring点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转。
dataObject模板内容,格式形如 { "key1": { "value": any }, "key2": { "value": any } }
miniprogram_statestring跳转小程序类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版
langstring进入小程序查看”的语言类型,支持zh_CN(简体中文)、en_US(英文)、zh_HK(繁体中文)、zh_TW(繁体中文),默认为zh_CN

接口限制

次数限制:开通支付能力的是3kw/日,没开通的是1kw/日

html代码

<button bindtap="openMsg" class="wx-btn">订阅消息</button>

js代码

// 是否设置过授权
    openMsg() {
        var that = this;
        // 获取用户的当前设置,判断是否点击了“总是保持以上,不在询问”
        wx.getSetting({
            withSubscriptions: true, // 是否获取用户订阅消息的订阅状态,默认false不返回
            success(res) {
                if (res.authSetting['scope.subscribeMessage']) { // 用户点击了“总是保持以上,不再询问”
                    wx.openSetting({ // 打开设置页
                        success(res) {
                            console.log(res.authSetting)
                        }
                    });
                } else { // 用户没有点击“总是保持以上,不再询问”则每次都会调起订阅消息
                    that.applyMessage();
                }
            }
        })
    },
// 发送消息
applyMessage(e) {
        return new Promise((resolve, reject) => {
            if (!wx.requestSubscribeMessage) {
                resolve()
                return
            }
            // #if
            wx.requestSubscribeMessage({
                tmplIds: [app.globalData.TemplateId],
                success: (res) => {
                    if (res[app.globalData.TemplateId] === 'accept') {
                        wx.showToast({
                            title: '订阅成功!',
                            duration: 1000,
                            success(data) {
                                // 成功
                                resolve()
                            }
                        })
                    } else {
                        wx.showModal({
                            content: '未授权发送通知,您将收不到通知!',
                            confirmText: '重新授权',
                            cancelText: '取消授权',
                            success: (res) => {
                                if (res.confirm) {
                                    reject()
                                    this.request_order = false;
                                    this.applyMessage()
                                } else {
                                    resolve()
                                }
                            }
                        })
                    }
                },
                fail: (err) => {
                    wx.showModal({
                        content: '未授权发送通知,请到小程序设置界面开启订阅',
                        confirmText: '去开启',
                        cancelText: '暂不开启',
                        success: (res) => {
                            if (res.confirm) {
                                reject()
                                wx.openSetting()
                            } else {
                                resolve()
                            }
                        }
                    })
                }
            })
            // #endif
            resolve();
        })
    },

以上就是订阅消息的全部代码了,希望对你有所帮助!