Loading... # [对接支付宝接口时异步回调和同步回调的区别与作用!](https://mp.weixin.qq.com/s/J4Q1CS8P77Pfs1HWqfcBJA) PHP对接支付宝支付的时候,异步回调和同步回调是非常重要的功能,用于确认支付结果和更新订单状态。本文将详细介绍异步回调和同步回调的作用,并提供具体的案例代码。 ## 一、异步回调的作用 异步回调(也称为服务器通知)是支付宝支付过程中最重要的一步,主要用于确认支付结果。当用户支付成功后,支付宝服务器会向商户服务器发送一个HTTP POST请求,通知支付结果。商户服务器接收到该回调消息后,需要验证消息的合法性,确认支付结果,并更新订单状态。 **具体步骤如下:** 商户服务器接收到支付宝服务器发送的异步回调请求,并获取请求参数。 验证参数的合法性。通过验签方式,校验请求参数是否被篡改。商户需要将请求参数按照一定的规则进行加密,并将加密结果与支付宝提供的公钥进行比对,以确定参数的真实性和完整性。 验证通过后,商户服务器处理回调请求,包括更新订单状态、发送邮件通知等。 商户服务器将处理结果返回给支付宝服务器。需要返回一个字符串 "success",表示接收成功。如果不返回或者返回其他字符串,支付宝服务器会间隔一段时间内重复发送回调请求。 通过异步回调,商户服务器可以确保支付结果的真实性,及时更新订单状态,避免订单的丢失或错误。异步回调是支付过程中必不可少的一环,它的主要作用是与支付宝服务器进行双向通信,确认支付结果,并进行后续处理。 **具体案例代码如下:** ```php <?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 <?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对接支付宝支付时异步回调和同步回调的具体作用以及案例代码。异步回调用于确认支付结果和更新订单状态,同步回调用于展示支付结果给用户查看。通过验证参数的合法性,可以确保支付结果的真实性和完整性,避免安全风险。在实际开发中,需要根据具体业务需求,结合支付宝提供的接口文档,进行相应的编码和调试。 最后修改:2023 年 12 月 31 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏