微信小程序的requestSubscribeMessage是一次性授权:用户点一次"允许",你只有一次发送机会,且超过2天就失效。很多团队的提醒功能上线一周就废了——用户授权了,消息却永远没送达。这篇给你一套在生产环境验证过的完整方案。
| 症状 | 根因 | 修复 |
|---|---|---|
| errCode 43101 | 用户未订阅/授权已消耗 | 见下文"循环授权"策略 |
| errCode 47003 | 模板参数与模板不符 | 逐字段核对类型,date必须yyyy-MM-dd |
| 用户收到一次后收不到 | 一次性模板已消耗 | 每次交互后重新请求授权 |
| 授权弹窗太频繁被拒 | 调用时机不对 | 只在有明确后续价值的动作后调起 |
核心思想:每次用户完成关键动作(下单、提交、打卡),都重新调起授权,成功后写入状态表。发送时只消费"新鲜"的授权(72小时内)。
-- 订阅状态表 CREATE TABLE subscribe_state ( openid VARCHAR(64) PRIMARY KEY, quota INT DEFAULT 0, -- 可发送次数(一次性模板每次+1) updated_at DATETIME ); -- 用户同意授权时: INSERT INTO subscribe_state(openid, quota, updated_at) VALUES(?, 1, NOW()) ON DUPLICATE KEY UPDATE quota = quota + 1, updated_at = NOW(); -- 发送成功后: UPDATE subscribe_state SET quota = quota - 1 WHERE openid = ? AND quota > 0;
const cloud = require('wx-server-sdk');
cloud.init();
const db = cloud.database();
exports.main = async (event) => {
const { openid, templateId, data, page } = event;
// 1. 检查并扣减订阅额度
const res = await db.collection('subscribe_state')
.where({ openid, quota: db.command.gt(0) })
.update({ data: { quota: db.command.inc(-1), updated_at: Date.now() } });
if (res.stats.updated === 0) {
return { sent: false, reason: 'NO_QUOTA' }; // 无新鲜授权,走短信兜底
}
// 2. 调用订阅消息接口
try {
const r = await cloud.openapi.subscribeMessage.send({
touser: openid,
templateId,
page, // 必须是已发布的小程序页面
data, // 字段名与模板严格一致
miniprogramState: 'formal'
});
return { sent: true, result: r };
} catch (e) {
// 43101: 授权已失效——回滚额度并标记
if (e.errCode === 43101) {
await db.collection('subscribe_state').where({ openid })
.update({ data: { quota: db.command.inc(1) } });
}
return { sent: false, reason: e.errCode };
}
};
// ❌ 错误:页面加载就弹授权,用户秒拒
onLoad() { wx.requestSubscribeMessage({...}) }
// ✅ 正确:在用户提交订单/完成打卡后弹,此时拒绝率最低
async function submitOrder(order) {
await api.createOrder(order);
try {
const r = await wx.requestSubscribeMessage({
tmplIds: [TEMPLATE_ID] // 只放1个,多个会降低同意率
});
if (r[TEMPLATE_ID] === 'accept') {
await api.reportSubscribe(); // 服务端 quota +1
}
} catch (e) { /* 拒绝不影响主流程 */ }
wx.showToast({ title: '下单成功,出单后将提醒您' });
}
page 必须是线上已发布页面路径,开发版页面会报错🐱 喵窝资源铺提供AI小程序/脚本定制服务:订阅消息方案落地、自动化脚本、数据整理,交付前实测验证。¥9.9起,看看服务档位 →。虚拟物品交付后不退款;未达承诺免费重做。