feat: add software subscription orders

This commit is contained in:
QiuSW
2026-07-21 11:52:49 +08:00
parent 341864dc70
commit bc9d1aa0f7
25 changed files with 1179 additions and 47 deletions
+7
View File
@@ -2104,3 +2104,10 @@
- 先收紧任务口径:软件订单、支付回调与权益发放必须和 `RechargeOrder` / `PointsLedger` 隔离;支付交易号在软件订单域内唯一,并可追溯至目标权益和授权事件。
- 第一版只支持用户主动月度续订,不实现自动代扣,也不实现支付退款后的自动权益回收;退款与撤销走带订单号和原因的运营人工流程。自动回收须在未来以按订单权益周期/发放账本为基础单列任务,不能直接回滚累计到期时间。
- 实现顺序:先修 T-626 的凭证续期同步和撤销清理,再实现独立软件订单、独立回调/查单、portal 与 HTTP/并发回归测试。
## 2026-07-21 完成:T-629 软件套餐购买、续订订单与权益入账
- 实现:新增 `SoftwareOrder`、`LicenseEvent(order_fulfilled)` 和 licensing `0004` 迁移;软件订单锁定套餐/金额快照,支付交易号按通道唯一,并关联目标权益、发放事件和发放时间。支付成功仅创建或续订 `SoftwareEntitlement`,不写 `RechargeOrder`、`UserWallet` 或 `PointsLedger`。
- 支付:支付网关抽取无业务副作用的 `PaymentReceipt`,充值继续将其交给 `apply_recharge_payment()`;订阅改用独立的微信回调/状态路由和 `SOFTWARE_WECHAT_PAY_NOTIFY_URL`,避免软件支付进入点数充值回调。portal 新增 `/subscription`,admin 新增只读软件套餐订单。
- T-626 修复:续期在事务内刷新全部未吊销设备凭证到新的宽限截止;撤销权益会吊销未吊销凭证、释放已占席位并分别写审计事件。
- 验证:`py -3.12 manage.py test apps.licensing.tests.SoftwareOrderServiceTests apps.licensing.tests.SoftwareOrderConcurrencyTests apps.licensing.tests.LegacyMigrationFlowTests apps.api.tests.SoftwareOrderCallbackApiTests --keepdb` 通过(12 tests);`py -3.12 manage.py test apps.billing.tests.BillingServiceTests apps.api.tests.RechargeCallbackApiTests apps.api.tests.RechargeCreateStatusApiTests --keepdb` 通过(31 tests);`py -3.12 manage.py check`、`py -3.12 manage.py makemigrations --check --dry-run` 和 `compileall` 通过。两组均仅有既有 allauth MySQL 条件唯一约束 `models.W036` 警告。完整 `manage.py test --keepdb` 在远端 MySQL 测试库运行 10 分钟无失败输出后超时,未记为通过;线上真实微信付款验收仍未执行。