feat(payment): 撤销核销把已确认的资金退回延迟户
核销成功时钱已经从延迟户划给商户(进基本户),撤销核销此前只翻库、不碰钱:订单回到「待核销」,
钱却留在商户手里,等 D1 自动结算到银行卡之后就再也追不回来。现在撤销核销走通道的【交易确认退款】
把已确认的金额退回延迟户,这笔钱才重新变成不可结算、不可取现。
- 只有回退成功(或钱本来就在延迟户)才允许翻单,其余情况一律停在「已核销」,并按原因给商户话:
已结算到银行卡 / 正在退回中 / 暂时无法发起 / 请人工核对
- 回退结果用一套独立分类,不复用交易确认的 classify:23000003 在确认路径上是幂等成功(有真实回执
复验过),在回退路径上含义未定,既不能算成功也不能算失败,停在 reverting 交人工
- 认领与落结果各走独立事务:通道调用不是事务性的,这些写入跟着外层事务回滚会把通道的真实结果丢掉
- 迁移 V147 记录回退的请求号/日期/返回码/金额/时间;上一轮确认的回执保留下来作为证据
同时修掉审计发现的三个同类隐患:
- 放款前在订单行锁内复查「订单仍处于已核销」:否则撤销核销之后,补偿任务或在途的确认请求会把钱
再打给商户,而订单已经回到待核销
- 退款不再把语义未定的业务码判成失败:判失败会解锁订单让用户再退一次,而通道那边第一次其实已经
出款时,第二次就是重复出款
- 确认被认领后进程中断(部署、崩溃)会留下 confirming 孤儿:补偿任务只挑得到它、从不重发,那笔钱
永远冻在延迟户;隔天收掉这种孤儿重新确认一次(重发是幂等的)
回退结果未知时没有自动收敛通道(【交易确认退款查询】的合同还没有真实回执验证过),停在 reverting
交人工——这是有意的保守选择:把失败当成功会让订单翻回待核销而钱还在商户基本户。