全部
常见问题
产品动态
精选推荐

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

管理 管理 编辑 删除

PHP对接支付宝支付的时候,异步回调和同步回调是非常重要的功能,用于确认支付结果和更新订单状态。本文将详细介绍异步回调和同步回调的作用,并提供具体的案例代码。

一、异步回调的作用

异步回调(也称为服务器通知)是支付宝支付过程中最重要的一步,主要用于确认支付结果。当用户支付成功后,支付宝服务器会向商户服务器发送一个HTTP POST请求,通知支付结果。商户服务器接收到该回调消息后,需要验证消息的合法性,确认支付结果,并更新订单状态。

具体步骤如下:

  1. 商户服务器接收到支付宝服务器发送的异步回调请求,并获取请求参数。
  2. 验证参数的合法性。通过验签方式,校验请求参数是否被篡改。商户需要将请求参数按照一定的规则进行加密,并将加密结果与支付宝提供的公钥进行比对,以确定参数的真实性和完整性。
  3. 验证通过后,商户服务器处理回调请求,包括更新订单状态、发送邮件通知等。
  4. 商户服务器将处理结果返回给支付宝服务器。需要返回一个字符串 "success",表示接收成功。如果不返回或者返回其他字符串,支付宝服务器会间隔一段时间内重复发送回调请求。
  5. 通过异步回调,商户服务器可以确保支付结果的真实性,及时更新订单状态,避免订单的丢失或错误。异步回调是支付过程中必不可少的一环,它的主要作用是与支付宝服务器进行双向通信,确认支付结果,并进行后续处理。

具体案例代码如下:

<?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();
?>

二、同步回调的作用

同步回调(也称为前台通知)的主要作用是给用户展示支付结果页面。当用户支付成功后,支付宝会跳转回商户指定的同步回调地址,携带支付结果参数。商户服务器接收到该回调后,需要验证参数的合法性,并根据支付结果展示对应的页面。

具体步骤如下:

  1. 商户服务器接收到支付宝跳转的同步回调请求,并获取请求参数。
  2. 验证参数的合法性。通过验签方式,校验请求参数是否被篡改,确保参数的真实性和完整性。
  3. 需要判断支付结果的具体状态,根据支付状态展示对应的页面,如支付成功页面、支付失败页面等。
  4. 同步回调通常用于展示支付结果给用户查看,不作为最终支付结果的判断依据。因为同步回调是在前端完成的,可能会被伪造或篡改。验证参数的合法性只是为了避免被恶意攻击,不能作为支付结果的唯一判断依据。

具体案例代码如下:

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

请登录后查看

CRMEB-慕白寒窗雪 最后编辑于2023-08-16 14:04:04

快捷回复
回复({{post_count}}) {{!is_user ? '我的回复' :'全部回复'}}
回复从新到旧

{{item.user_info.nickname ? item.user_info.nickname : item.user_name}}

作者 管理员 企业

{{item.floor}}# 同步到gitee 已同步到gitee {{item.is_suggest==1? '取消推荐': '推荐'}}
{{item.floor}}#
{{item.user_info.title}}
附件

{{itemf.name}}

{{item.created_at}}  {{item.ip_address}}
{{item.like_count}}
{{item.showReply ? '取消回复' : '回复'}}
删除
回复
回复

{{itemc.user_info.nickname}}

{{itemc.user_name}}

作者 管理员 企业

回复 {{itemc.comment_user_info.nickname}}

附件

{{itemf.name}}

{{itemc.created_at}}   {{itemc.ip_address}}
{{itemc.like_count}}
{{itemc.showReply ? '取消回复' : '回复'}}
删除
回复
回复
查看更多
回复
回复
2056
{{like_count}}
{{collect_count}}
添加回复 ({{post_count}})

相关推荐

CRMEB-慕白寒窗雪 作者
社区运营专员---高冷のBoy | 呆萌のGirl

回答

2304

发布

1777

经验

45564

快速安全登录

使用微信扫码登录
{{item.label}} {{item.label}} {{item.label}} 板块推荐 常见问题 产品动态 精选推荐 首页头条 首页动态 首页推荐
加精
取 消 确 定
回复
回复
问题:
问题自动获取的帖子内容,不准确时需要手动修改. [获取答案]
答案:
提交
bug 需求 取 消 确 定

微信登录/注册

切换手机号登录

{{ bind_phone ? '绑定手机' : '手机登录'}}

{{codeText}}
切换微信登录/注册
暂不绑定
CRMEB客服

CRMEB咨询热线 咨询热线

400-8888-794

微信扫码咨询

CRMEB开源商城下载 开源下载 CRMEB官方论坛 帮助文档
返回顶部 返回顶部
CRMEB客服