微信小程序消息订阅功能解析.md 4.9 KB

微信小程序消息订阅功能解析:如何判断用户是否勾选"总是保持以上选择"

一、消息订阅功能概述

微信小程序的消息订阅功能允许开发者在用户同意的情况下,向用户发送通知消息。这个功能对于提升用户体验和服务闭环非常重要。

消息订阅类型:

  • 一次性订阅:用户授权一次,开发者可发送一条消息
  • 长期订阅:需特定资质,用户授权后可多次发送消息(仅对政务、医疗、交通等特定行业开放)

对于普通开发者来说,通常只能使用一次性订阅功能。

二、问题的提出

通过合理设计,一次性订阅也能实现类似长期订阅的效果:

  • 用户在订阅时勾选"总是保持以上选择,不再询问"
  • 之后的订阅调用不会再弹窗,而是保持之前的选择

核心问题:如何知道用户是否在订阅时勾选了"总是保持以上选择,不再询问"?

三、技术实现解析

3.1 订阅请求的返回值对比

无论用户是否勾选"总是保持以上选择,不再询问",调用requestSubscribeMessage函数都会返回相同的结果:

// 订阅请求返回结果(两种情况下相同)
{
  "ACS7cwcbx0F0Y_YaB4GZr7rWP7BO2-7wQOtYsnUjmFI": "accept",
  "errMsg": "requestSubscribeMessage:ok"
}

3.2 获取设置信息的区别

通过wx.getSetting(配合withSubscriptions: true参数)可以观察到关键差异:

情况一:用户勾选了"总是保持以上选择,不再询问"

wx.getSetting({
  withSubscriptions: true,
  success(res) {
    console.log("获取成功:", res.authSetting);
    console.log("完整订阅消息设置:", JSON.stringify(res.subscriptionsSetting, null, 2));
  }
});

// 返回结果:
{
  "mainSwitch": true,
  "itemSettings": {
    "ACS7cwcbx0F0Y_YaB4GZr7rWP7BO2-7wQOtYsnUjmFI": "accept"
  },
  "ACS7cwcbx0F0Y_YaB4GZr7rWP7BO2-7wQOtYsnUjmFI": "accept"
}

情况二:用户没有勾选"总是保持以上选择,不再询问"

// 返回结果:
{
  "mainSwitch": true
}

四、核心答案与判断逻辑

4.1 核心判断方法

判断用户是否勾选"总是保持以上选择"的核心方法是:检查wx.getSetting返回结果中是否存在subscriptionsSetting.itemSettings对象及其内容。

4.2 关键差异点分析

特征 勾选了"不再询问" 未勾选"不再询问"
mainSwitch true true
itemSettings 存在且包含模板ID 不存在
模板ID属性 存在(如ACS7cw...: "accept" 不存在

4.3 代码实现示例

/**
 * 判断用户是否永久订阅某个模板
 * @param {string} templateId - 消息模板ID
 * @returns {boolean} - 是否永久订阅
 */
function checkPermanentSubscription(templateId) {
  return new Promise((resolve) => {
    wx.getSetting({
      withSubscriptions: true,
      success(res) {
        const { subscriptionsSetting = {} } = res;
        
        // 关键判断逻辑
        if (subscriptionsSetting.itemSettings && 
            subscriptionsSetting.itemSettings[templateId] === 'accept') {
          // 用户勾选了"不再询问"且接受了该模板
          resolve(true);
        } else {
          // 用户未勾选"不再询问"或未接受该模板
          resolve(false);
        }
      },
      fail() {
        resolve(false);
      }
    });
  });
}

五、实际应用建议

5.1 优化用户体验

  • 如果用户已永久订阅,界面应显示"已订阅"状态
  • 避免对已永久订阅的用户重复弹出订阅请求

5.2 订阅策略优化

async function smartSubscribe(templateIds) {
  const setting = await getSubscriptionSettings();
  
  // 过滤出需要请求订阅的模板
  const needSubscribeIds = templateIds.filter(id => {
    return !(setting.itemSettings && setting.itemSettings[id] === 'accept');
  });
  
  if (needSubscribeIds.length === 0) {
    console.log('所有模板已永久订阅');
    return Promise.resolve();
  }
  
  // 只请求未永久订阅的模板
  return wx.requestSubscribeMessage({
    tmplIds: needSubscribeIds
  });
}

5.3 状态展示与管理

建议在设置页面提供清晰的订阅状态展示,让用户了解当前的订阅情况,并可以方便地管理自己的订阅偏好。

六、总结

通过分析wx.getSetting返回的subscriptionsSetting对象结构,我们可以准确判断用户是否勾选了"总是保持以上选择,不再询问":

  1. 存在itemSettings对象且包含对应的模板ID → 用户勾选了"不再询问"
  2. 只有mainSwitch: true → 用户未勾选"不再询问"

这种判断机制为开发者提供了更精细的订阅管理能力,能够根据用户的不同选择优化订阅流程,提升用户体验,同时避免不必要的订阅弹窗干扰。