TRADE_CLOSED 两种触发语义不同:全额退款已付、超时关闭未付,务必用参数区分
对接支付宝异步通知时,TRADE_CLOSED(交易关闭)是个容易踩坑的状态:它可能是「全额退款」导致的,也可能是「订单超时未支付自动关闭」。两者最终状态都是 TRADE_CLOSED,语义却完全不同——一个钱已付需要退回,一个根本没付。混淆后可能把退款订单当成未支付处理,导致资损或重复退款的逻辑错误。
先区分全额退款 vs 订单超时关闭
判断依据是通知里有没有退款相关字段:
- 全额退款触发的
TRADE_CLOSED通知中,会带refund_fee(总退款金额)和gmt_refund(交易退款时间)参数。 - 订单超时关闭触发的
TRADE_CLOSED通知中,没有这两个参数。
再配合 gmt_close(订单结束时间)确认关闭动作,若是退款场景,可通过 out_biz_no / out_request_no 定位到具体是哪一笔退款。
再区分退款通知 vs 支付通知
支付成功触发的通知和退款触发的通知进入的是同一个回调地址(原因见下文),区分方法同样看参数:退款触发的通知里带有 refund_fee、gmt_refund 等字段,支付通知则没有。
继续区分全额退款 vs 部分退款
- 部分退款:交易状态仍是
TRADE_SUCCESS(交易成功),通知里带退款相关参数。 - 全额退款:交易状态变为
TRADE_CLOSED(交易关闭),通知里有退款参数,同时带gmt_close。
关键点提醒
- 退款接口
alipay.trade.refund本身不接收notify_url,退款触发的异步通知走的是支付下单时设置的notify_url。 - 因此同一个回调里可能会收到「支付成功」和「退款」两类通知,必须按上述参数区分业务类型,不能套用同一套处理逻辑。