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 验证缺失即失败
这个提交包含在:
@@ -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) {
|
||||
|
||||
在新工单中引用
屏蔽一个用户