要在 PHP 中接入 PayPal SDK 进行网上收款并处理回调(Webhook),你可以按照以下步骤进行操作:
步骤 1:安装 PayPal SDK首先,你需要安装 PayPal PHP SDK。你可以使用 Composer 进行安装:
composer require paypal/rest-api-sdk-php步骤 2:配置 PayPal SDK
在你的 PHP 项目中配置 PayPal SDK。你需要 PayPal 的客户端 ID 和客户端密钥,这些可以在 PayPal 开发者门户上获取。
示例配置代码<?php require 'vendor/autoload.php'; use PayPal\Rest\ApiContext; use PayPal\Auth\OAuthTokenCredential; // 设置 PayPal API 环境 $apiContext = new ApiContext( new OAuthTokenCredential( 'YOUR_CLIENT_ID', // 你的客户端 ID 'YOUR_CLIENT_SECRET' // 你的客户端密钥 ) ); // 设置 PayPal API 配置 $apiContext->setConfig([ 'mode' => 'sandbox', // 或 'live' 用于生产环境 'log.LogEnabled' => true, 'log.FileName' => '../PayPal.log', 'log.LogLevel' => 'DEBUG', // 可选: 'DEBUG', 'INFO', 'WARN' 或 'ERROR' 'cache.enabled' => true, ]); ?>步骤 3:创建支付请求
创建一个支付请求,并将用户重定向到 PayPal 进行支付。
示例代码<?php require 'vendor/autoload.php'; use PayPal\Api\Payer; use PayPal\Api\Amount; use PayPal\Api\Transaction; use PayPal\Api\RedirectUrls; use PayPal\Api\Payment; // 设置支付方式 $payer = new Payer(); $payer->setPaymentMethod('paypal'); // 设置支付金额 $amount = new Amount(); $amount->setTotal('10.00'); // 支付总金额 $amount->setCurrency('USD'); // 货币类型 // 设置交易信息 $transaction = new Transaction(); $transaction->setAmount($amount); $transaction->setDescription('支付描述'); // 设置回调 URL $redirectUrls = new RedirectUrls(); $redirectUrls->setReturnUrl('https://your-website.com/execute-payment.php') // 支付成功后回调 URL ->setCancelUrl('https://your-website.com/cancel-payment.php'); // 支付取消后回调 URL // 创建支付请求 $payment = new Payment(); $payment->setIntent('sale') ->setPayer($payer) ->setTransactions([$transaction]) ->setRedirectUrls($redirectUrls); try { $payment->create($apiContext); // 重定向用户到 PayPal 支付页面 header('Location: ' . $payment->getApprovalLink()); exit; } catch (Exception $e) { echo '支付创建失败: ' . $e->getMessage(); } ?>步骤 4:处理支付回调
在用户完成支付后,PayPal 会回调你设置的 URL。你需要在回调 URL 中处理支付结果。
示例代码(execute-payment.php)<?php require 'vendor/autoload.php'; use PayPal\Api\Payment; use PayPal\Api\PaymentExecution; if (isset($_GET['paymentId']) && isset($_GET['PayerID'])) { $paymentId = $_GET['paymentId']; $payerId = $_GET['PayerID']; // 获取支付对象 $payment = Payment::get($paymentId, $apiContext); // 执行支付 $execution = new PaymentExecution(); $execution->setPayerId($payerId); try { $result = $payment->execute($execution, $apiContext); echo '支付成功'; // 在这里处理支付成功后的逻辑,例如更新订单状态 } catch (Exception $e) { echo '支付执行失败: ' . $e->getMessage(); } } else { echo '支付失败'; } ?>步骤 5:处理 Webhook 回调
PayPal 提供 Webhook 来通知你支付状态的变化。你需要在 PayPal 开发者门户中配置 Webhook URL,并在你的服务器上处理这些回调。
示例代码(webhook.php)<?php require 'vendor/autoload.php'; use PayPal\Api\WebhookEvent; $bodyReceived = file_get_contents('php://input'); $headers = getallheaders(); try { // 验证 Webhook 签名 $signatureVerification = new \PayPal\Api\VerifyWebhookSignature(); $signatureVerification->setAuthAlgo($headers['PAYPAL-AUTH-ALGO']); $signatureVerification->setTransmissionId($headers['PAYPAL-TRANSMISSION-ID']); $signatureVerification->setCertUrl($headers['PAYPAL-CERT-URL']); $signatureVerification->setWebhookId('YOUR_WEBHOOK_ID'); // 你的 Webhook ID $signatureVerification->setTransmissionSig($headers['PAYPAL-TRANSMISSION-SIG']); $signatureVerification->setTransmissionTime($headers['PAYPAL-TRANSMISSION-TIME']); $signatureVerification->setRequestBody($bodyReceived); $request = clone $signatureVerification; $output = $signatureVerification->post($apiContext); if ($output->getVerificationStatus() === 'SUCCESS') { // 处理 Webhook 事件 $event = new WebhookEvent(); $event->fromJson($bodyReceived); switch ($event->getEventType()) { case 'PAYMENT.SALE.COMPLETED': // 处理支付完成事件 $sale = $event->getResource(); // 在这里处理支付完成后的逻辑,例如更新订单状态 break; // 处理其他事件类型 } } else { echo 'Webhook 验证失败'; } } catch (Exception $e) { echo 'Webhook 处理失败: ' . $e->getMessage(); } ?>
通过以上步骤,你可以在 PHP 中接入 PayPal SDK 进行网上收款并处理回调。确保在生产环境中使用真实的客户端 ID、客户端密钥和 Webhook ID,并将 mode 设置为 live。
网友回复