问:小程序订阅消息用户拒绝后,如何引导用户开启?并获得用户的操作状态?

本文介绍了当用户拒绝小程序订阅消息后,如何通过API调用来引导用户重新开启订阅,并在用户开启后获取其状态。文章讨论了wx.requestSubscribeMessage的使用和回调问题,提出了一种在授权回调中再次调用API以获取用户操作状态的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

有些时间没折腾小程序了,话说年前小程序就发布了消息,于1月10日会下线模板消息下发功能,所有的订阅消息都要用户手动触发确认同意,这可就太难了,之前的 wx.openSettingwx.getPhoneNumberwx.getUserInfo等等API的调整,可把我折腾惨了,这次又来……

难道直接js调用,不爽吗?非要整手动确认,爽是肯定的,但如果从一个用户的角度出发,自己啥都没干,你就把我信息获取了、天天给我推一堆垃圾信息,那肯定不爽了,所以从这角度看,微信的调整也是为了尊重用户的隐私,毕竟用户第一嘛

今天主要是想分享一下,今天在处理这个订阅消息逻辑时,遇到当用户拒绝后,如何重新引导开启 「订阅消息」通知的问题,并在开启后获取到它的状态

如果你处理过小程序的订阅消息,应该是知道的,在用户拒绝或关闭消息总开关之后,我们引导用户手动开启「订阅消息」功能(也就是openSettingAPI的调用回调里,是拿不到scope.subscribeMessage状态的),开始我也纠结了很久,百度、google都用上了,同样发现很多的同学也有遇到这样的问题,而都没有找到解决方案,最后在我快要放弃的时候却突然灵光一闪,想到了个办法,所以抖胆BB几句,分析一下:

温馨提示:书读的少,却又喜欢瞎BB几句,内容仅为个人解决方案的思路,仅供参考,不足之处请见谅,勿喷,谢谢~

授权API示例

首先来看下调用的示例:


wx.requestSubscribeMessage({
   
  tmplIds: ['模版id'],
  success (res) {
   

  }
})

同时官方也说了,success 回调的模版对应有三种状态:

  1. accept = 同意
  2. reject = 拒绝
  3. ban = 后台封禁

fail 也有对应的状态码,如下:

errCode errMsg 说明
10001 TmplIds can't be empty 参数传空了
10002 Request list fai 网络问题,请求消息列表失败
10003 Request subscribe fail 网络问题,订阅请求发送失败
10004 Invalid template id 参数类型错误
10005 Cannot show subscribe message UI 无法展示 UI,一般是小程序这个时候退后台了导致的
20001 No template data return, verify the template id exist 没有模板数据,一般是模板 ID 不存在 或者和模板类型不对应 导致的
20002 Templates type must be same 模板消息类型 既有一次性的又有永久的
20003 Templates count out of max bounds 模板消息数量超过上限
20004 The main switch is switched off 用户关闭了主开关,无法进行订阅
20005 This mini program was banned from subscribing messages 小程序被禁封

本次要讲的是errorCode 20004reject状态时,

根据以往经验,如果拒绝了,我们肯定是使用直接使用 openSetting,引导用户进行手动开启授权(),比如:

//以微信运动为例
export default class Sign extends wepy.page {
   
  config = {
   
    navigationBarBackgroundColor: '#fff',
    navigationBarTitleText: '赢积分',
  };
  components = {
   
    Toast: Toast,
    Modals: Modals
  };
  methods = {
   
  };
  data = {
   
    signHistory: []
  };
  getRunData() {
   
    wx.getWeRunData({
   
      success: res => {
   
        ……处理运动步数逻辑
      }
    });
  }
  setAuth() {
   
    wx.getSetting({
   
      success: res => {
   
        //第一步,检测是否有授权 - 没有授权
        if (!res.authSetting['scope.werun']) {
   
          //第二步,开始授权,但这里有一个坑点(腾讯的bug),之前授权过但是是拒绝,所以会进入失败
          wx.authorize({
   
            scope: 'scope.werun',
            success: () => {
   
              this.getRunData();
            },
            fail: () => {
   
              //第三步,引导用户,手动引导用户点击按钮,去设置页开启,## Modals是自定义组件
              this.$invoke('Modals', '__modalConfirm__', [
                '检测到您没有打微信运动的权限,是否去设置?',
                'openSetting',
                //第四步,进入设置页的回调 - 成功
                res => {
   
                  let {
    authSetting } = res.detail
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值