PHP对接支付宝支付的时候,异步回调和同步回调是非常重要的功能,用于确认支付结果和更新订单状态。本文将详细介绍异步回调和同步回调的作用,并提供具体的案例代码。
一、异步回调的作用
异步回调(也称为服务器通知)是支付宝支付过程中最重要的一步,主要用于确认支付结果。当用户支付成功后,支付宝服务器会向商户服务器发送一个HTTP POST请求,通知支付结果。商户服务器接收到该回调消息后,需要验证消息的合法性,确认支付结果,并更新订单状态。
具体步骤如下:
- 商户服务器接收到支付宝服务器发送的异步回调请求,并获取请求参数。
- 验证参数的合法性。通过验签方式,校验请求参数是否被篡改。商户需要将请求参数按照一定的规则进行加密,并将加密结果与支付宝提供的公钥进行比对,以确定参数的真实性和完整性。
- 验证通过后,商户服务器处理回调请求,包括更新订单状态、发送邮件通知等。
- 商户服务器将处理结果返回给支付宝服务器。需要返回一个字符串 "success",表示接收成功。如果不返回或者返回其他字符串,支付宝服务器会间隔一段时间内重复发送回调请求。
- 通过异步回调,商户服务器可以确保支付结果的真实性,及时更新订单状态,避免订单的丢失或错误。异步回调是支付过程中必不可少的一环,它的主要作用是与支付宝服务器进行双向通信,确认支付结果,并进行后续处理。
具体案例代码如下:
<?php
// 验证参数的合法性
function verifySign($params, $publicKey) {
$sign = $params['sign']; // 签名参数
unset($params['sign']); // 剔除签名参数
ksort($params); // 按照参数名进行升序排序
$data = '';
foreach ($params as $key => $value) {
$data .= $key . '=' . $value . '&';
}
$data = rtrim($data, '&');
// 使用openssl_verify函数验签
$result = openssl_verify($data, base64_decode($sign), $publicKey, OPENSSL_ALGO_SHA256);
return $result == 1;
}
// 更新订单状态
function updateOrderStatus($orderNo, $status) {
// 更新订单状态的逻辑代码
}
// 处理支付宝异步回调请求
function handleAlipayNotify() {
$params = $_POST; // 获取回调参数
$publicKey = '支付宝提供的公钥';
// 验证参数的合法性
if (verifySign($params, $publicKey)) {
// 验签通过
$orderNo = $params['out_trade_no']; // 商户订单号
$tradeStatus = $params['trade_status']; // 支付状态
if ($tradeStatus == 'TRADE_SUCCESS') {
// 支付成功,更新订单状态为已支付
updateOrderStatus($orderNo, 'paid');
}
echo 'success'; // 返回接收成功的标识
} else {
// 验签失败,可能存在安全风险
echo 'fail'; // 返回接收失败的标识
}
}
// 入口函数
handleAlipayNotify();
?>
二、同步回调的作用
同步回调(也称为前台通知)的主要作用是给用户展示支付结果页面。当用户支付成功后,支付宝会跳转回商户指定的同步回调地址,携带支付结果参数。商户服务器接收到该回调后,需要验证参数的合法性,并根据支付结果展示对应的页面。
具体步骤如下:
- 商户服务器接收到支付宝跳转的同步回调请求,并获取请求参数。
- 验证参数的合法性。通过验签方式,校验请求参数是否被篡改,确保参数的真实性和完整性。
- 需要判断支付结果的具体状态,根据支付状态展示对应的页面,如支付成功页面、支付失败页面等。
- 同步回调通常用于展示支付结果给用户查看,不作为最终支付结果的判断依据。因为同步回调是在前端完成的,可能会被伪造或篡改。验证参数的合法性只是为了避免被恶意攻击,不能作为支付结果的唯一判断依据。
具体案例代码如下:
<?php
// 验证参数的合法性
function verifySign($params, $publicKey) {
$sign = $params['sign']; // 签名参数
unset($params['sign']); // 剔除签名参数
ksort($params); // 按照参数名进行升序排序
$data = '';
foreach ($params as $key => $value) {
$data .= $key . '=' . $value . '&';
}
$data = rtrim($data, '&');
// 使用openssl_verify函数验签
$result = openssl_verify($data, base64_decode($sign), $publicKey, OPENSSL_ALGO_SHA256);
return $result == 1;
}
// 处理支付宝同步回调请求
function handleAlipayReturn() {
$params = $_GET; // 获取回调参数
$publicKey = '支付宝提供的公钥';
// 验证参数的合法性
if (verifySign($params, $publicKey)) {
// 验签通过
$tradeStatus = $params['trade_status']; // 支付状态
if ($tradeStatus == 'TRADE_SUCCESS') {
// 支付成功,展示支付成功页面
echo '支付成功!';
} else {
// 支付失败,展示支付失败页面
echo '支付失败!';
}
} else {
// 验签失败,可能存在安全风险
echo '验签失败!';
}
}
// 入口函数
handleAlipayReturn();
?>
总结
以上是PHP对接支付宝支付时异步回调和同步回调的具体作用以及案例代码。异步回调用于确认支付结果和更新订单状态,同步回调用于展示支付结果给用户查看。通过验证参数的合法性,可以确保支付结果的真实性和完整性,避免安全风险。在实际开发中,需要根据具体业务需求,结合支付宝提供的接口文档,进行相应的编码和调试。
{{item.user_info.nickname ? item.user_info.nickname : item.user_name}}
作者 管理员 企业
{{itemf.name}}
{{itemc.user_info.nickname}}
{{itemc.user_name}}
回复 {{itemc.comment_user_info.nickname}}
{{itemf.name}}