要在 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。
网友回复


