dev2 · 2026-08-20 · 【实测】= 云机命令跑出来的 · 云机环境·非验收证据
【实测】origin/main HEAD = 0f2c4098
0f2c4098 Merge release/settle-batch2-20260820 ← MR #482(test MR 420-475 共 33 个)
ebaf0224 Merge release/settle-batch1-20260820 ← MR #481(40 个)
ec0e6a49 (发版前的旧 main)
【实测】完整性判据不是数 MR 号,是文件比对:
settlement/ 域 main vs test 差异文件数 = 0
对照组:全仓差异 35 文件(证明比对有效,不是查法坏了)
抽查了最关键的 #390(漏了会导致价格表被 autogenerate 误删):
origin/main:migrations/env.py:47 "service_prices", "service_price_changes",
origin/main:migrations/env.py:48 "payment_orders",
三张表都在排除清单里,已进生产。
加上你 11 维 verify 第 3 维(生产运行中 openapi 含 batch2 独有的 3 条 support-qrcodes 路径)
—— 结算容器真加载了新代码,不是只落盘。结算域这条线,代码层收工。
判据【实测】:
git diff --name-only ec0e6a49 origin/main -- 'settlement/deploy/nginx*'
→ settlement/deploy/nginx-settlement.conf 命中 1
对照组:同目录 docker-compose.prod.yml 也在差异里(证明查法有效)
本批确实动了 nginx conf。按台账 2026-08-17 立的门禁:部署链只同步文件、不重载 nginx,
conf 落盘了但 nginx 进程还拿旧配置 ⇒ 改动等于没上。
你那张 11 维表第 9 维只报了「nginx error.log 0 error/crit」,没报 reload 过 —— 所以来问一句。
nginx -t && nginx -s reload
40 并发打 /api/store/signup/temp-exchange,0 个 503 = 生效。
(test 上实测坐实过:发版后仍 10/40 个 503,与改前基线 11 个一致;reload 后 0/40。)
如果你已经跑过了 —— 回我一声「跑过了」就行,这条我就销账。
✅ 商户平台侧的网址配置(支付授权目录 / 回调域名),长官 8-20 已确认配好 ——
所以下面只剩生产服务器上的环境变量 + 两个证书文件。
代码是 fail fast 的,不是静默降级 —— 缺任一变量,接口直接返
503 微信支付未配置:缺 X。出处【实测】
settlement/backend/app/services/settlement/wechatpay_client.py:195-212(生产 main 上实读)。
| 变量 | 说明 |
|---|---|
WECHATPAY_MCHID |
商户号 |
WECHATPAY_APPID |
🔴 见下面「最容易踩的坑」 |
WECHATPAY_CERT_SERIAL_NO |
证书序列号 |
WECHATPAY_PUBLIC_KEY_ID |
|
WECHATPAY_PRIVATE_KEY_PATH |
指向 PEM 文件路径 |
WECHATPAY_PUBLIC_KEY_PATH |
指向 PEM 文件路径 |
WECHATPAY_APIV3_KEY |
🔴 必须正好 32 字节,长度不对照样 503 |
APIV3_KEY_LENGTH = 32 出处【实测】wechatpay_client.py:139
(注释原文:「官方明写:无效的 ApiV3Key,长度必须为 32 个字节」)。
代码注释里写明缺它的后果:回调报文解不开 —— 钱收了却入不了账。
| 变量 | 说明 |
|---|---|
WECHATPAY_NOTIFY_URL |
微信回调打回来的地址,必须指向生产域名 |
它不在 missing 校验清单里 ⇒ 缺了不报错、静默通过,但微信回调打不回来,
表现就是「用户付了钱、系统里一直显示未付款」。既然商户平台侧网址已配好,
这个变量的值要跟商户平台里配的回调域名对得上。
你自己 11 维第 7 维已验:「PEM 未入 git 工作区(0)」
⇒ 部署链根本不会把证书带到生产机。需要你:
*_PATH 变量一致(宿主机路径 ≠ 容器内路径,注意挂载)503 微信支付证书读取失败:<原因>代码注释里明写(【实测】wechatpay.py:100-104,是 2026-08-15 排查
「当前页面的URL未注册」时加的):
openid 是用公众号 appid 换来的,若下单用另一个 appid,微信会拒绝调起。
⇒ WECHATPAY_APPID 必须 = 公众号那个 appid(/api/wx/jssdk-config 返的那个),别填成开放平台的。
GET /api/wxpay/self-check
【实测】路由前缀 wechatpay.py:61 = /api/wxpay。
⚠️ 这个口要平台账号登录态(Depends(require_platform_payment_confirm)),
裸 curl 会被拦 —— 需要带平台端 token,或让长官在后台点。
返回怎么读:
| 返回 | 含义 |
|---|---|
ok: true · detail: 微信回「订单不存在」 |
✅ 签名已通过,商户号/证书/序列号/公钥全部配对 |
ok: false · stage: request |
配置缺失或证书文件读不到,看 detail 字段,原因原样带回 |
401 |
签名不对 |
另外它会回一个 pay_appid 字段,拿去跟公众号 appid 比对,就是上面那个坑的判据。
(自检口只回 appid 这种公开信息,不回密钥/证书,可以放心让长官点。)
【实测】sudoers 里我有免密:
(root) NOPASSWD: /usr/local/bin/release-to-test, /usr/local/bin/release-to-prod,
/usr/local/bin/release-pipeline-status
所以这几件我自己干,不占你时间:
LEGACY_CLEANUP_STATUSES + legacy-pending-amount 端点 +【实测】main..test 还剩 5 个带号 MR,我逐个查了改动文件:
| MR | 内容 | 改动 |
|---|---|---|
| #431 | chore: 重新部署验证 phase70 | 改动文件 0 个(空合并) |
| #375 | 发版工具 release_main.py |
只动 scripts + tests |
| #378 | 清理孤儿测试 | 只动 tests + requirements-dev |
| #442 | phase73 立项文档 | 只动 docs |
| #476 | 核心后台机构管理页「体验门店名称」检索 | 🔴 唯一的真功能,生产上没有 |
前四个不发不影响生产业务。
云机环境 · 非验收证据。