微信小程序订阅消息授权弹窗问题整理

文档

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

1.报错10004

  1. errCode: 10004
  2. errMsg: "requestSubscribeMessage:fail Invalid template id"

真机调试也不行

wx.requestSubscribeMessage({tmplIds: result,// 用户同意与否都需要传标识给后端success(res) {
}
[{ "templateId": "MvyaI3UcBWMpjFLcM_4_quuSJDftIsgbJ3ykuD", "title": "福利包到账提醒" },{ "templateId": "sDCqzUaMapgSETh_LHpuf0VuKaLXKMDltrOSlz8YADE", "title": "优惠券过期提醒" },]

原因:tmplIds参数必须是数组

const result = ["MvyaI3UcBWMpjFLcM_4_quuSJDftIsgbJ3ykuD","sDCqzUaMapgSETh_LHpuf0VuKaLXKMDltrOSlz8YADE"]

2.用户第一次拒绝,第二次不掉弹窗直接到success

wx.requestSubscribeMessage接口的success中res参数

我试着加了第三个模板ID:发现第二次弹窗只谈了加的模板id对应的模板title,之前被拒绝过的没有再显示

const result = ["MvyaI3UcBWMpjFLcM_4_quuSJDftIsgbJ3ykuD-bHW4","sDCqzUaMapgSETh_LHpuf0VuKaLXKMDltrOSlz8YADE","PokxmMG5bvk_LK7hrz40qqaliqKzAn6vyKkJPwbN7Sc"]

3.用户选择总是保持以上选择后,点击了拒绝

正常情况下,用户选择了总是保持以上选择后,点击了拒绝,之后就不会再次弹窗,如果下次进入时想要弹窗,需要通过微信小程序wx.openSetting()去引导用户到设置页面主动设置接收订阅消息

主要流程:

  1. 调用后端接口获取需要授权的模板ID;
  2. 通过wx.requestSubscribeMessage调用订阅消息授权弹窗;
  3.  检测到有拒绝授权情况就引导用户去设置页面设置接收订阅消息;
  4. 否则直接调用后端接口将已经同意过的模板进行上报;
/*** 根据pushSceneId场景ID获取没有授权的模板* @param {*} pushSceneId */
function commSubscribeMessage(pushSceneId) {return new Promise((resolve, reject) => {// 根据场景ID获取需要订阅消息的模板// ajax('get', 'api/wechat/auth/unsubscribe/list', {//   pushSceneId// }, ({ code, msg, result }) => {//   console.log('订阅结果上报', code, result)//   // 模板ID不为空才进行授权弹窗//   if (code === 0 && result.length > 0) {// wx.requestSubscribeMessage调起授权订阅消息弹窗// 优惠券// const tmplIds = ["MvyaI3UcBWMpjFLcM_4_quuSJDftIsgbJ3ykuD-bHW4",//   "sDCqzUaMapgSETh_LHpuf0VuKaLXKMDltrOSlz8YADE"]// 活动// const tmplIds = ["PokxmMG5bvk_LK7hrz40qqaliqKzAn6vyKkJPwbN7Sc"]const tmplIds = ["Uc-DA-Jr3N4ih7d5M3PkPrTFOi6t-AX0MGj4S8hvHqU"]// 提单// const tmplIds = ["3d6zsNMfQ3Wpgq1V8duO31v9gE8un7Lka_2E17sJZjs"]wx.requestSubscribeMessage({tmplIds,// 用户同意与否都需要传标识给后端async success(res) {let acceptTmplIds = [];let rejectTmplIds = [];tmplIds.forEach(item=>{if(res[item] === 'accept'){acceptTmplIds.push(item);}else if( res[item] === 'reject'){rejectTmplIds.push(item);}});// 检测到有拒绝授权情况if(rejectTmplIds.length > 0){console.log("引导用户授权");await guideOpenSubscribeMessage(tmplIds,pushSceneId);resolve(true);}else{console.log("用户之前已经同意过授权");await agreeSubscribe(tmplIds,pushSceneId);resolve(true);}},async fail(res) {console.log("用户拒绝授权", res);if (res.errCode == 20004) {// console.log(res, 'fail:用户关闭了主开关,无法进行订阅,引导开启---');await guideOpenSubscribeMessage(tmplIds,pushSceneId);resolve(true);}}})
});
}function guidSubscribeMessageAuthAfter(templateIds) {return new Promise((resolve, reject) => {//引导用户 开启订阅消息 之后,「openSetting」 接口暂时不会返回,用户手动设置后的状态,所以采用「getSetting」接口重新进行查询wx.openSetting({success: res => {console.log(res, "guidSubscribeMessageAuthAfter");}})resolve(true);});
}
function guideOpenSubscribeMessage(templateIds,pushSceneId) {return new Promise((resolve, reject) => {//引导用户,手动引导用户去设置页开启,wx.showModal({title: '提示',content: '检测到您有未开启的订阅消息权限,是否去设置?',showCancel: true,confirmText: '确认',success: function (res) {if (res.confirm) {// 新版禁用,需要通过按钮触发console.log("去设置授权信息");guidSubscribeMessageAuthAfter(templateIds);resolve(true);} else {console.log(`您已拒绝订阅消息授权,无法预约领取`);disagreeSubscribe(templateIds,pushSceneId);resolve(true);}}})
});
}
function agreeSubscribe(templateIds,pushSceneId) {ajax('post', '/api/wechat/auth/subscribe', {templateIds,pushSceneId,allow: 1}, res1 => {console.log('订阅结果上报', res, res1)})
}
function disagreeSubscribe(templateIds,pushSceneId) {ajax('post', '/api/wechat/auth/subscribe', {templateIds,pushSceneId,allow: 0}, res1 => {console.log('用户拒绝授权订阅结果上报', res, res1)})
}

使用:

  async goPage(e) {// 授权订阅消息弹窗await commSubscribeMessage("SC_001");
}

4.不引导用户去设置页面,但是要将用户是否选择过永远选中此项传给后端;且需要传openId和每个模板id都有个是否允许授权订阅的状态

 let openId = wx.getStorageSync('userInfo').openId;

5.弹窗涉及所有成功或失败场景:

  • 1.模板数据超过3个,报错20003
  • 2.用户关闭了总开关(设置里面订阅消息的总开关关闭) 20004
  • 3.之前弹窗过,且选择了拒绝,且选中了永远保持以上选择,只会返回以下信息,不会弹窗

MvyaI3UcBWMpjFLcM_4_quuSJDftIsgbJ3ykuD-bHW4: "reject"
PokxmMG5bvk_LK7hrz40qqaliqKzAn6vyKkJPwbN7Sc: "reject"
Uc-DA-Jr3N4ih7d5M3PkPrTFOi6t-AX0MGj4S8hvHqU: "reject"

  • 4.用户手动在设置页面设置了接收消息,不会弹窗,只会显示一下信息
  1. MvyaI3UcBWMpjFLcM_4_quuSJDftIsgbJ3ykuD-bHW4: "accept"
  2. PokxmMG5bvk_LK7hrz40qqaliqKzAn6vyKkJPwbN7Sc: "accept"
  3. Uc-DA-Jr3N4ih7d5M3PkPrTFOi6t-AX0MGj4S8hvHqU: "accept"
  • 5.所以想在获取用户是否选中了永远保持以上选择需要通过 wx.getSetting 进行获取

6.用户弹窗总流程

1.通过wx.getSetting()判断用户是否选择了"永远保持以上选择",如果选中了,需要通知后端,同时通知后端拒绝或者接受订阅的模板

2.如果用户没有选中,每次都会调用弹窗,调用微信小程序接口wx.requestSubscribeMessage()调起弹窗

7.小程序userId和openId关系

  • userid是用户登录小程序的荷叶的唯一标识
  • openid是小程序账号的唯一标识
  • openid跟手机号没关系的,跟微信号一一对应;
  • 次数限制是订阅一次推一次,看产品意思是userid维度订阅,一天订阅一次是咱们这边业务上的限制,不是微信的限制,微信一天内不限制一次性订阅的次数
  • 还有个场景,如果推送消息也是按userid维度推送,小程序只能登录一个手机号,如果同一个小程序多个手机号登录且订阅授权过,那推送消息的时候,当时小程序登录的只有其中一个手机号,那么其他未登录手机号的订阅消息会在同一个小程序内收到,或者其他手机号在另外的微信上登录,一个userid可能对应多个openid,会在两个小程序上都收到订阅消息
  • 推送消息,使用userid+openid维度进行推送

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/624491.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据平台搭建2024(二)

二:Hive安装 只在node01上操作 1 安装MySQL 8.0 最小化安装需要安装这个 yum install -y wget1-1 下载MySQL的yum源 wget http://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm检查是否安装成功 rpm -qpl mysql80-community-release-el7-7.n…

c++ 中文转拼音的封装, char 类型 不支持 中文 已解决

在日常业务中&#xff0c;需要进行中文转拼音的检索。已便实现对应的 模糊搜索。 使用方法 std::string res "我是中国人";char* result new char[res.length() 1];for (int i 0; i < res.length(); i){result[i] res[i];}result[res.length()] \0;std::str…

(六) 盘古UI,深度封装flexbox,轻松实现各种tag类型,让快速开发更自由!

(六) 盘古UI,深度封装flexbox,PanguFlexBoxView轻松实现各种tag类型,让快速开发更自由! 盘古UI,较为全面的自定义UI框架,帮助你绝对的快速开发!(长期维护中) demo地址,点击查看github 盘古PanguFlexBoxView 可以实现各种tag类型的UI需求,包含颜色和点击选中等! 1, 样例展示…

普通人如何零基础进入AIGC大模型人形机器人赛道,自学攻略,应用转化项目案例

要进入人形机器人赛道&#xff0c;普通人需要了解和掌握一系列的技能和知识&#xff0c;包括机器人设计、编程、电子工程、机械工程以及团队合作和项目管理。以下是一个详细的指南&#xff0c;帮助你从零基础开始&#xff0c;逐步进入这个充满挑战和机遇的领域。 基础教育和技能…

4月16号总结

java学习 网络编程 1.网络分层 网络分层是将网络通信划分为不同的逻辑层次&#xff0c;每一层负责特定的功能&#xff0c;从而实现网络通信的模块化和标准化。常用的网络分层模型包括OSI&#xff08;开放系统互联&#xff09;模型和TCP/IP模型。 特点和作用&#xff1a; 分…

网络安全学习路线-超详细

零基础小白&#xff0c;到就业&#xff01;入门到入土的网安学习路线&#xff01; 在各大平台搜的网安学习路线都太粗略了。。。。看不下去了&#xff01; 建议的学习顺序&#xff1a; 一、网络安全学习普法&#xff08;心里有个数&#xff0c;要进去坐几年&#xff01;&#x…

浅谈Java的synchronized 锁以及synchronized 的锁升级

在Java中&#xff0c;synchronized关键字用于实现线程间的同步&#xff0c;确保同一时刻只有一个线程能够访问被同步的代码块或方法。当一个线程获得synchronized锁定后&#xff0c;其他试图访问同一锁的线程将被阻塞&#xff0c;直到锁被释放。 synchronized锁有两种基本形式…

计算机系列之操作系统的系统

2、大话操作系统的启动 当按下开机键时&#xff0c;BIOS 就会开始执行 ​ BIOS 就是放在主板上 ROM 里面的一段程序。 ​ ROM Read Only Memory&#xff08;只能读取的内存&#xff09; ​ 所以 BIOS 在出厂的时候就可以直接写死在 ROM 里面。 ​ 每次开机的时候&#xff…

牛客网刷题 | BC51 及格分数

描述 KiKi想知道他的考试分数是否通过&#xff0c;请帮他判断。从键盘任意输入一个整数表示的分数&#xff0c;编程判断该分数是否在及格范围内&#xff0c;如果及格&#xff0c;即&#xff1a;分数大于等于60分&#xff0c;是输出“Pass”&#xff0c;否则&#xff0c;输出“…

12.哀家要长脑子了!

1.189. 轮转数组 - 力扣&#xff08;LeetCode&#xff09; ​ 方法一&#xff1a; 要注意这个k是可以大于0的&#xff0c;所以旋转数组的时候要一直保证是在1-n的范围内&#xff1a;%实现 把k个元素旋转放到前面&#xff0c;前面n-k个元素是向后移动的。 class Solution { …

【Leetcode每日一题】 动态规划 - 最小路径和(难度⭐⭐)(58)

1. 题目解析 题目链接&#xff1a;64. 最小路径和 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 算法思路梳理&#xff1a; 一、状态表示 在路径类问题中&#xff0c;状态表示通常有两种形式&#xff1a; 从 [i,…

【电控笔记2.2】电流回路+延迟效应

延迟效应的来源以及影响 数字控制系统的delay: 5.4节有介绍T0=0.5TS 低通滤波器的时间常数? 滤波器的传递函数与性能参数