支付宝支付回调的坑点

Posted RyougiChan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了支付宝支付回调的坑点相关的知识,希望对你有一定的参考价值。

梳理一下对接支付宝支付时回调踩过的一个坑。

问题

时间过了一年再次收到一条来自支付宝的回调信息,结果被处理成支付成功的回调(还好后面的逻辑有对订单状态进行校验,所以没有流程上的漏洞)。

支付宝支付的回调

通知触发条件

触发条件名触发条件描述触发条件默认值
TRADE_FINISHED交易完成true(触发通知)
TRADE_SUCCESS支付成功true(触发通知)
TRADE_CLOSED交易关闭true(触发通知)
WAIT_BUYER_PAY交易创建false(不触发通知)

从上表可得出,当支付宝交易单的状态被设为 TRADE_FINISHED/TRADE_SUCCESS/TRADE_CLOSED 时,都会触发一次回调通知

  • TRADE_SUCCESS
    TRADE_SUCCESS 的通知触发条件是商户签约的产品支持退款功能的前提下,买家付款成功
  • TRADE_FINISHED
    TRADE_FINISHED 的通知触发条件是:

    • 一、商户签约的产品不支持退款功能的前提下,买家付款成功;
    • 二、商户签约的产品支持退款功能的前提下,交易已经成功并且已经超过可退款期限。
  • TRADE_CLOSED
    未付款交易超时关闭,或支付完成后全额退款

通知的地址

通知的地址是调用 alipay.trade.create (统一收单交易创建接口)时指定的回调地址 notify_url

问题剖析

一年之后又收到一条通知,剖析日志我们发现:

  1. 订单刚好是通知消息日期的一年前
  2. 通知里有两个参数 trade_status=TRADE_FINISHED&refund_fee=0.00,也就是这个通知是由 TRADE_FINISHED 状态触发的
  3. 查验后台设置的可退款期限:一年
  4. 实证结论——这个问题是 TRADE_FINISHED 通知触发条件的第二种情况导致的

支付宝方面的问题:

  1. alipay.trade.refund 统一收单交易退款接口 没有提及退款存在回调的情况。而事实上退款之后(无论是全额还是部分),都会触发一次异步通知
  2. 支付宝的回调通知数据结构非常像,如果这次我们不是在自身的订单状态上预先做判断,可能这次我们遇到的问题会导致财务风险

总结

综上所述,支付宝支付的文档虽然很全,但是写得很乱,很多重要的点经常不再重要的地方重点说明。对接的时候还是要仔细且多考虑几个方面,尽量编写健壮的有一定程度容灾能力的代码。

参考

https://opendocs.alipay.com/a...
https://opendocs.alipay.com/o...

以上是关于支付宝支付回调的坑点的主要内容,如果未能解决你的问题,请参考以下文章

支付宝异步回调验证签名的那些走过的坑

支付宝、微信支付(国内、国际版)走过的坑

支付宝支付接口开发的回调地址怎么写

支付宝支付成功后如何实现回调信息?

thinkphp框架对接支付宝即时到账接口回调的代码

支付宝支付后返回app无法回调