fix(subscribe): 订阅消息未下发原因可见 + 小程序真实授权

- 后台测试推送:未就绪返回 mode=SIMULATED 明确原因 + 配置自检(模板ID/openid/appId/appSecret/总开关),不再把模拟显示为成功

- 占位符 tmpl_xxx 视为未配置(测试推送与订阅模板接口均过滤),微信错误码中文化(43101/47003/40037/40001 等)

- 小程序「平台消息与通知」点击时真实调用 wx.requestSubscribeMessage 并回显授权状态,标签不再恒为已开启

- 管理端拦截器错误提示改用 message;文档补订阅消息排查顺序;新增回归护栏(86 套件/631 用例全绿)
这个提交包含在:
xcbyy
2026-10-19 10:02:57 +08:00
父节点 0aed11cb01
当前提交 cacc478d71
共有 8 个文件被更改,包括 229 次插入 和 29 次删除

查看文件

@@ -42,7 +42,7 @@ axios.interceptors.response.use(
// if the custom code is not 20000, it is judged as an error.
if (res.code !== 20000) {
Message.error({
content: res.msg || 'Error',
content: res.message || res.msg || 'Error',
duration: 5 * 1000,
});
// 50008: Illegal token; 50012: Other clients logged in; 50014: Token expired;
@@ -63,7 +63,7 @@ axios.interceptors.response.use(
},
});
}
return Promise.reject(new Error(res.msg || 'Error'));
return Promise.reject(new Error(res.message || res.msg || 'Error'));
}
return res;
},

查看文件

@@ -697,8 +697,23 @@
</div>
<div v-if="testResult" style="margin-top: 16px;">
<a-alert type="success" :title="`测试推送发送成功 [消息ID: ${testResult.wechatMsgId}]`">
推送时间: {{ testResult.sendTime }} | 目标UID: {{ testResult.targetUserId }} | 状态: {{ testResult.status }}
<a-alert
:type="testResult.mode === 'REAL' ? 'success' : (testResult.mode === 'SIMULATED' ? 'warning' : 'error')"
:title="testResult.mode === 'REAL'
? `微信订阅消息已真实下发 [消息ID: ${testResult.wechatMsgId}]`
: (testResult.mode === 'SIMULATED'
? `未真实下发(模拟返回):${testResult.reason}`
: `下发失败:${testResult.reason || '未知错误'}`)"
>
<div>推送时间: {{ testResult.sendTime }} | 目标UID: {{ testResult.targetUserId }} | 状态: {{ testResult.status || testResult.mode }}</div>
<div v-if="testResult.diagnostics">
配置自检:模板ID {{ testResult.diagnostics.hasTemplateId ? '已配置' : '缺失' }},
目标用户 openid {{ testResult.diagnostics.hasOpenid ? '已具备' : '缺失' }},
appId {{ testResult.diagnostics.hasAppId ? '已配置' : '缺失' }},
appSecret {{ testResult.diagnostics.hasAppSecret ? '已配置' : '缺失' }},
总开关 {{ testResult.diagnostics.enablePush ? '已开启' : '未开启' }}
</div>
<div v-if="testResult.result">微信返回:[{{ testResult.result.errcode }}] {{ testResult.result.errmsg }}</div>
</a-alert>
</div>
</a-form>
@@ -1460,8 +1475,15 @@ const sendTestMessage = async () => {
const res: any = await axios.post('/api/admin/message/test-send', payload);
const data = res?.data?.data || res?.data || res;
testResult.value = data;
Message.success('测试服务通知推送成功');
if (data?.mode === 'REAL') {
Message.success('微信订阅消息已真实下发');
} else if (data?.mode === 'SIMULATED') {
Message.warning(`未真实下发:${data?.reason || '配置未就绪'}`);
} else {
Message.error(data?.reason || '推送失败');
}
} catch (err: any) {
// 真实下发失败时后端返回 code 40000,此处展示后端给出的中文原因
Message.error(err.response?.data?.message || err.message || '测试推送异常');
} finally {
testSending.value = false;