security: 移除硬编码微信小程序 appId/appSecret,改为只读配置+缺失即失败

- 后端不再兜底内置 appId/appSecret,缺失时 jscode2session/手机号/支付/内容审核等接口明确拒绝(fail-closed)
- 建表种子改为空值;启动自愈由「写入占位值」改为「清空历史占位值」,杜绝误用非本小程序 appId(40037 根因)
- 后台/引导文案去除具体 AppID;文档补充 WX_APP_ID/WX_APP_SECRET 说明
- 新增回归护栏 wechat-appid-config-hardening.spec.ts(87 套件/636 用例全绿);HTTP 冒烟 4/4 验证缺失即失败
这个提交包含在:
xcbyy
2026-10-19 10:33:31 +08:00
父节点 584e526bca
当前提交 01823a1db4
共有 6 个文件被更改,包括 77 次插入 和 28 次删除

查看文件

@@ -1034,8 +1034,8 @@ async function seedInitialDataIfEmpty(conn: any): Promise<void> {
const wechatPayConfigVal = JSON.stringify({
mode: 'AUTO',
appId: 'wx0c929f7e54024e67',
appSecret: '63a412f3f73af8e73f6923943bf9683c',
appId: '',
appSecret: '',
mchId: '',
apiV3Key: '',
serialNo: '',
@@ -1055,7 +1055,7 @@ async function seedInitialDataIfEmpty(conn: any): Promise<void> {
enableChooseLocation: 1,
enableDistanceCalculation: 1,
defaultCity: '北京市',
remark: '腾讯位置服务 Key(需在 lbs.qq.com 申请并勾选 WebServiceAPI 与微信小程序 AppID: wx0c929f7e54024e67)'
remark: '腾讯位置服务 Key(需在 lbs.qq.com 申请并勾选 WebServiceAPI 与微信小程序)'
});
const [cfgItemRows]: any = await conn.query('SELECT COUNT(*) as count FROM platform_configs');
@@ -1197,12 +1197,14 @@ async function seedInitialDataIfEmpty(conn: any): Promise<void> {
}
if (curVal && typeof curVal === 'object') {
let updated = false;
if (!curVal.appId || curVal.appId === 'wx_peiwan_miniapp') {
curVal.appId = 'wx0c929f7e54024e67';
// 历史版本曾在源码/DB 中内置占位 appId/appSecret,这里一次性清空,
// 避免后端误用非本小程序的凭证(如订阅消息 40037、支付参数错乱)。
if (curVal.appId === 'wx0c929f7e54024e67' || curVal.appId === 'wx_peiwan_miniapp') {
curVal.appId = '';
updated = true;
}
if (!curVal.appSecret) {
curVal.appSecret = '63a412f3f73af8e73f6923943bf9683c';
if (curVal.appSecret === '63a412f3f73af8e73f6923943bf9683c') {
curVal.appSecret = '';
updated = true;
}
if (updated) {