0%

支付宝异步回调处理逻辑优化

问题描述

生产环境 2024-03-31 的日志中出现了几条支付宝回调记录,调查后发现这几条支付宝回调对应同一条流水:一年前新增的一条 [钱包充值] 流水。这里有两个问题需要确定:

  1. 为何这条流水在新增的一年后才触发支付宝回调?
  2. 为何会出现多条重复的回调?

查阅了支付宝文档,找到了相关的解释:

  1. 文档地址:交易成功后一年又收到异步通知17156697768866062f8eea9717ac1db2a32dc64660ca3.png
  2. 文档地址:异步通知说明1715669789886f70f91b70a36c3dbefdd2baa21713ca0.png

支付宝异步回调处理优化

从下面这篇文档中了解到: trade_status(交易状态)说明,支付宝异步回调的通知中支付状态的变化如下:

17156697999141d366497844c3d0f77a020b859d4b515.png

退款成功 可能会收到 TRADE_CLOSEDTRADE_SUCCESS支付成功 可能会收到 TRADE_SUCCESSTRADE_FINISHED用户超时未支付 会收到 TRADE_CLOSED。一个 支付状态 可能代表不同的操作, 但我们在处理时需要明确知道这个 支付状态 对应的是什么操作,只需要弄清 支付成功退款 两个操作对应的支付状态即可,找到如下几个说明:

结合上面的文档,可以弄清 支付成功退款成功 两个操作对应的支付状态如下:

  1. 支付成功:支付状态为 TRADE_SUCCESS,数据中不包含退款相关信息。注:上面文档中说了支付状态为 TRADE_FINISHED 也可能代表支付成功,这是在交易不可退款的情况下返回的,而我们目前签约的支付是支持退款的(1年),因此无需考虑这种情况。
  2. 退款成功:支付状态为 TRADE_SUCCESSTRADE_CLOSED,数据中包含退款相关信息。

服务端只需要处理上面两种 支付状态 即可,其他 支付状态 无需处理。

参考文档

异步通知如何区分全额退款和部分退款 - 支付宝

异步通知如何区分全额退款和订单超时导致的交易关闭 - 支付宝

交易成功后一年又收到异步通知 - 支付宝

trade_status(交易状态)说明 - 支付宝

交易状态在什么情况下会变为TRADE_FINISHED(交易成功且结束,不可再做退款等任何操作)?