关于支付宝退款回调的问题

本文探讨了支付宝退款回调的细节,指出全额退款可能无通知,而部分退款会产生异步通知。退款回调地址与支付回调地址相同,可通过退款通知中的特定参数(如商户订单号、退款金额、退款时间)来区分支付和退款事件。了解这些信息对于正确处理支付宝退款流程至关重要。
摘要由CSDN通过智能技术生成

最近发现的一个支付宝退款接口的坑,记录一下

       支付宝的退款是通过调用 alipay.trade.refund (统一收单交易退款接口)接口实现的,详情见官方文档

       开发过微信支付的同学都知道,微信退款是有回调通知的,但是支付宝的退款接口文档上没有说明是否有退款通知,一开始我以为没有退款通知,因为在调用申请退款接口时就直接把退款的相关参数给返回了,例如退款金额,退款时间等字段;后来我才发现原来支付宝是有退款通知的,下面是退款的两种情景:

  • 全额退款:我测试是没有退款通知的,并且全额退款后,订单的交易状态会变为交易关闭( TRADE_CLOSED

  • 部分退款:一定会触发异步通知,那么肯定会有同学问了,这个异步通知地址是在哪里设置的呢?其实这个异步通知的地址就是调用 alipay.trade.create (统一收单交易创建接口)时指定的回调地址

       那么问题又来了,退款的回调地址和支付时的回调地址是同一个,我怎么来区分这个回调是支付还是退款呢?退款的异步通知参数中一定会返回 out_biz_no(商户订单号)、refund_fee(本次退款金额)、gmt_refund(退款时间)

支付回调参数

{
   
	"gmt_create": "2020-05-22 16:44:26",
	"charset": "utf-8",
	"seller_email": "xxxx@xxx.cn",
	"subject": "xxxx",
	"sign": "VEVT+QbX73V3DG07Z1cFPcwR23D3jwKsv7tBT7ig1z1WRty4yUoEdyfcckVp6r1Bgkj33LE+dsRNio89bJnrQzNrBVG7jcK4qB4+UMEALFE5GtS7zYv3p5a4k4gKYzdfWP7y2jmWV5aHpPC3DvvJ3zwUZn67etrbgMwjlTf3PVXpSUd6Uf4xz\/UPwUtTX65hTHNmj0xUwbDHcO69wz9rSLC6gu92Mdq0IGLbKRGcXAc0iemln2FzeLYLs3TGROMYR2W5tmh49cac5mUHIOS3QbD73lFQoZ0tS9L+ou7zhVkPQu5CMpdsySThHYOqxf\/RSi9vLitaEkg7a+bm83B3pw==",
	"bu
  • 7
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
处理支付宝退款回调的 PHP 代码可以参考以下示例: ```php <?php // 获取支付宝退款回调数据 $refundData = $_POST; // 验证回调签名 if (!verifySign($refundData)) { exit('fail'); } // 处理退款回调业务逻辑 if ($refundData['trade_status'] == 'SUCCESS') { // 退款成功,更新订单状态等操作 // ... exit('success'); } else { // 退款失败,记录日志等操作 // ... exit('fail'); } /** * 验证回调签名 * * @param array $data 回调数据 * @return bool */ function verifySign($data) { // 获取支付宝公钥 $alipayPublicKey = file_get_contents('https://openapi.alipay.com/gateway.do?service=publicKey&charset=utf-8'); // 创建支付宝公钥对象 $publicKey = openssl_get_publickey($alipayPublicKey); // 处理回调数据,去除 sign、sign_type 参数 unset($data['sign']); unset($data['sign_type']); ksort($data); $queryString = http_build_query($data); // 验证签名 $result = openssl_verify($queryString, base64_decode($data['sign']), $publicKey, OPENSSL_ALGO_SHA256); // 释放公钥资源 openssl_free_key($publicKey); return $result === 1; } ``` 在上述代码中,`verifySign` 函数用于验证回调签名。首先获取支付宝公钥,然后将回调数据按照参数名进行排序,并将 sign、sign_type 参数去除,将剩余参数拼接成字符串。最后使用 OpenSSL 库的 `openssl_verify` 函数进行签名验证,验证通过返回 1,否则返回 0 或 -1。 在处理退款回调业务逻辑时,首先判断退款状态是否为 SUCCESS,如果是则表示退款成功,可以更新订单状态等操作。如果退款状态不是 SUCCESS,则表示退款失败,可以记录日志等操作。最后需要输出 success 或 fail 字符串,表示处理结果,以告知支付宝服务器是否接收到了回调信息。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值