1.流程图

2.详细代码
const $sync = (p) => p.then((d) => [null, d]).catch((e) => [e]);
export async function requestSubscribeMessage(templateId) {
const [, settingRes] = await $sync(checkSubscribeMessageAuth(templateId));
if (settingRes) return true;
const [, authRes] = await $sync(doRequestSubscribeMessage(templateId));
if (authRes) return true;
const [, guideRes] = await $sync(showAuthGuideModal());
if (guideRes) {
const [, openSettingRes] = await $sync(openSettingPage(templateId));
if (openSettingRes) return true;
}
return false;
}
function checkSubscribeMessageAuth(templateId) {
return new Promise((resolve, reject) => {
wx.getSetting({
withSubscriptions: true,
success: (res) => {
if (!res.subscriptionsSetting) {
reject(new Error("无法获取订阅消息设置"));
return;
}
const { mainSwitch, itemSettings = {} } = res.subscriptionsSetting;
if (!mainSwitch) {
reject(new Error("订阅消息总开关未打开"));
return;
}
if (templateId) {
const templateAuth = itemSettings[templateId];
if (templateAuth !== "accept") {
reject(new Error(`模板消息 ${templateId} 未授权`));
return;
}
} else {
reject(new Error("未提供模板id"));
}
resolve(itemSettings);
},
fail: (err) => {
reject(err);
},
});
});
}
function doRequestSubscribeMessage(templateId) {
return new Promise((resolve, reject) => {
wx.requestSubscribeMessage({
tmplIds: [templateId],
success: (res) => {
if (res[templateId] === "accept") {
resolve(true);
} else {
reject(new Error("用户拒绝订阅"));
}
},
fail: (err) => {
reject(new Error("调起授权弹窗失败"));
},
});
});
}
function showAuthGuideModal() {
return new Promise((resolve, reject) => {
wx.showModal({
title: "温馨提示",
content: "为了您能及时收到重要通知,请开启消息订阅权限。",
confirmText: "前往开启",
success: (res) => {
res.confirm ? resolve(true) : reject(new Error("用户取消"));
},
fail: () => {
reject(new Error("打开引导弹窗失败"));
},
});
});
}
function openSettingPage(templateId) {
return new Promise((resolve, reject) => {
wx.openSetting({
withSubscriptions: true,
success: (res) => {
const mainSwitch = res?.subscriptionsSetting?.mainSwitch || false;
const itemSettings = res?.subscriptionsSetting?.itemSettings || {};
if (mainSwitch && itemSettings[templateId] === "accept") {
resolve(true);
} else {
reject(new Error("用户在设置页面未授权"));
}
},
fail: (err) => {
reject(new Error("打开设置页面失败"));
},
});
});
}
3. 使用方法
const templateId = "XXXXXX";
const result = await requestSubscribeMessage(templateId);
console.log(result ? "订阅成功" : "订阅失败");