小程序订阅消息前端流程

前言

在开发小程序订阅消息遇到以下问题:

  • 官方文档写的不详细,很多接口返回情况及测试场景都没有给出详细的说明
  • 长期订阅每个消息模板订阅后不能再触发弹窗,测试成本高
  • 对于长期订阅与一次性订阅,接口返回情况还不一致

所以对以上问题进行梳理,方便了解。

调试

由于长期订阅消息只能弹一次窗,所以难以测试,但还好开发者工具给我们提供了清除授权的操作,清除了后我们可以再次发起弹窗请求,但需要注意,开发者工具中订阅授权接口返回跟真机有所差别。例如:弹窗点击取消返回的数据不是在fail回调里面,但是真机是在fail回调中返回的。所以可以在开发中工具中清除授权,然后在真机中测试,也是可以触发弹窗的(需要有开发者权限)。

7.png

订阅消息类型

  • 一次性订阅:用户订阅后,每次只能下发一条对应的服务消息,每条消息可单独订阅或退订;后续想再下发消息需要用户再进行主动订阅操作
  • 长期订阅:用户订阅一次后,开发者可长期下发多条消息,仅向政务民生、医疗、交通、金融、教育等线下公共服务开放;后续不需要用户再进行主动订阅操作

几种场景说明

  • 小程序设置页-订阅消息-接收通知按钮关闭/开启


    5.png
  • 小程序设置页-订阅消息-接收通知按钮开启-消息模板接收/不接收


    3.png
  • 长期订阅弹窗


    1.png
  • 一次性订阅弹窗


    6.png

长期订阅的状态及接口返回

场景 调用授权接口是否弹窗 弹窗操作 授权接口结果返回
未订阅-接收通知按钮关闭 × - fail回调
未订阅-接收通知按钮开启 授权弹窗点击取消 fail回调
未订阅-接收通知按钮开启 授权弹窗点击允许,后续不弹窗 success回调
未订阅-接收通知按钮开启 授权弹窗点击”拒绝,不再询问“,后续不弹窗 success回调
已订阅-接收通知按钮关闭 × - fail回调
已订阅-接收通知按钮开启 × - success回调

假设我需要授权的两条消息模板id为A1和A2

  • 未订阅长期订阅消息

    1. 【接收通知按钮关闭】调用wx.getSetting获取的订阅状态,mainSwitch=false;调用wx.requestSubscribeMessage 授权订阅,不会有订阅弹窗!
    // wx.getSetting获取的订阅状态
    {
        itemSettings: {} // 没有需要授权消息模板的id,代表未订阅
        mainSwitch: false
    }
    

    注意!调用授权接口,这里是fail回调返回的,如果用了await调用接口,需要做try catch处理,否则会直接抛出异常

    // wx.requestSubscribeMessage接口返回
    {
        errCode: 20004
        errMsg: "requestSubscribeMessage:fail The main switch is switched off"
    }
    
    2.png
    1. 【接收通知按钮开启】调用wx.getSetting获取的订阅状态,mainSwitch=true;调用wx.requestSubscribeMessage 授权订阅,会有订阅弹窗!
    // wx.getSetting获取的订阅状态
    {
        itemSettings: {}  // 没有需要授权消息模板的id,代表未订阅
        mainSwitch: true
    }
    
    1.png

    【调用授权接口,有弹窗,点击取消】注意!调用授权接口,这里是fail回调返回的,如果用了await的调用接口语法,需要做try catch处理

    // wx.requestSubscribeMessage接口返回
    {
        errMsg: "requestSubscribeMessage:fail cancle"
    }
    
    4.png

    【调用授权接口,有弹窗,点击”拒绝,不再询问“】会把授权的消息模板都设置为【reject】状态

    // wx.requestSubscribeMessage接口返回
    {
        A1: "reject"
        A2: "reject"
        errMsg: "requestSubscribeMessage:ok"
    }
    

    【调用授权接口,有弹窗,点击允许】根据勾选消息模板情况设置对应的模板id为【accept】状态

    // wx.requestSubscribeMessage接口返回
    {
        A1: "accept"
        A2: "accept"
        errMsg: "requestSubscribeMessage:ok"
    }
    
  • 已订阅长期订阅消息

    1. 【接收通知按钮关闭】,调用wx.getSetting获取的订阅状态,mainSwitch=false;调用wx.requestSubscribeMessage 授权订阅,不会有订阅弹窗!
    // wx.getSetting获取的订阅状态
    {
        A1: "reject"
        A2: "accept"
        itemSettings: {
            A1: "reject", 
            A2: "accept",
        }
        mainSwitch: false
    }
    

    注意!调用授权接口,这里是fail回调返回的,如果用了await调用接口,需要做try catch处理,否则会直接抛出异常

    // wx.requestSubscribeMessage接口返回
    {
        errCode: 20004
        errMsg: "requestSubscribeMessage:fail The main switch is switched off"
    }
    
    2.png
    1. 【接收通知按钮开启,已订阅过的消息都设置为不接收】调用wx.getSetting获取的订阅状态,mainSwitch=true;调用wx.requestSubscribeMessage 授权订阅,不会有订阅弹窗!
    // wx.getSetting获取的订阅状态
    {
        A1: "reject"
        A2: "reject"
        itemSettings: {
            A1: "reject", 
            A2: "reject",
        }
        mainSwitch: true
    }
    // wx.requestSubscribeMessage接口返回
    {
        A1: "reject"
        A2: "reject"
        errMsg: "requestSubscribeMessage:ok"
    }
    
    1. 【接收通知按钮开启,已订阅过的消息都设置为接收】调用wx.requestSubscribeMessage授权订阅,不会有订阅弹窗!
    // wx.getSetting获取的订阅状态
    {
        A1: "accept"
        A2: "accept"
        itemSettings: {
            A1: "accept", 
            A2: "accept",
        }
        mainSwitch: true
    }
    // wx.requestSubscribeMessage接口返回
    {
        A1: "accept"
        A2: "accept"
        errMsg: "requestSubscribeMessage:ok"
    }
    

总结一下长期订阅:

  • 只有在接收通知按钮开启,并且wx.getSetting返回中不存在待订阅的模板id时,调用wx.requestSubscribeMessage授权订阅才会有弹窗
  • 只要已订阅过长期订阅,后续无论怎么操作调用wx.requestSubscribeMessage授权订阅都不会有弹窗
  • 需要注意在【有弹窗并点击取消】或者【接收通知按钮关闭】的情况,错误消息会在fail回调中返回,await调用时,需要做try catch处理,否则会直接抛出异常

一次性订阅的状态及返回

官方文档:当用户勾选了订阅面板中的“总是保持以上选择,不再询问”时,模板消息会被添加到用户的小程序设置页,通过 wx.getSetting 接口可获取用户对相关模板消息的订阅状态。

一次性消息订阅调用wx.requestSubscribeMessage授权订阅始终有弹窗(不论用户是否订阅过),除非用户点击勾选了订阅面板中的“总是保持以上选择,不再询问”时,相当于把模板id当长期订阅的方式处理了,后续调用授权接口就不会再弹窗。

场景 调用授权接口是否弹窗 弹窗操作 授权接口结果返回
未订阅-接收通知按钮关闭 × - fail回调
未订阅-接收通知按钮开启 授权弹窗点击取消 success回调
未订阅-接收通知按钮开启 授权弹窗点击允许 success回调
未订阅-接收通知按钮开启 授权弹窗点击”总是保持以上选择,不再询问“,后续不弹窗 success回调
已订阅-接收通知按钮关闭 × - fail回调
已订阅-接收通知按钮开启-不勾选“总是保持以上选择,不再询问” - success回调
已订阅-接收通知按钮开启-勾选“总是保持以上选择,不再询问” × - success回调

在接口返回方面,跟长期订阅还是不同,遇到有些区别(坑)如下:

6.png
  1. 【点击取消】消息不在fail回调中返回,在success中,且返回模板状态为reject
// wx.requestSubscribeMessage接口返回
{
    A1: "reject"
    A2: "reject"
    errMsg: "requestSubscribeMessage:ok"
}
// wx.getSetting获取的订阅状态
{
    itemSettings: {} // 相当于未订阅一样,下次调用授权接口还有弹窗
    mainSwitch: true
}
  1. 【点击允许】
// wx.requestSubscribeMessage接口返回
{
    A1: "accept"
    A2: "accept"
    errMsg: "requestSubscribeMessage:ok"
}
// wx.getSetting获取的订阅状态
{
    itemSettings: {}
    mainSwitch: true
}
  1. 【点击”总是保持以上选择,不再询问“】勾选相关模板允许授权订阅,后续调用授权接口不弹窗
// wx.requestSubscribeMessage接口返回
{
    A1: "accept"
    A2: "accept"
    errMsg: "requestSubscribeMessage:ok"
}
// wx.getSetting获取的订阅状态
{
    A1: "accept"
    A2: "accept"
    itemSettings: {
        A1: "accept", 
        A2: "accept",
    }
    mainSwitch: true
}
  1. 【接收通知按钮关闭】调用wx.getSetting获取的订阅状态,mainSwitch=false;调用wx.requestSubscribeMessage 授权订阅,不会有订阅弹窗!
    // wx.getSetting获取的订阅状态
    {
        itemSettings: {} // 没有需要授权消息模板的id,代表未订阅
        mainSwitch: false
    }
    
    注意!调用授权接口,这里是fail回调返回的,如果用了await调用接口,需要做try catch处理,否则会直接抛出异常
    // wx.requestSubscribeMessage接口返回
    {
        errCode: 20004
        errMsg: "requestSubscribeMessage:fail The main switch is switched off"
    }
    

长期订阅处理逻辑

微信消息订阅流程图.png

最后

看似小小功能亦有其复杂之处,上文如有不正确之处,敬请指出,望看后能少踩坑~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,529评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,015评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,409评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,385评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,387评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,466评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,880评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,528评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,727评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,528评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,602评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,302评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,873评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,890评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,132评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,777评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,310评论 2 342

推荐阅读更多精彩内容