来源:Trello/Bug 单 #661(台湾外卖 ChaChaEat,代码错误,优先级 3,2026-09-18 创建) 记录时间:2026-09-22 状态:后端已实现(
POST /pay/switch),待用户端 App 接入
用户选了一个支付方式,支付不成功,返回订单是待支付状态,点击付款按钮时无法更换支付方式。期望:用户可更换支付方式。
订单 payType 在下单时写死(UserOrderController 创建时 setPayType),之后没有任何接口能修改;而两个支付渠道的创建校验各自按 payType 把关:
OmgPaymentCreateService 校验 OrderLifecycleService.isCardWalletPayType(order.getPayType())LinePayOrderGuard / LinePayService 校验 payType == 3,且 /pay/line/create 只收 ddId 无方式参数因此支付失败后只能原路重试。唯一已支持的切换是卡钱包组内 Credit↔ApplePay(/pay/omg/retry 已支持传新方式,但不回写 payType)。
新增统一入口 POST /pay/switch(PayMethodSwitchController → PayMethodSwitchService),入参 orderId + paymentMethod:
state 0-2、payStatus=0、金额有效1/2/3/4/5(6=线下转账不开放,商家侧流程);到付(1)/现金(4) 仅自取(type=1)/堂食(type=2)订单可切(与下单现金闸门同规则)order.payType(同方式跳过回写),写订单日志「用户更换支付方式:X → Y」OmgPaymentCreateService.create;3 → LinePayService.create;1/4 → 无支付环节直接成功data.payParams 携带渠道支付参数(线下方式为 null,App 刷新订单即可)顺序约束:必须先回写再拉起——两渠道创建校验都以 order.payType 为闸门。
已知边界(有意为之,非遗漏):旧渠道未完结的支付尝试不做主动跨渠道关闭,依赖其回调处的 payStatus 守卫(双通道回调只有一个能落账)与既有补偿任务(OMG OmgPaymentAutoCompensationTask、LINE Pay LinePayCancellationCompensationService)收口;极端情形(旧渠道回调晚到且已付款)走对账/退款流程。后续如需主动关闭,可在回写前接入两渠道的取消/作废能力。
| 文件 | 改动 |
|---|---|
com.ruoyi.app.pay.PayMethodSwitchController |
新增 /pay/switch 入口 |
com.ruoyi.app.pay.PayMethodSwitchService |
新增切换/校验/路由逻辑 |
com.ruoyi.app.pay.dto.PayMethodSwitchRequest |
新增请求 DTO |
| i18n ×6(messages / vi / en_US / th_TH / zh_CN / zh_TW) | 新增 no.pay.switch.* 5 个 key |
PayMethodSwitchServiceTest |
新增 8 个用例 |
原渠道接口(/pay/omg/create、/pay/omg/retry、/pay/line/create)与下单流程零改动。
PayMethodSwitchServiceTest:线下切换回写+日志+跳过支付、外送单拒线下、跨渠道先回写后拉起(InOrder)、同方式不重复回写、已支付/非法方式/非本人单/多门店子单拒绝createRejectsUnsupportedPayType(payType 白名单停用基线,另行处理)外全部通过POST /pay/switch