diff --git a/docs/pay-orchestration-design.html b/docs/pay-orchestration-design.html index a97a423..715012d 100644 --- a/docs/pay-orchestration-design.html +++ b/docs/pay-orchestration-design.html @@ -206,7 +206,20 @@ status TEXT -- created|pending|paid|failed|expired created_at / paid_at DATETIME UNIQUE(provider, provider_ref) -- 回调幂等的命门 -
pay_orders 业务订单 | pay_attempts 支付尝试 | |
|---|---|---|
| 回答 | 谁买了什么、开通谁(购买/权益) | 用哪个平台怎么付、平台单号(收款) |
| 何时创建 | 用户选套餐点「购买」确认那刻 —— POST /v1/pay/orders,一次购买一行 | 每次选定支付方式建 provider 会话 —— 同一 POST /v1/pay/orders(首选渠道),或 /retry(换渠道) |
| 数量 | 1 笔购买 = 1 行(order_no 唯一) | 1 笔购买 = N 行(每次换渠道重试各一行) |
| 锁定 | 建单即锁 user/plan/天数/金额 → 回调改不了(防伪造) | 绑 provider + provider_ref → UNIQUE 幂等 |
| 生命周期 | created→pending→paid/expired/canceled(长) | created→pending→paid/failed/expired(短,可弃) |
典型:用户买 pro-year 选哪吒 → 建 order + attempt#1(nazha);扫码超时 → attempt#1 expired;点「换 crypto」→ order 不变,新建 attempt#2(crypto);链上付款回调 → 按 provider_ref 定位 attempt#2 → 幂等 → order 与 attempt#2 一起置 paid、开通订阅。attempt#1 保留 expired 留痕。拆两层就是为了「换渠道重试不污染订单状态机」+「订单是开通谁的唯一真相」。
+ +SKU → (plan, 天数, 各币种价格)。哪吒收人民币(支付宝)、crypto 收 USDT,故按币种各定一价(不做实时汇率换算,固定价是产品决策)。首版 SKU 目录作为控制面代码常量(后续可迁 DB)。
| SKU | plan | 天数 | USDT(crypto) | CNY(哪吒/支付宝) |
|---|