All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 5m22s
- 使用条件更新实现支付状态原子转换(pending -> paid) - 重复请求返回幂等成功,不再重复激活套餐 - 新增 tb_package_usage 唯一索引(order_id, package_id) - 新增幂等性和异常状态测试,测试覆盖率 71.7% - 归档 OpenSpec 变更 fix-order-activation-idempotency
1.7 KiB
1.7 KiB
订单激活幂等性修复(同订单只激活一次)
Why
业务规则确认:同一个订单只能激活一次,不允许重复生成套餐生效记录。
当前订单支付成功后会生成 PackageUsage(套餐使用记录)。在并发请求、回调重放、网络重试等场景下,如果缺少幂等控制,可能重复插入套餐使用记录,导致用户重复获得权益,属于高风险资金/权益漏洞。
What Changes
- 支付状态原子转换:将“待支付 -> 已支付”的状态变更做成原子操作(带条件更新),只有第一次成功转换才会触发套餐激活。
- 激活过程幂等:
activatePackage只在“首次支付成功”场景执行;重复请求返回“幂等成功”(你确认 A=1)。 - 可选防御性约束:为
tb_package_usage增加必要的唯一约束或幂等检查,防止异常路径插入重复记录。 - 补充测试:覆盖并发/重复调用场景,验证不会重复激活。
Impact
涉及模块(预期):
- Service 层:
internal/service/order/service.go(支付逻辑改为条件更新) - Store 层(可选):
internal/store/postgres/order_store.go(如需新增条件更新方法) - Model 层:使用
internal/model/order.go中的支付状态常量 - 错误处理:使用
pkg/errors/中已有的错误码CodeInvalidStatus - 数据库迁移(可选):
migrations/目录新增唯一索引(tb_package_usage) - 测试:
internal/service/order/service_test.go(新增并发/重复/状态异常测试) - 文档:
docs/fix-order-activation-idempotency/功能总结.md(新建)