← 返回文档索引

pay v2 · P1 核心数据模型 + 配置账户注册表 (阅读版)

执行真相源 docs/superpowers/plans/2026-07-10-pay-v2-p1-core-model.md(含 - [ ] checkbox)。设计见 pay v2 统一支付网关设计

P1 目标:建 pay v2 的核心数据地基 —— Order + Attempt + Account + Refund 模型、金额 int64 最小单位 + 币种、状态机、:memory: 测试约定、配置驱动账户注册表。即"一单 N 渠道只一个成功 / 可取消 / 多账户路由"的数据层。不含 Provider/收款管线/渠道/退款执行(P2+)。

8 阶段路线图

阶段内容状态
P1核心模型(Order/Attempt/Account/Refund)+ money + 状态机 + 测试约定 + 账户配置注册表本页
P2Provider 抽象 + 一次性收款管线 + webhook v2(event_type)+ 幂等/金额核对(fake provider 测)待细化
P3首批渠道 adapter:crypto 自托管 / 支付宝 / Stripe待细化
P4退款:POST /refunds + 三向(业务/crypto 人工/平台通知)+ refund 事件待细化
P5多账户路由策略(round_robin/weighted/limit_aware/crypto 地址池)待细化
P6对账 job(每 provider query,渠道流水 vs 本地订单)待细化
P7codes 共享库(A 嵌入各产品)待细化
P8later:订阅/recurring(4 类 kind)、拒付 chargeback待细化

P1 任务(4 个,TDD bite-sized)

Task 1 · money 包

金额 int64 最小单位 + 币种码(CNY/USD=分、USDT=micro);Parse/Format 往返,超精度报错。禁 float / string 元(v2 破坏性改动)。

Task 2 · v2 模型 + 状态机 + 测试约定

Order/Attempt/Account/Refund GORM 模型(内嵌 Base、金额 int64+币种、Attempt UNIQUE(channel,provider_ref))、三套状态枚举、接进 AutoMigrate;建 OpenTestDB:memory: sqlite 测试约定(pay 原无 DB 测试)。

Task 3 · OrderStore

建单/建尝试/幂等标付(条件 UPDATE + RowsAffected,守卫 order=pending → 一单只一个 attempt 成功)/取消(pending→canceled)/列表(全状态含 canceled)。沿用 pay 现有 applyPaid 幂等手法(sqlite 单写,无 FOR UPDATE)。

Task 4 · 账户配置注册表

config.accounts 声明账户(channel/weight/enabled/limit/region/subject),凭证只存 env 前缀、真值运行时从 env 取;EnabledFor(channel,region) 筛选(路由策略在 P5)。

关键约束

约束说明
金额int64 最小单位 + 币种码,禁 float / string 元
幂等条件 UPDATE + RowsAffected(sqlite 单写,无 FOR UPDATE)
迁移GORM AutoMigrate,无手写 migration;内嵌 Base
凭证json:"-" + env 注入,不入库/配置明文
重设计jiu 未上线、无生产数据,可重建表

相关:pay v2 设计 · 真相源 docs/superpowers/plans/2026-07-10-pay-v2-p1-core-model.md