lili d32d5965fb feat(trade): 积分充值 P0 骨架(复用 payout mock-gated 渠道 SPI 范式·真支付收单 P1 受日历闸门) (W-REAL R2)
补 55 P0 最后一块结构缺口。MVP 不接真实支付收单(trade.yaml:支付收单=P1、归 pay 日历闸门)——充值渠道复用
game-module-trade 既有 payout 那套「mock-gated 渠道 SPI」范式,而非接入 12 表重 huijing-module-pay-server
(无 game 消费者、无 Flyway schema、Alipay/微信 SDK 重、P1 缓)。

- 充值渠道 SPI(镜像 PayoutClient):ChargeClient/MockChargeClient/ChargeClientFactory 按 Nacos trade.charge-channel
  路由(默认 mock),mock 同步直通即支付成功入账;真实 wxpay/alipay 未注册时工厂 fail-fast(TRADE_CHARGE_CHANNEL_UNAVAILABLE),
  绝不静默降级 mock 收假单(与 payout「假打款吞真钱」红线同构)。
- V28 game_trade_charge_order:充值单(status 0待支付→10已支付 CAS 入账),uk_biz_no 幂等,账本自包含
  (积分余额=Σ 已支付单 points),不污染创作者收益账户(game_trade_account)不变式。
- ChargeService:创建幂等(bizNo 去重 + uk 兜底并发)→ 发起收单 → mock 同步 CAS 置已支付 + 积分入账;整单同事务。
- app-api 薄骨架:POST /trade/charge/create + GET /trade/charge/points-balance(userId 由 token 解析防越权)。

验证:trade 模块单测绿(新增 ChargeChannelTest 3[mock契约+工厂路由+fail-fast红线] + ChargeServiceImplTest 5
[mock流程+幂等+校验+余额];既有 Account16/Withdraw18/Subscription13 等全不变);连真 MySQL charge mock e2e IT 绿
(V28 DDL+创建→CAS入账→积分余额150→bizNo幂等拒绝);Flyway 全绿(28/28 迁移含 V27+V28 按版本序真库全应用,61 语句);
huijing-server 单体编译 BUILD SUCCESS。Flyway 版本核对 V27→取 V28。

范围说明:「pay 模块接单体」按项目既有模式(game 模块自带 mock-gated 渠道 SPI、huijing pay 保持解耦)解读为复用 pay
模式而非全量接入重 pay-server;若需真接 12 表 pay-server 请复核(见交付报告)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 20:46:54 -07:00
..