交付出件箱

← 返回出件箱

批 B 发版前整体自检 · 2026-08-15

对象:feature/wechatpay-pay-core 全部 26 个 commit(53 文件 +6271/-355),不只本次会话的 7 个
方法:只看代码与真实输出,不采信文档与 commit message


一、结论

14 个维度过,发现 1 个真缺口 —— 已按长官令补完。

🔴 缺口:机构列表「付款」列前端没做(批 B 遗留,非本次会话引入)
✅ 2026-08-15 已补(commit 470533b8):PC 加第 8 列、手机端胶囊落右下角、
筛选按长官原话零新增框(付款态并入机构状态一组,选中时拆成两路参数下传)。
真打三条筛选路径全通;最终全量 17 failed / 642 passed,与基线逐条一致、0 新增。


二、🔴 缺口详情

434865cf feat(batchB): 机构列表付款状态列 + 独立筛选(方案 §130/§150)

实查该 commit 只动了 2 个文件:

settlement/backend/app/api/settlement/stores.py       | 43 ++++++
tests/contract/settlement/test_payment_records.py     | 110 +++++

前端一行没动。

层 状态
后端字段 payment_status(已支付/未支付/已退款) ✅ stores.py:502 compute_payment_status
后端筛选参数 payment_status ✅ stores.py:419 / :507
后端测试 ✅ 3 条(carries / values / end_to_end)全绿
PC 机构列表 admin/minicup/stores/page.tsx ❌ 0 处引用
平台手机端 platform/minicup/stores/page.tsx ❌ 0 处引用
渠道端 channel/minicup/store-progress/page.tsx ⚠️ 有同名字段,但是旧字段,非批 B 三态

后果:运营在机构列表上看不到谁付了钱、也筛不出来——这正是方案 §200
「机构列表(admin/platform):付款独立列 + 筛选」要解决的问题。

为什么测试全绿也没发现:3 条测试全打后端接口,前端有没有渲染它们管不着。

补做前需要长官确认的一处口径矛盾

我的理解:展示上加一列,筛选不加框——把用户在「机构状态」多选里选的付款态,
转成后端那个 payment_status 参数传过去。两边就都自洽了。但这是长官多轮纠错过的区域
(F 列改动纪律),我不自己拍。


三、14 个维度逐条(全部有物理输出)

# 维度 判据 结果
A alembic 单头 alembic heads ✅ phase68_002 单头,链 000→001→002 完整
B 合入 test 不会变多头 比对两边 versions/ 目录 ✅ test 上无我缺的迁移
C 迁移可逆 真跑 downgrade 2 级 → upgrade head ✅ 双向都成功,回到 head
D 新端点鉴权 8 个端点无凭证真打 ✅ 6 个 401;2 个设计公开(notify 靠验签、wx-auth 是授权入口)
E 内部端点守卫 不带/带错 X-Service-Token 真打 ✅ 均 403
F 回调安全 读代码看顺序 ✅ 验签(:140) → 解密(:160) → 才查库(:167);幂等有专门用例
G 库层约束 直连 PG 查 pg_constraint ✅ 与迁移声明逐条一致(详见下)
H 金额口径 读 yuan_to_fen + grep float ✅ 只走 Decimal;半分钱报错不四舍五入;唯一 *100 是 Decimal 运算
I 金额不可篡改 读下单逻辑 + 查库 CHECK ✅ 服务端按 price_id 重算;库层 total = price × qty 焊死
J 前端编译 8 个改动文件逐个 esbuild ✅ 全通过
K 前后端契约 44 处调用 vs 已注册路由逐个比对 ✅ 全命中(含跨服务的 /api/wx/jssdk-config 落核心)
L nginx 分流 比对 nginx-settlement.conf location 清单 ✅ 新端点全在已有前缀内,零基建改动
M 密钥泄露 grep 日志/返回体/前端/提交物 ✅ 新增日志只带订单号与状态;无 .env/.pem 提交
N 死代码 AST 查 3 个新 service 的公开函数 ✅ 无孤儿

G 维度细节(钱相关的约束,上生产后难改)

revenue_snapshots  received_amount <> 0            允许负数冲销,仍禁 0
                   channel_amount >= 0 已移除       (冲销要用负数)
                   ux_..._confirmation_positive     部分唯一 WHERE received_amount > 0
payment_confirmations  uq_..._payment_order_id      回调幂等兜底
payment_orders     total_amount = price × quantity  金额焊死
                   已支付 → paid_at 非空 / 已退款 → refunded_at 非空
org_signup_profiles  payer_openid/unionid/nickname/avatar + openid 索引

长官 9 条拍板逐条查代码

① 昵称+头像+openid 三存 ✅ ② 存快照 ✅ ③ actor_role="system" ✅
④ 无微信原路退代码 ✅ ⑤ 授权闸门在签约第一步 ✅ ⑥ 只许微信内打开 ✅
⑦ 一人一份档案 ✅(去重键是「渠道+机构名+电话」,不是 openid,所以换个人填就是新档案)
⑧ 详情列出全部支付 ✅(循环 append) ⑨ 席位数带出订单 quantity ✅(latest_paid_quantity)


四、测试与卫生


五、发版前仍必须人工做的

  1. ⬜ 上生产前先切 settle-prod 流水线源(仍指旧仓 tongban-settlement.git,不切等于白发)
  2. ⬜ 联调:手机付 0.01 元 ⚠️ 真扣钱
  3. ⬜ 联调后删 GET /api/wxpay/self-check
  4. ⬜ 渲染层全部未验——云机装不起 node_modules,两个支付记录页的排版/弹窗/头像
    必须去 test.tongban.love 看

本报告所有结论标签:云机环境·非验收证据