微信小程序订阅
微信小程序订阅
摘要
1.基于promise封装微信小程序订阅
2.解决由于微信基础库版本低下的兼容
3.解决“总是保持以上选择,不再询问”的取消状态
主要运用API:
主要功能:
总代码
/**
* @desc 小程序订阅功能
* @param {Array} tmplIds 订阅列表
* @returns {Promise} 返回promise
*/ // 永久关闭订阅则代表点击了我不在接受此消息,再次订阅是无法弹起授权窗口的。普通关闭时可以再次弹起授权窗口。 export const Subscribe = (tmplIds = []) => {
return new Promise((resolve, reject) => {
// 判断是否为微信小程序,不是的不做订阅进行跳过
let isWx = false;
// #ifdef MP-WEIXIN
isWx = true;
// #endif
if (!isWx) resolve(1);
console.log('进来了哟')
// 判断基本库是否在2.8.3,低于的暂时不做订阅进行跳过
const versionCan = compareVersion("2.8.3");
if (versionCan === -1) resolve(1);
// 主流程
requestSubscribe(tmplIds, resolve, reject)
}) }
// 申请订阅功能
function requestSubscribe(tmplIds, resolve, reject) {
uni.requestSubscribeMessage({
tmplIds,
success: async res => {
// 检查订阅数量
let checkSubscribeBool = await checkSubscribeAll(tmplIds, res);
if (checkSubscribeBool) {
// 用户完成订阅
console.log("[用户完成订阅]")
resolve(1);
} else {
// 跳去检查永久关闭订阅还是普通关闭订阅
guidSubscribeMessageAuthAfter(tmplIds, resolve, reject);
}
},
fail: res => {
console.log(res, "订阅,失败");
if (res.errCode == 20004) {
// console.log(res, 'fail:用户关闭了主开关,无法进行订阅,引导开启---');
guideOpenSubscribeMessage(tmplIds, resolve, reject);
}
return
}
})
} // 计算用户订阅消息的数量
function checkSubscribeAll(tmplIds, res) {
// 将accept的生成一个数组,判断申请的订阅消息是不是已经订阅消息的子集
let arr = [];
for (const key of Object.keys(res)) {
if (res[key] === 'accept') {
arr.push(key);
}
}
if (arr.length == tmplIds.length) {
console.log('订阅完毕')
return true
} else {
console.log('没订阅或者少订阅')
return false
} } // 检查用户是否授权完毕(检查时永久关闭还是普通关闭)
function guidSubscribeMessageAuthAfter(tmplIds, resolve, reject) {
uni.getSetting({
withSubscriptions: true,
success: async res => {
let {
authSetting = {},
subscriptionsSetting: { mainSwitch = false, itemSettings = {} } = {}
} = res;
if (Object.keys(itemSettings).length == 0) { // 这种情况是普通关闭
uni.showModal({
title: "温馨提示",
content: "同意订阅才能及时获知完成进度领取优惠",
confirmText: "重新订阅",
cancelText: "我再看看",
success: res => {
if (res.confirm) {
// 重新调起授权订阅
requestSubscribe(tmplIds, resolve, reject);
} else if (res.cancel) {
//没成功订阅,返回reject
reject(2);
}
}
});
} else { // 这种是订阅成功或永久关闭
let checkSubscribeBool = await checkSubscribeAll(tmplIds, itemSettings);
if (
authSetting["scope.subscribeMessage"] ||
(mainSwitch && checkSubscribeBool)
) {
//成功
console.log("用户手动开启同意了,订阅消息");
resolve(1);
} else {
//失败,永久关闭
guideOpenSubscribeMessage(tmplIds, resolve, reject);
}
}
}
});
} //引导用户重新授权(永久关闭的方法)
function guideOpenSubscribeMessage(tmplIds, resolve, reject) {
// console.log(resolve, reject, 'rescovavasr1')
uni.showModal({
title: "温馨提示",
content: "检测到您没有开启全部订阅消息的权限,是否去设置?",
success: res => { if (res.confirm) {
uni.openSetting({
success: res => {
// 在检查是否全部订阅完毕
guidSubscribeMessageAuthAfter(tmplIds, resolve, reject);
}
});
} else if (res.cancel) {
// console.log(resolve, reject, 'rescovavasr2')
uni.showModal({
title: "温馨提示",
content: "同意订阅才能及时获知完成进度领取优惠",
showCancel: false,
confirmText: "我知道了"
});
reject(2);
}
}
});
} // 比较版本号
function compareVersion(v2) {
let { SDKVersion: v1 } = uni.getSystemInfoSync();
v1 = v1.split(".");
v2 = v2.split(".");
const len = Math.max(v1.length, v2.length); while (v1.length < len) {
v1.push("0");
}
while (v2.length < len) {
v2.push("0");
} for (let i = 0; i < len; i++) {
const num1 = parseInt(v1[i]);
const num2 = parseInt(v2[i]); if (num1 > num2) {
return 1;
} else if (num1 < num2) {
return -1;
}
} return 0;
}
思路流程解析
这是第一步,封装promise,返回订阅成功和订阅失败的回调。以及判断版本号是否低于2.8.3,低于2.8.3是只能使用一个模板id的,可以考虑做兼容。这边内部原因就跳过不做订阅。然后走入主流程requestSubscribe(tmplIds, resolve, reject),带入模板id和俩个回调
return new Promise((resolve, reject) => {
// 判断是否为微信小程序,不是的不做订阅进行跳过
let isWx = false;
// #ifdef MP-WEIXIN
isWx = true;
// #endif
if (!isWx) resolve(1);
console.log('进来了哟')
// 判断基本库是否在2.8.3,低于的暂时不做订阅进行跳过
const versionCan = compareVersion("2.8.3");
if (versionCan === -1) resolve(1);
// 主流程
requestSubscribe(tmplIds, resolve, reject)
})
这是第二步,订阅api。api走通就success,报错走fail。 主要看success,返回一个res,大家可以打印看看,里面就一个对象,键是id,订阅成功的值是accept,执行一波判断数量函数,符合长度说明用户全部订阅,就放行。
当然点击了“总是保持以上选择,不再询问”也是走到这里面,然后值都是订阅失败的。这里走去检查看看是否点击了“总是保持以上选择,不再询问”。
// 申请订阅功能
function requestSubscribe(tmplIds, resolve, reject) {
uni.requestSubscribeMessage({
tmplIds,
success: async res => {
// 检查订阅数量
let checkSubscribeBool = await checkSubscribeAll(tmplIds, res);
if (checkSubscribeBool) {
// 用户完成订阅
console.log("[用户完成订阅]")
resolve(1);
} else {
// 跳去检查永久关闭订阅还是普通关闭订阅
guidSubscribeMessageAuthAfter(tmplIds, resolve, reject);
}
},
fail: res => {
console.log(res, "订阅,失败");
if (res.errCode == 20004) {
// console.log(res, 'fail:用户关闭了主开关,无法进行订阅,引导开启---');
guideOpenSubscribeMessage(tmplIds, resolve, reject);
}
return
}
})
}
第三步 getsettingApi,检查用户是否点击了“总是保持以上选择,不再询问”,判断的条件就是返回的res有没有itemSettings,当然大家可以找俩种情况比对一下就知道了,永久关闭的是有的那个对象的,普通关闭是没有的。
判断这个目的,是可以直接在调起订阅界面。可以引导用户重新点击。当然如果调不起就走guideOpenSubscribeMessage函数。
// 检查用户是否授权完毕(检查时永久关闭还是普通关闭)
function guidSubscribeMessageAuthAfter(tmplIds, resolve, reject) {
uni.getSetting({
withSubscriptions: true,
success: async res => {
let {
authSetting = {},
subscriptionsSetting: { mainSwitch = false, itemSettings = {} } = {}
} = res;
if (Object.keys(itemSettings).length == 0) { // 这种情况是普通关闭
uni.showModal({
title: "温馨提示",
content: "同意订阅才能及时获知完成进度领取优惠",
confirmText: "重新订阅",
cancelText: "我再看看",
success: res => {
if (res.confirm) {
// 重新调起授权订阅
requestSubscribe(tmplIds, resolve, reject);
} else if (res.cancel) {
//没成功订阅,返回reject
reject(2);
}
}
});
} else { // 这种是订阅成功或永久关闭
let checkSubscribeBool = await checkSubscribeAll(tmplIds, itemSettings);
if (
authSetting["scope.subscribeMessage"] ||
(mainSwitch && checkSubscribeBool)
) {
//成功
console.log("用户手动开启同意了,订阅消息");
resolve(1);
} else {
//失败,永久关闭
guideOpenSubscribeMessage(tmplIds, resolve, reject);
}
}
}
});
}
第四步,用户永久关闭了订阅,我们可以用openSetting打开。这时候订阅消息是会出来没订阅的模板的。重新引导...这样就结束了这个封装啦!
//引导用户重新授权(永久关闭的方法)
function guideOpenSubscribeMessage(tmplIds, resolve, reject) {
// console.log(resolve, reject, 'rescovavasr1')
uni.showModal({
title: "温馨提示",
content: "检测到您没有开启全部订阅消息的权限,是否去设置?",
success: res => { if (res.confirm) {
uni.openSetting({
success: res => {
// 在检查是否全部订阅完毕
guidSubscribeMessageAuthAfter(tmplIds, resolve, reject);
}
});
} else if (res.cancel) {
// console.log(resolve, reject, 'rescovavasr2')
uni.showModal({
title: "温馨提示",
content: "同意订阅才能及时获知完成进度领取优惠",
showCancel: false,
confirmText: "我知道了"
});
reject(2);
}
}
});
}
大家觉得有什么奇怪的,欢迎和我讨论
微信小程序订阅的更多相关文章
- 微信小程序订阅消息,我踩过的坑都在这里了!
旧的模板消息将在 2020 年 1 月 10 号全面下架,也就是今天,不过貌似现在还可以用!!!我已经改好了,只不过还没有上线,准备坚持到最后一天! 0.订阅消息 简单介绍一下订阅消息的特点: 用户授 ...
- 微信小程序订阅消息
概述 消息能力是小程序能力中的重要组成,我们为开发者提供了订阅消息能力,以便实现服务的闭环和更优的体验. 订阅消息推送位置:服务通知 订阅消息下发条件:用户自主订阅 订阅消息卡片跳转能力:点击查看详情 ...
- 微信小程序订阅消息调研
相关资料 背景:微信模板消息已正式下架,改为订阅消息,详情如下: 服务变更通知 订阅消息:订阅消息相关内容如下: 订阅消息 接口设计 获取接口访问凭证 :根据appId和secret获取接口访问凭证a ...
- 微信小程序、应用号、订阅号、服务号、企业号小总结
微信小程序是现在微信推出的一个新的项目,但是很多人都不是很清楚微信小程序是怎么一回事,不明白到底怎样分别微信小程序和别的公众号.订阅号等的区别,那么让小编来给你介绍一下. 微信小程序目前是内侧阶段,是 ...
- 微信小程序如何发送订阅消息,正确姿势来了,建议收藏!
小程序订阅消息公测已经有些日子,今天以世界上最好的语言(PHP)为例,说一下如何发送订阅消息. 1.订阅消息 其实如果用过模板消息的话,改用订阅消息挺简单的,看一下官方文档稍加摸索就能使用. 但是对于 ...
- 微信小程序的模板消息与小程序订阅消息
小程序订阅消息 功能介绍 消息能力是小程序能力中的重要组成,我们为开发者提供了订阅消息能力,以便实现服务的闭环和更优的体验. 订阅消息推送位置:服务通知 订阅消息下发条件:用户自主订阅 订阅消息卡片跳 ...
- .netcore 3.1 C# 微信小程序发送订阅消息
一.appsettings.json定义小程序配置信息 "WX": { "AppId": "wx88822730803edd44", &qu ...
- 来自于微信小程序的一封简讯
9月21晚间,微信向部分公众号发出公众平台-微信应用号(小程序)的内测邀请,向来较为低调的微信在这一晚没人再忽视它了. 来自个人博客:Damonare的个人博客 一夜之间火了的微信应用号你真的知道吗? ...
- 张小龙宣布微信小程序1月9日发布,并回答了大家最关心的8个问题
2016 年 12 月 28 日,张小龙在微信公开课 PRO 版的会场上,宣布了微信小程序的正式发布时间. 微信小程序将于 2017 年 1 月 9 号正式上线. 同时他解释称,小程序就像PC时代的网 ...
随机推荐
- select函数的使用
select函数是 I/O 复用中非常重要的一个函数,属于并发编程的.它能够监视我们需要监视的文件描述符的变化情况–读.写或者异常 1. 函数原型 #include <sys/select.h& ...
- J集合选数
题意:求出{1, 2, 3, 4, 5}的所有满足以 下条件的子集:若 x 在该子集中,则 2x 和 3x 不能在该子集中.(结果对1e9+1取模) 分析: 首先,什么样的数才会产生排斥呢?(选了这个 ...
- tp5中提示错误A non well formed numeric value encountered
问题因为自动完成时间导致的 原来我的数据库是这样的 修改成下面这样就好了
- spring mvc 中使用session
举例:用户登录成功之后,把用户对象放置到session中 第一步,用户登录成功之后把用户对象首先放到Model中 第二步,要在控制器上加SessionAttributes注解,把放到model中的对象 ...
- Spring Cloud 学习 之 Spring Cloud Bus实现修改远程仓库后配置自动刷新
版本号: Spring Boot:2.1.3.RELEASE Spring Cloud:G版 开发工具:IDEA 搭建配置中心,这里我们搭建一个简单版的就行 POM: <?xml ...
- Android下拉刷新SwipeRefreshLayout简单用法
之前一直都想用下拉刷新,感觉上是庞大的工程,所以搁置了.现在学习了一下其实真的超级简单. 看了<第一行代码>以及 https://www.jianshu.com/p/3c402a9e4b7 ...
- Blazor入门:ASP.NET Core Razor 组件
目录 关于组件 组件类 静态资产 路由与路由参数 组件参数 请勿创建会写入其自己的组参数属性的组件 子内容 属性展开 任意参数 捕获对组件的引用 在外部调用组件方法以更新状态 使用 @ 键控制是否保留 ...
- 【MySQL基础总结】索引的使用
索引的使用 概述 1.索引由数据库中一列或多列组合而成,其作用是提高对表中数据的查询速度 2.索引的优点是可以提高检索数据的速度 3.缺点是创建和维护索引需要耗费时间 4.所以索引可以提高查询速度,减 ...
- Java中Error和Exception的异同以及运行时异常(Runtime exception)与检查型异常(checked exception)的区别
一:Error和Exception的基本概念: 首先Exception和Error都是继承于Throwable 类,在 Java 中只有 Throwable 类型的实例才可以被抛出(throw)或者捕 ...
- [hdu4416 Good Article Good sentence]后缀自动机SAM
题意:给出串A和串集合B={B1,B2,...,Bn},求串A的所有不同子串中不是B中任一串的子串的数目. 思路:把A和B中所有字符串依次拼接在一起,然后构造后缀自动机,计算每个状态的R集合元素的最大 ...