jiu 授权续费对接 pay v2 改造计划

2026-07-10 · 状态:10 个任务全部完成(本地提交态,DoD 全绿;不部署不发版,等用户验收)· 执行真相源 = docs/plans/2026-07-10-pay-v2-integration.md(checkbox),本页为阅读版 · pay v2 契约读自 design/pay-v2 分支代码(非文档口径)· 已并入授权管理独立屏三 tab 实现(原型评审通过 13b7274)· Task 8 文档同步已收尾

Context:调研结论改变了任务定位

jiu 两侧的 pay v1 对接已经完整上线,本任务不是从零接入,而是契约升级(v1 → v2)

零改动沿用HMAC 签名算法(util.PaySign:base64(HMAC-SHA256(secret, "jiu\n ts\n nonce\n rawBody"))、±5min 窗)、out_trade_no 幂等键、entitle 续期语义、路由挂载、PAY_* 配置链、iOS 合规开关、轮询/心跳。

v2 契约 delta(已读 design/pay-v2 代码核实)

v1(现实现)v2(本计划目标)
下单POST /api/v1/orders
{product_id, biz_system, biz_ref, return_url, client_type}
POST /api/v2/orders {sku, method, biz_system, biz_ref, return_url};sku 直接用 biz_code(productID 查询+10min 缓存整段删除);无 client_type
下单响应{pay_url, out_trade_no, amount("2999.00"), subject}{order_no, session:{render_type, payload, expires_at?}};alipay 落 redirect + payload.url;不回传金额
查单GET /api/v1/orders/:otn,四态GET /api/v2/orders/:no(无鉴权,见风险节),{order_no, status, subject, amount_minor, currency, paid_at?},八态 created|pending|paid|canceled|expired|refunding|partially_refunded|refunded;不回传 biz_ref
webhook扁平 payload,amount 元串,有 trade_no+event_type(当前仅 payment.succeeded)+ X-Pay-Event 头(不参与签名);amount_minor int64 + currency;无 trade_no;重投固定 60s 无退避无死信;成功判定 = 200 且 body 含 "SUCCESS"(大小写不敏感,现回包 {"code":"SUCCESS"} 天然满足)
签名完全一致四段 \n 拼接 HMAC-SHA256 → base64 标准编码,util.PaySign/PaySignVerify 零改动;pay 侧无 nonce 去重,jiu 侧自建(D3)
金额string 元amount_minor int64(CNY=分)+ currency 大写码,全链路禁 float
retry / cancelretry:409 currency_mismatch=需换方式新建单(jiu 单渠道不接,D6);cancel:恒 200 {"data":{"canceled":bool}},仅 pending 翻转成功(jiu 接,防单堆积)
pay 侧欠账(jiu 无法解决,列联调前置依赖,不阻塞开发):
  1. wap 缺口手机拉起支付宝 App 断线的唯一根因:v2 下单无 client_type、gateway 不设 Metadata["is_mobile"] → alipay 恒走 page.pay。redirect 机制本身没有问题;pay 补契约后 jiu 跟进一行
  2. qr render_type 仅文档口径无代码实现——体验增强项而非缺失:alipay PC 收银台页面本身含二维码,桌面扫码今天即可用,qr 内嵌只是省一次浏览器跳转
  3. seedPlans 仅 alipay_sandbox 开关下执行,生产套餐种子需部署时确认
  4. pay 侧需配置 BIZ_JIU_SECRET / BIZ_JIU_CALLBACK_URL
  5. 查单/retry/cancel 无鉴权本身是 pay 既定惯例(不可猜 ID + payload 无敏感字段,与 refunds 查询同型,P4 终审已归档为模式一致),非设计缺陷;jiu 侧也无未鉴权暴露(客户端/官网只轮询 jiu 自己的 JWT+shop_id 接口)。真正的加固点仅两处:order_no 熵偏薄(≈32 位)、改状态端点(cancel/retry)可被持单号者骚扰——建议 pay 仓增熵 + 对改状态端点限流

已定设计决策

任务分解(8 任务,每任务 TDD + 独立提交)

执行顺序:后端链 1→2→3→4→5→9 与前端链 6→7→10 交错推进,Task 8 收尾。

联调 checklist(pay v2 部署后,不阻塞开发)

红线与 DoD

批准后落地流程

  1. 计划双产物:.md(checkbox 真相源)落 docs/plans/2026-07-10-pay-v2-integration.md + 本 HTML 落 docs/plans/pay-v2-integration.html 登记 index.html
  2. todo 登记(全局 todo skill)并标 doing
  3. subagent-driven-development 逐任务派发执行,每任务一提交