# 订单激活幂等性修复(同订单只激活一次) ## 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`(新建)