fix(payment): 无实付金额的订单改走本地退款,不再向通道发起
0 元订单(整单被权益免费额度覆盖、下单即待核销)里没有钱,通道侧也没有原交易可指,
退款却按通道退款处理,卡在金额闸门上抛 Invalid refund amount:用户从「待使用」里出不去,
这一次免费额度也永远占着。开发库里有 12 单停在「有退款按钮、点了必定报错」的状态。
根因是退款把「能退的东西」等同于「通道收过的钱」。改为 paid_amount = 0 时本地结清:
不发通道请求,通道相关列留空并写一条自解释回执(LOCAL_NO_PAYABLE_AMOUNT),在同一事务里
让订单退出待核销,被占用的免费额度随之释放;不留「退款中」,因为那个状态的含义是等通道的
结论,而这单没有通道那一侧。悬账退款不受影响,仍然只走通道。
回归测试走真实链路(配了免费额度的商品 → 人才端下单 → 使用记录点退款),断言额度确实回来,
并用 verifyNoInteractions 锁住「从头到尾没碰过通道」;另有一条边界用例保证 0 元单上显式要求
退非零金额仍然被拒。修复前该用例报的正是用户那句 Invalid refund amount。