fix(subscribe): 订阅消息未下发原因可见 + 小程序真实授权
- 后台测试推送:未就绪返回 mode=SIMULATED 明确原因 + 配置自检(模板ID/openid/appId/appSecret/总开关),不再把模拟显示为成功 - 占位符 tmpl_xxx 视为未配置(测试推送与订阅模板接口均过滤),微信错误码中文化(43101/47003/40037/40001 等) - 小程序「平台消息与通知」点击时真实调用 wx.requestSubscribeMessage 并回显授权状态,标签不再恒为已开启 - 管理端拦截器错误提示改用 message;文档补订阅消息排查顺序;新增回归护栏(86 套件/631 用例全绿)
这个提交包含在:
@@ -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;
|
||||
|
||||
在新工单中引用
屏蔽一个用户