+
95
-

回答

要在 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。

网友回复

我知道答案,我要回答