文件
shanghaipeiwan/server/tests/wechat-appid-config-hardening.spec.ts
xcbyy b77827522f fix(config): 占位凭证清理改为一次性(标记位保护),避免误清管理员填写的真实 AppID
- 历史占位 appId/appSecret 的清理由"每次启动执行"改为"仅首启执行一次",写入 wechat_pay_placeholder_cleaned 标记
- 此后即使管理员填写的 AppID 恰好等于旧占位值(本账真实 AppID),重启也不会被再次清空
- 「拉取小程序模板列表」缺凭证时错误提示改为可操作指引(指明填写位置)
- 回归 87 套件/636 用例全绿;冒烟 5/5 验证 Phase A 首启清理、Phase B 重启保留
2026-10-19 11:00:23 +08:00

43 行
2.1 KiB
TypeScript

此文件含有模棱两可的 Unicode 字符

此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。

// 已读取AGENTS.md
import * as fs from 'fs';
import * as path from 'path';
/**
* 第七十一批回归闸门:移除硬编码微信小程序 appId/appSecret,改为"只读配置 + 缺失即失败"。
* 背景:源码/DB 内置占位凭证会被后端静默使用,导致 appId 与建模板的小程序不一致(订阅消息 40037)。
*/
describe('第七十一批小程序凭证去硬编码闸门', () => {
const root = path.resolve(__dirname, '../../');
const indexCode = fs.readFileSync(path.join(root, 'server/src/index.ts'), 'utf-8');
const mysqlCode = fs.readFileSync(path.join(root, 'server/src/db/mysql.ts'), 'utf-8');
const adminCode = fs.readFileSync(
path.join(root, 'admin/arco-design-pro-vite/src/views/safety/platform-config/index.vue'),
'utf-8'
);
it('后端不再有硬编码 appId/appSecret 兜底', () => {
expect(indexCode).not.toContain("|| 'wx0c929f7e54024e67'");
expect(indexCode).not.toContain("|| '63a412f3f73af8e73f6923943bf9683c'");
expect(indexCode).toContain("appId: process.env.WX_APP_ID || ''");
expect(indexCode).toContain("appSecret: process.env.WX_APP_SECRET || ''");
});
it('缺失凭证时按接口 fail-closed 并给出明确提示', () => {
expect(indexCode).toContain('服务端未配置小程序 AppID/AppSecret,无法换取 openid');
expect(indexCode).toContain('服务端未配置小程序 AppID(后台「微信支付商户配置」或环境变量 WX_APP_ID)');
});
it('建表种子为空值,并清理历史遗留的占位凭证', () => {
expect(mysqlCode).toContain('appId: \'\',\n appSecret: \'\',');
// 自愈逻辑由"写入占位值"改为"清空占位值",且用标记位保证只执行一次(不误清管理员后续填写的值)
expect(mysqlCode).toContain("if (curVal.appId === 'wx0c929f7e54024e67'");
expect(mysqlCode).toContain("if (curVal.appSecret === '63a412f3f73af8e73f6923943bf9683c')");
expect(mysqlCode).toContain('curVal.appId = \'\'');
expect(mysqlCode).toContain('wechat_pay_placeholder_cleaned');
});
it('后台文案不再暴露具体 AppID', () => {
expect(adminCode).not.toContain('wx0c929f7e54024e67');
});
});