微信小程序订阅消息流程

前言:

每次做订阅消息都是网上粘贴复制,有的时候生效,有的时候不生效,还有可能无法唤起,遇到好多奇奇怪怪得现象,所以花了点时间整理一下,仅供参考。

特征/流程:

【方法】

wx.getSetting,

withSubscriptions: true, 

res.subscriptionsSetting.mainSwitch,

res.subscriptionsSetting.itemSettings,

wx.showModal,

wx.openSetting,

wx.requestSubscribeMessage

【目的】

获取授权状态

【流程】

状态1  总开关开启-已授权模板消息-所有模板消息均已授权(上述方法1条就通过,所以遍历模板id判断)

状态2  总开关开启-已授权模板消息-存在未授权模板消息(上述方法1条就通过,所以遍历模板id判断)

状态3  总开关开启-未授权模板消息

状态4  总开关关闭

状态1_1 -> 下一步(例如提交订单)

状态2_1 -> 提示二次确认弹窗(检测到有订阅消息未开启,是否前往设置?)

状态3_1 -> 唤起授权弹窗(wx.requestSubscribeMessage)

状态4_1 -> 提示二次确认弹窗(检测到您未开启订阅消息,是否前往设置?)

状态2_1_1 -> 取消前往 -> 下一步(例如提交订单)

状态2_1_2 -> 确定 -> 跳转到设置页面(openSetting)

状态3_1_1 -> 不勾选模板,不勾选总是保持以上选择,只能取消

状态3_1_2 -> 不勾选模板,勾选总是保持以上选择,只能取消

状态3_1_3 -> 勾选模板某一条模板,不勾选总是保持以上选择,取消

状态3_1_4 -> 勾选模板某一条模板,不勾选总是保持以上选择,允许

状态3_1_5 -> 勾选模板某一条模板,勾选总是保持以上选择,取消

状态3_1_6 -> 勾选模板某一条模板,勾选总是保持以上选择,允许

状态3_1_7 -> 勾选全部模板,不勾选总是保持以上选择,取消

状态3_1_8 -> 勾选全部模板,不勾选总是保持以上选择,允许

状态3_1_9 -> 勾选全部模板,勾选总是保持以上选择,取消

状态3_1_10 -> 勾选全部模板,勾选总是保持以上选择,允许

状态4_1_1 -> 取消前往 -> 下一步(例如提交订单)

状态4_1_2 -> 确定 -> 跳转到设置页面(openSetting)

状态2_1_2_1 -> 不勾选/取消勾选->返回后-> 下一步(例如提交订单)

状态2_1_2_2 -> 勾选 ->返回后-> 下一步(例如提交订单)

状态3_1_1_1 -> 取消后设置里不会出现模板 -> 下一步(例如提交订单)

状态3_1_2_1 -> 取消后设置里会出现模板,都是不接收状态 -> 下一步(例如提交订单)

状态3_1_3_1 -> 取消后设置里不会出现模板 -> 下一步(例如提交订单)

状态3_1_4_1 -> 允许后设置里不会出现模板(此时的允许是否生效还有待商榷) -> 下一步(例如提交订单)

状态3_1_5_1 -> 取消后设置里会出现模板,都是不接收状态 -> 下一步(例如提交订单)

状态3_1_6_1 -> 允许后 设置里会出现模板,勾选的是接收状态,未勾选的是不接收状态 -> 下一步(例如提交订单)

状态3_1_7_1 -> 取消后设置里不会出现模板 -> 下一步(例如提交订单)

状态3_1_8_1 -> 允许后设置里不会出现模板 -> 下一步(例如提交订单)

状态3_1_9_1 -> 取消后设置里会出现模板,都是不接收状态 -> 下一步(例如提交订单)

状态3_1_10_1 -> 允许后设置里会出现模板,都是接收状态 -> 下一步(例如提交订单)

状态4_1_2_1 -> 开启接收订阅消息总开关

状态4_1_2_2 -> 不开启接收订阅消息总开关

状态4_1_2_1_1 -> 返回后->提示二次确认弹窗(检测到有订阅消息未开启,是否前往设置?)

状态4_1_2_2_1 -> 返回后-> 下一步(例如提交订单)

状态4_1_2_1_1_1 -> 取消 -> 下一步(例如提交订单)

状态4_1_2_1_1_2 -> 确定 -> 状态3_1

总结

授权弹窗不勾选总是保持以上选择按钮,无论选择还是不选择模板,取消或允许,设置里都不会出现模板(选择了模板并且允许是否成功?未知)

授权弹窗勾选总是保持以上选择按,取消后,无论选择全部模板,还是某一个,设置里都会出现模板并且为未接收

授权弹窗勾选总是保持以上选择按,允许后,设置里都会出现模板,状态为勾选状态

在经过了无数次操作后,设置失败和授权失败再次确认后, 基本上形成了闭合。

注意

如果是设置总开关后,返回检测模板未授权无法直接唤起授权弹窗,需要借助二次确认弹窗,确定后才能唤起。

流程截图

总开关

 

模板未开启/未勾选总保持按钮取消

 

模板全部开启/勾选总保持并允许

 

模板部分开启/勾选总保持允许

 

 

 

授权弹窗

完整代码

方法分开写的,为了便于理解,缺点是存在重复性代码,请自行封装和合并

第一步 thia.dingyue();

that.onSubmit(); 是下一步提交方法

// 验证订阅状态
  dingyue(type){
    let that = this;
    wx.getSetting({
      withSubscriptions: true,
      success: function(res) {
        if (res.subscriptionsSetting.mainSwitch) {
          // 用户已开启总开关
          let itemSettings = res.subscriptionsSetting.itemSettings;
          if (itemSettings) {
            // 用户已授权模板消息
            let status = true; 
            //判断模板是否全部授权
            for(let i=0; i<tmplIds.length; i++){
              let key = tmplIds[i];
              if(itemSettings[key] != 'accept'){
                status = false;
                break;
              }
            }
            if(!status){
              that.weidingyue_muban();
            }else{
              that.onSubmit();
            }
          } else {
            // 用户未授权任何模板消息
            if(type == 'kaiguan'){ // 设置返回后提示是否授权模板
              that.onSettingNotSubscribeMessage();
              return;
            }
            that.openSubscribeMessage();
          }
        } else {
          // 用户未开启总开关
          if(type == 'kaiguan'){ // 设置返回后仍未开启进入下一步
            that.onSubmit();
            return;
          }
          that.weidingyue_kaiguan();
        }
      }
    });
  },

  // 未开启订阅 开关
  weidingyue_kaiguan(){
    let that = this;
    wx.showModal({
      title: '提示',
      content: '检测到您未开启订阅消息,是否前往设置?',
      success (res) {
        if (res.confirm) {
          that.openSetting('kaiguan');
        } else if (res.cancel) {
          that.onSubmit();
        }
      }
    })
  },

  // 未开启订阅 模板
  weidingyue_muban(){
    let that = this;
    wx.showModal({
      title: '提示',
      content: '检测到有订阅消息未开启,是否前往设置?',
      success (res) {
        if (res.confirm) {
          that.openSetting('muban');
        } else if (res.cancel) {
          that.onSubmit();
        }
      }
    })
  },

  // 打开设置
  openSetting(type){
    let that = this;
    wx.openSetting({
      success: function(res) {
        // 返回后流程
        if(type == 'muban'){
          that.onSubmit();
        } else if(type == 'kaiguan'){
          // 再次验证订阅状态
          that.dingyue('kaiguan');
        }
      },
      fail: function(err) {
        that.settingFail(type);
      }
    });
  },

  // 设置失败
  settingFail(type){
    let that = this;
    wx.showModal({
      title: '提示',
      content: '设置失败,是否重新设置?',
      success (res) {
        if (res.confirm) {
          that.openSetting(type);
        } else if (res.cancel) {
          that.onSubmit();
        }
      }
    })
  },

  // 设置开启总开关返回后,并未授权的情况(如果不加二次确认弹窗,无法直接唤起授权弹窗)
  onSettingNotSubscribeMessage(){
    let that = this;
    wx.showModal({
      title: '提示',
      content:'检测到有订阅消息未授权,是否授权?',
      success (res) {
        if (res.confirm) {
          that.openSubscribeMessage();
        } else if (res.cancel) {
          that.onSubmit();
        }
      }
    })
  },

  // 唤起授权订阅弹窗
  openSubscribeMessage(){
    let that = this;
    wx.requestSubscribeMessage({
      tmplIds,
      success(res) {
        that.onSubmit();
      },
      fail(err) {
        that.subscribeMessageFail();
      }
    })
  },

  // 授权失败
  subscribeMessageFail(){
    let that = this;
    wx.showModal({
      title: '提示',
      content:'授权失败,是否重新授权?',
      success (res) {
        if (res.confirm) {
          that.openSubscribeMessage();
        } else if (res.cancel) {
          that.onSubmit();
        }
      }
    })
  },

猜你喜欢

转载自blog.csdn.net/m0_61087678/article/details/132173717