fix(order+payment): B13/B14/B15 业务层中优先级修复#3
关闭 foundation-setup 审视剩下的 3 个中优先级业务 Bug,让订单/支付流程真正闭环。
根因:PaymentService.createPayment 签名只返回 String paymentUrl,调用方 OrderServiceImpl 拿不到真实 paymentNo,只能用 "P" + orderNo.substring(1) 脆弱反推。这个反推假设 orderNo 以 O 开头,且支付号编号策略永远跟订单一致 —— 根本是两套编号。
PaymentService.createPayment
String paymentUrl
OrderServiceImpl
"P" + orderNo.substring(1)
O
修复:
PaymentCreateResultVO { paymentNo, paymentUrl }
@Value @Builder
String null
根因:取消订单只改状态,库存永久扣减 —— 严重业务 Bug。此前有个 TODO: 回退库存(需要从 order_items 加载) 的注释被忽略。更严重的是:createOrder 本身都没写 order_items,等于这张表一直是空的。
TODO: 回退库存(需要从 order_items 加载)
createOrder
前置:新增 OrderItem Entity + OrderItemMapper(DB 表早已存在,但代码层缺建模)。
OrderItem
OrderItemMapper
product_snapshot
cancelOrder
InventoryService.restore
根因:原流程先按 tradeNo 判重、再按 paymentNo 定位。面对攻击者构造"同一 tradeNo 对应不同 paymentNo"时可能错位。
tradeNo
paymentNo
payment.callback.trade_no_mismatch
feat(order)
fix(payment)
fix(order)
test(order)
docs(checkpoint)
mvn clean compile + test-compile
.codebuddy/
base 选 feature/fb-06-api-contract-validation 而非 main:依赖 FB-06 PR #2 的工程产物(typed apiClient、生成目录等)作为前置条件。
这次修复再次印证 FB-09(scaffold Controller 不带认证上下文)和 FB-03(scaffold DTO 与业务入参错位)的杀伤力:scaffold 出来的 Order 没写 order_items,前端 payment 全是死代码,都是因为 scaffold 只按 Entity 扫一遍就产出 CRUD,缺乏业务语义约束。这些已在上一轮的 scaffold SKILL 局限文档中提醒过。
背景
关闭 foundation-setup 审视剩下的 3 个中优先级业务 Bug,让订单/支付流程真正闭环。
3 个 Bug 与修复
B13 — PaymentService 接口丢失 paymentNo
根因:
PaymentService.createPayment签名只返回String paymentUrl,调用方OrderServiceImpl拿不到真实 paymentNo,只能用"P" + orderNo.substring(1)脆弱反推。这个反推假设 orderNo 以O开头,且支付号编号策略永远跟订单一致 —— 根本是两套编号。修复:
PaymentCreateResultVO { paymentNo, paymentUrl }(@Value @Builder不可变)String null清晰B14 — cancelOrder 未回退库存
根因:取消订单只改状态,库存永久扣减 —— 严重业务 Bug。此前有个
TODO: 回退库存(需要从 order_items 加载)的注释被忽略。更严重的是:createOrder本身都没写 order_items,等于这张表一直是空的。前置:新增
OrderItemEntity +OrderItemMapper(DB 表早已存在,但代码层缺建模)。修复:
createOrder补写入 order_items(product_snapshot存 JSON 字符串,cast 为 JSONB)cancelOrder读 order_items 逐行调InventoryService.restoreB15 — handleCallback 幂等定位顺序
根因:原流程先按
tradeNo判重、再按paymentNo定位。面对攻击者构造"同一 tradeNo 对应不同 paymentNo"时可能错位。修复:
paymentNo定位 → 按状态机分支处理:payment.callback.trade_no_mismatch指标)5 个 commit
feat(order)fix(payment)fix(order)test(order)docs(checkpoint)验证
mvn clean compile + test-compileBUILD SUCCESS.codebuddy/lint 0 错误合并目标
base 选 feature/fb-06-api-contract-validation 而非 main:依赖 FB-06 PR #2 的工程产物(typed apiClient、生成目录等)作为前置条件。
意外观察
这次修复再次印证 FB-09(scaffold Controller 不带认证上下文)和 FB-03(scaffold DTO 与业务入参错位)的杀伤力:scaffold 出来的 Order 没写 order_items,前端 payment 全是死代码,都是因为 scaffold 只按 Entity 扫一遍就产出 CRUD,缺乏业务语义约束。这些已在上一轮的 scaffold SKILL 局限文档中提醒过。
下一轮可能方向