php 支付宝退款回调
时间: 2023-09-15 21:23:31 浏览: 156
处理支付宝退款回调的 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 字符串,表示处理结果,以告知支付宝服务器是否接收到了回调信息。
阅读全文