最近在接支付宝的支付相关功能,用到异步通知比较多,也比较容易出现问题。
这里总结了一下支付宝异步通知的相关内容,希望能对大家有所帮助。
一、什么是异步通知
异步通知是指支付宝通过主动向开发者发送消息通知的方式来告知商家目前交易变更的情况。
支付宝建议主要通过这种方式来确定实际的交易状态,实际是通过 POST 的方式去发送通知的。
二、如何设置异步通知地址
既然是支付宝主动通知,需要预先给到支付宝提供一个通知的地址,而根据不同的产品,异步通知的地址设置的也不同,主要分为以下两个情况:
- 通过接口参数配置的异步通知地址
- 通过平台配置的异步通知地址
通过接口参数配置的异步通知地址
使用场景:交易类收单产品,例如当面付、手机网站支付等
配置方式:在接口的 notify_url 参数中设置接收的地址[如何设置notify_url]
地址要求:能正常访问(http 状态为 200)
接口是否支持异步通知就看对应的接口文档参数里面是否有 notify_url 参数。
通过平台配置的异步通知地址
使用场景:资金营销类产品,例如转账到支付宝账号、商家券、蚂蚁门店等
配置方式:在开发应用下的应用网关里进行地址配置 [如何设置应用网关]
地址要求:能正常访问(http 状态为 200)
⚠️ 特别说明:需要先对消息通知进行订阅操作,不订阅不发哦 [如何订阅蚂蚁消息]
三、异步通知如何触发
支付宝的异步通知也不是你想要就能给你发的,他发送的逻辑主要是按照该事件是否达到了某个【状态】。
对于交易类的产品,支付宝统一设定了交易状态,针对不同产品的状态有基本是否发送配置,下面将对各类交易状态进行逐一介绍。
支付宝交易状态说明
支付宝给订单设置了四个交易状态,分别为:
- WAIT_BUYER_PAY(交易创建,等待买家付款)
- TRADE_SUCCESS(交易支付成功,可退款)
- TRADE_FINISHED(交易结束,不可退款)
- TRADE_CLOSED(未付款交易超时关闭,或支付完成后全额退款)
经验分享:交易成功(TRADE_SUCCESS)和交易结束(TRADE_FINISHED)的区别在于是否可以退款,这个怎么理解呢?
关键点在于这笔交易 是否允许退款 或者是 允许多久时间内可以退款。
如果交易是不允许退款的交易,订单的交易状态会直接变为交易结束(TRADE_FINISHED),并不会经过交易成功(TRADE_SUCCESS);
如果是允许6个月内退款的,在交易成功之后的6个月后才会由交易成功(TRADE_SUCCESS)变为交易结束(TRADE_FINISHED)。
因为这个逻辑,就会出现一些奇奇怪怪的问题 (。_ 。) 例如:
支付宝交易状态触发条件
那么,是所有的状态都会发送吗?可不可以不发送?
当然不是所有状态都发送的,比如交易创建,等待买家付款(WAIT_BUYER_PAY)这个状态对于我们来说就没什么用。
对于不同的产品,交易状态是否触发都不一样,例如手机网站支付:
除了交易创建之外,其他都是默认会发送的。参考:[各支付产品异步通知触发说明]
订阅消息的触发条件
上面介绍支付宝交易的触发条件,下面来简单说明下订阅消息是如何触发状态的。
订阅消息的触发状态就有很多了,不同的产品有不同的触发状态。下面以商家券产品为例:
目前有创建、修改、停止、追加四种通知,需要哪个状态触发通知,就订阅哪个通知。
目前的订阅方式有两种:WebSocket 和 HTTP。
- 如果是 HTTP 的方式,接收的地址直接配置在应用网关上;
- WebSocket 的方式无需配置应用网关,按照文档进行接入即可。
四、获取到异步通知之后要做什么
上面说过,支付宝的异步通知是以 post 方式获取的,用来判断交易的状态,那么接收到异步通知之后除了进行交易状态的判断之外我们还需要做什么呢?直接进行逻辑处理?数据落库?
都不是,重要的是 安全! 安全! 安全!(▼ヘ▼#) 严肃强调
收到异步通知消息之后一定要判断清楚这条消息是不是真的是支付宝发出的,现在外面不法分子很多,大家要小心。
为了判断消息的真伪,我们需要 先对接收到的数据进行验签。
验签的方式这边就不做较多的叙述了,放在这里大家自己看 [SDK 如何实现签名验签]。
验证成功之后需要直接在页面上打印出 success 七个字符给支付宝,告诉支付宝你已经成功收到这个消息了。
如果你不想打印也行,只不过就是接下来的 24 个小时以内,支付宝会一直给你发这笔消息
[重复收到异步通知]
验签处理完成之后,你想干嘛就可以干嘛啦~
以上就是关于支付宝异步通知基本逻辑啦,欢迎大家一起补充订正,✿✿ヽ(°▽°)ノ✿ 一起交流进步~
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。