交付出件箱

← 返回出件箱

致 root:结算域生产发版已完成 · 剩两件需你在生产服务器确认

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 路径)
—— 结算容器真加载了新代码,不是只落盘。结算域这条线,代码层收工。


🔴 二、需要你确认的第 1 件:nginx reload 跑了没有

判据【实测】:

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。)

如果你已经跑过了 —— 回我一声「跑过了」就行,这条我就销账。


🔴 三、需要你确认的第 2 件:微信支付生产配置(服务器侧)

✅ 商户平台侧的网址配置(支付授权目录 / 回调域名),长官 8-20 已确认配好 ——
所以下面只剩生产服务器上的环境变量 + 两个证书文件。

代码是 fail fast 的,不是静默降级 —— 缺任一变量,接口直接返
503 微信支付未配置:缺 X。出处【实测】
settlement/backend/app/services/settlement/wechatpay_client.py:195-212(生产 main 上实读)。

7 个必填环境变量

变量 说明
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 个字节」)。
代码注释里写明缺它的后果:回调报文解不开 —— 钱收了却入不了账。

第 8 个:不在必填校验里,但缺了同样出事

变量 说明
WECHATPAY_NOTIFY_URL 微信回调打回来的地址,必须指向生产域名

它不在 missing 校验清单里 ⇒ 缺了不报错、静默通过,但微信回调打不回来,
表现就是「用户付了钱、系统里一直显示未付款」。既然商户平台侧网址已配好,
这个变量的值要跟商户平台里配的回调域名对得上。

两个 PEM 文件必须你手工放

你自己 11 维第 7 维已验:「PEM 未入 git 工作区(0)」
⇒ 部署链根本不会把证书带到生产机。需要你:

  1. 把商户私钥 / 微信支付公钥两个 PEM 放到生产服务器
  2. 确认容器内看到的路径与上面两个 *_PATH 变量一致(宿主机路径 ≠ 容器内路径,注意挂载)
  3. 确认容器进程读得到(权限)—— 读不到会返 503 微信支付证书读取失败:<原因>

🔴 最容易踩的坑:支付 appid 必须与公众号 appid 是同一个

代码注释里明写(【实测】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

所以这几件我自己干,不占你时间:


五、剩余未发 MR 的账(供你对表,不需你动作)

【实测】main..test 还剩 5 个带号 MR,我逐个查了改动文件:

MR 内容 改动
#431 chore: 重新部署验证 phase70 改动文件 0 个(空合并)
#375 发版工具 release_main.py 只动 scripts + tests
#378 清理孤儿测试 只动 tests + requirements-dev
#442 phase73 立项文档 只动 docs
#476 核心后台机构管理页「体验门店名称」检索 🔴 唯一的真功能,生产上没有

前四个不发不影响生产业务。


六、我没验的(说清边界)

云机环境 · 非验收证据。