付款后取消,是逆向链路里难度陡升的分水岭。 钱已经打出去了,要撤销这笔合同,就必须把钱还回来。 而退款,发生在支付域,不在交易域——这就引出了「双轨并行」的核心设计。


一、与支付前取消的根本差异

支付前取消,只需要回补创单时的资产操作,没有资金流动。

付款后取消,必须同时完成:

  1. 退款:把用户已付的钱原路退回(通过支付域)
  2. 退资产:把非资金类资产(优惠券、红包余额、营销津贴等)退还给用户
  3. 关单:将订单状态推进到最终态(CANCELLED

这三件事,不能捆绑在一次调用里同步完成——退款是异步的(支付机构需要处理时间),而关单必须等退款完成后才能触发。

于是,这条链路天然拆成两条并行轨道

付款后发货前取消-双轨并行.png

两条轨道的唯一交汇点:退款单。关单轨道在执行前,必须确认退款单已经被支付域受理,否则不允许推进。


二、退款轨道:applyRefund

2.1 谁发起退款?

原则:所有退款入口收口在交易域。

无论是买家申请售后、客服取消、风控砍单,退款请求最终都由交易域统一向支付域发起。售后域、履约域都不能绕过交易域直接调用支付域的退款接口。

2.2 退款单的创建

交易域在向支付域发起退款请求前,先在本地创建退款单(RefundOrder)

退款单(RefundOrder)
  - refundId          退款单 ID
  - orderId           关联的主订单
  - skuOrderIds[]     本次退款涉及的 SkuOrder 列表
  - refundAmount      退款总金额
  - priceSnapshot     逆向算价快照(退多少钱、退哪些优惠)
  - status            PENDING → PROCESSING → SUCCESS / FAILED
  - applyTime         申请退款时间
  - finishTime        退款完成时间