php

对接支付宝接口时异步回调和同步回调的区别与作用!

dafenqi
2023-12-31 / 0 评论 / 10 阅读 / 正在检测是否收录...

对接支付宝接口时异步回调和同步回调的区别与作用!

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对接支付宝支付时异步回调和同步回调的具体作用以及案例代码。异步回调用于确认支付结果和更新订单状态,同步回调用于展示支付结果给用户查看。通过验证参数的合法性,可以确保支付结果的真实性和完整性,避免安全风险。在实际开发中,需要根据具体业务需求,结合支付宝提供的接口文档,进行相应的编码和调试。

0

Deprecated: strtolower(): Passing null to parameter #1 ($string) of type string is deprecated in /www/wwwroot/testblog.58heshihu.com/var/Widget/Archive.php on line 1032

评论 (0)

取消