酷代码 AI
菜单
全部AI  /  热门  /  AI写代码神器
服务商

PHP对接支付宝支付完整demo,包含支付结果回调

# PHP对接支付宝支付完整Demo 下面是一个完整的PHP对接支付宝支付的示例,包含支付请求和异步回调处理。 ## 1. 准备工作 在开始前,确保: - 已注册支付宝开放平台账号 - 已创建应用并获取APPID - 已配置应用公钥和支付宝公钥 - 已开通所需支付产品权限 ## 2. 安装支付宝SDK ```bash composer require alipaysdk/easysdk:^2.0 ``` ## 3. 支付请求处理代码 ```php <?php require_once __DIR__ . '/vendor/autoload.php'; use Alipay\EasySDK\Kernel\Config; use Alipay\EasySDK\Payment\Page\Client as PageClient; class AlipayService { private $pageClient; public function __construct() { $options = new Config(); $options->protocol = 'https'; $options->gatewayHost = 'openapi.alipay.com'; $options->signType = 'RSA2'; // 配置参数(替换为你的实际参数) $options->appId = '你的APPID'; $options->merchantPrivateKey = '你的应用私钥'; $options->alipayPublicKey = '支付宝公钥'; $options->notifyUrl = 'https://你的域名/alipay_notify.php'; // 异步通知地址 $this->pageClient = new PageClient(); $this->pageClient->setOptions($options); } / * 生成支付页面URL * @param string $outTradeNo 商户订单号 * @param float $amount 金额(元) * @param string $subject 订单 * @return string 支付页面URL */ public function createPayment($outTradeNo, $amount, $subject) { try { $result = $this->pageClient->pay($subject, $outTradeNo, $amount, 'http://你的域名/return_url.php'); return $result->body; } catch (Exception $e) { // 处理异常 error_log('Alipay payment error: ' . $e->getMessage()); return false; } } } // 使用示例 $alipay = new AlipayService(); $outTradeNo = 'ORDER_' . time(); // 生成唯一订单号 $amount = 0.01; // 测试金额0.01元 $subject = '测试商品'; $payUrl = $alipay->createPayment($outTradeNo, $amount, $subject); if ($payUrl) { header("Location: " . $payUrl); exit; } else { echo "支付请求创建失败"; } ?> ``` ## 4. 异步通知处理代码(alipay_notify.php) ```php <?php require_once __DIR__ . '/vendor/autoload.php'; use Alipay\EasySDK\Kernel\Config; use Alipay\EasySDK\Payment\Common\Client as CommonClient; class AlipayNotify { private $commonClient; public function __construct() { $options = new Config(); $options->protocol = 'https'; $options->gatewayHost = 'openapi.alipay.com'; $options->signType = 'RSA2'; // 配置参数(替换为你的实际参数) $options->appId = '你的APPID'; $options->merchantPrivateKey = '你的应用私钥'; $options->alipayPublicKey = '支付宝公钥'; $this->commonClient = new CommonClient(); $this->commonClient->setOptions($options); } / * 验证异步通知并处理业务逻辑 */ public function handleNotify() { $params = $_POST; try { // 验证签名 $result = $this->commonClient->verifyNotify($params); if ($result) { // 签名验证通过 $tradeStatus = $params['trade_status']; if ($tradeStatus == 'TRADE_SUCCESS' || $tradeStatus == 'TRADE_FINISHED') { // 支付成功,处理业务逻辑 $outTradeNo = $params['out_trade_no']; // 商户订单号 $tradeNo = $params['trade_no']; // 支付宝交易号 $totalAmount = $params['total_amount']; // 交易金额 // TODO: 根据outTradeNo更新订单状态为已支付 // 注意:需要检查金额是否与订单一致,防止金额篡改 // 注意:需要检查订单状态是否已处理,防止重复通知 // 处理成功后返回success echo 'success'; return; } } } catch (Exception $e) { error_log('Alipay notify error: ' . $e->getMessage()); } // 验证失败或处理失败返回failure echo 'failure'; } } // 处理通知 $notify = new AlipayNotify(); $notify->handleNotify(); ?> ``` ## 5. 同步跳转处理(return_url.php) ```php <?php // 支付完成后支付宝会跳转到这个页面(GET请求) // 这个页面仅展示支付结果,实际业务状态应以异步通知为准 $outTradeNo = $_GET['out_trade_no']; // 商户订单号 $tradeNo = $_GET['trade_no']; // 支付宝交易号 // TODO: 这里可以查询订单状态并展示给用户 // 但业务处理应以异步通知为准,因为同步跳转可能不可靠 echo "<h1>支付结果</h1>"; echo "<p>订单号: {$outTradeNo}</p>"; echo "<p>支付宝交易号: {$tradeNo}</p>"; echo "<p>支付状态: 支付成功(实际状态请以异步通知为准)</p>"; ?> ``` ## 6. 注意事项 1. 安全性:异步通知处理是支付结果判定的唯一可靠依据,同步跳转不可作为支付成功的依据。 2. 幂等性:支付宝可能会多次发送相同的异步通知,确保你的业务逻辑能够处理重复通知。 3. 金额验证:务必验证通知中的金额与订单金额一致,防止金额篡改攻击。 4. 日志记录:建议记录所有通知请求和响应,便于排查问题。 5. 测试环境:开发阶段使用支付宝沙箱环境进行测试,不要在生产环境直接测试。 6. 异常处理:支付过程中可能出现的各种异常情况,如网络问题、签名错误等,都需要妥善处理。 7. 订单超时:支付宝支付有超时机制(默认15分钟),超时后订单将关闭。 8. 退款处理:如需支持退款,需要额外实现退款接口。 9. 对账:建议每日通过支付宝对账单核对交易记录,确保账务一致。 10. 证书模式:对于更高安全要求的场景,可以考虑使用支付宝证书模式。 ## 7. 三条额外需要注意的逻辑点 1. 异步通知处理必须返回'success'字符串(不带引号),否则支付宝会认为通知失败并重试。 2. 商户订单号(out_trade_no)必须在商户系统内唯一,避免重复使用同一订单号。 3. 必须验证通知中的app_id是否与你的应用一致,防止其他应用的恶意通知。 [2025-05-06 14:37:27 | AI写代码神器 | 1642点数解答]

相关提问