支付前取消是逆向链路里最简单的一种: 合同签了,但资金还没流动,合同撤销只需要回补创单时操作的各类资产。 没有退款,没有复杂的跨域协调,只要「干净还原到下单前的状态」就行。
支付前取消 = 回补创单时的资产操作。
创单时各资产的操作方式不同,取消时的回补操作也对应不同:
| 资产 | 创单操作 | 取消回补 |
|---|---|---|
| 库存 | FREEZE(冻结,预占模式) |
ROLLBACK_FREEZE(解冻) |
| 优惠券 | CONSUME(直接消耗) |
ROLLBACK_CONSUME(退回) |
| 红包余额 | DEDUCT(直接扣减) |
ROLLBACK_DEDUCT(退回) |
| 限购名额 | INCREASE(直接占用) |
ROLLBACK_INCREASE(释放) |
取消时,按各资产实际的回补操作还原,回到下单前的状态。
没有资金流动:因为用户还没有付款,所以不涉及退款动作。取消后,订单状态变为 CANCELLED,不是 CLOSED。这两个状态的语义完全不同(详见第二部分第五章),结算域对它们的处理方式也不同。
支付前取消的入口,在现实系统中非常容易变得散乱——用户主动取消、商家取消、超时系统自动取消、风控拦截取消……每个场景都有可能各自打一个不同的接口。
正确原则:所有取消入口统一收口到交易域的一个取消接口。

统一入口的好处: