问题描述
生产环境 2024-03-31
的日志中出现了几条支付宝回调记录,调查后发现这几条支付宝回调对应同一条流水:一年前新增的一条 [钱包充值] 流水。这里有两个问题需要确定:
- 为何这条流水在新增的一年后才触发支付宝回调?
- 为何会出现多条重复的回调?
查阅了支付宝文档,找到了相关的解释:
- 文档地址:交易成功后一年又收到异步通知
- 文档地址:异步通知说明
支付宝异步回调处理优化
从下面这篇文档中了解到: trade_status(交易状态)说明,支付宝异步回调的通知中支付状态的变化如下:
退款成功 可能会收到 TRADE_CLOSED
或 TRADE_SUCCESS
,支付成功 可能会收到 TRADE_SUCCESS
或 TRADE_FINISHED
,用户超时未支付 会收到 TRADE_CLOSED
。一个 支付状态 可能代表不同的操作, 但我们在处理时需要明确知道这个 支付状态 对应的是什么操作,只需要弄清 支付成功 和 退款 两个操作对应的支付状态即可,找到如下几个说明:
- 异步通知如何区分全额退款和订单超时导致的交易关闭 - 支付宝
- 异步通知如何区分全额退款和部分退款 - 支付宝
- 交易状态在什么情况下会变为TRADE_FINISHED(交易成功且结束,不可再做退款等任何操作)?
结合上面的文档,可以弄清 支付成功 和 退款成功 两个操作对应的支付状态如下:
- 支付成功:支付状态为
TRADE_SUCCESS
,数据中不包含退款相关信息。注:上面文档中说了支付状态为TRADE_FINISHED
也可能代表支付成功,这是在交易不可退款的情况下返回的,而我们目前签约的支付是支持退款的(1年),因此无需考虑这种情况。 - 退款成功:支付状态为
TRADE_SUCCESS
或TRADE_CLOSED
,数据中包含退款相关信息。
服务端只需要处理上面两种 支付状态 即可,其他 支付状态 无需处理。