案例 支付宝回调里 TRADE_CLOSED 别再一刀切:全额退款与订单超时靠 refund_fee 区分

2026-09-03 21:07:43

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_feegmt_refund 等字段,支付通知则没有。

继续区分全额退款 vs 部分退款

  • 部分退款:交易状态仍是 TRADE_SUCCESS(交易成功),通知里带退款相关参数。
  • 全额退款:交易状态变为 TRADE_CLOSED(交易关闭),通知里有退款参数,同时带 gmt_close

关键点提醒

  • 退款接口 alipay.trade.refund 本身不接收 notify_url,退款触发的异步通知走的是支付下单时设置的 notify_url
  • 因此同一个回调里可能会收到「支付成功」和「退款」两类通知,必须按上述参数区分业务类型,不能套用同一套处理逻辑。

参考:支付宝文档中心-交易关闭如何区分全额退款/超时关闭

复制全文 生成海报 支付宝 支付 回调

推荐文章

程序员茄子在线接单