本文将深入探讨 PayPal 支付的两种主要方式:Checkout 收银台支付和 Subscription 订阅计划。通过详细的生命周期分析和具体实现步骤,帮助开发者快速掌握 PayPal 支付的核心流程。
Checkout 收银台支付的流程类似于支付宝的收银台,具体步骤如下:
请求支付 URL:本地应用组装参数并请求 Checkout 接口,接口同步返回一个支付 URL。
重定向支付:本地应用重定向至该 URL,用户登录 PayPal 账户并确认支付,支付成功后跳转至本地应用地址。
执行扣款:本地请求 PayPal 执行付款接口发起扣款。
异步通知:PayPal 发送异步通知至本地应用,本地应用进行验签操作。
处理业务:验签成功后,执行支付完成后的业务逻辑(如修改订单状态、增加销量、发送邮件等)。
Subscription 订阅支付的流程如下:
创建计划:首先创建一个订阅计划。
激活计划:激活该计划。
创建订阅申请:使用已激活的计划创建订阅申请。
用户授权支付:本地应用跳转至订阅申请链接,用户授权并完成第一期付款,支付后携带 token 跳转至本地应用地址。
执行订阅:回跳后请求执行订阅。
处理回调:收到订阅授权异步回调和支付结果的异步回调,验证成功后处理支付完成后的业务。
接下来,我们将通过代码实现上述流程。使用的是 PayPal 官方 PHP SDK。
1. 安装 SDK
bash
$ composer require paypal/rest-api-sdk-php
2. 创建 PayPal 配置文件
bash
$ touch config/paypal.php
配置文件内容如下:
php
<?php
return [
'sandbox' => [
'client_id' => env('PAYPAL_SANDBOX_CLIENT_ID', ''),
'secret' => env('PAYPAL_SANDBOX_SECRET', ''),
'notify_web_hook_id' => env('PAYPAL_SANDBOX_NOTIFY_WEB_HOOK_ID', ''),
'checkout_notify_web_hook_id' => env('PAYPAL_SANDBOX_CHECKOUT_NOTIFY_WEB_HOOK_ID', ''),
'subscription_notify_ web_hook_id' => env('PAYPAL_SANDBOX_SUBSCRIPTION_NOTIFY_WEB_HOOK_ID', ''),
],
'live' => [
'client_id' => env('PAYPAL_CLIENT_ID', ''),
'secret' => env('PAYPAL_SECRET', ''),
'notify_web_hook_id' => env('PAYPAL_NOTIFY_WEB_HOOK_ID', ''),
'checkout_notify_web_hook_id' => env('PAYPAL_CHECKOUT_NOTIFY_WEB_HOOK_ID', ''),
'subscription_notify_web_hook_id' => env('PAYPAL_SUBSCRIPTION_NOTIFY_WEB_HOOK_ID', ''),
],
];
3. 创建 PayPal 服务类
bash
$ mkdir -p app/Services && touch app/Services/PayPalService.php
服务类的主要代码如下:
php
<?php
namespace App\Services;
use PayPal\Api\Amount;
use PayPal\Api\Details;
use PayPal\Api\Item;
use PayPal\Api\ItemList;
use PayPal\Api\Payer;
use PayPal\Api\Payment;
use PayPal\Api\RedirectUrls;
use PayPal\Api\Transaction;
use PayPal\Api\PaymentExecution;
use PayPal\Auth\OAuthTokenCredential;
use PayPal\Rest\ApiContext;
class PayPalService
{
// 省略部分代码
public function checkout(Order $order)
{
// 省略具体实现
}
public function executePayment($paymentId)
{
// 省略具体实现
}
}
4. 注册 PayPal 服务类
在 app/Providers/AppServiceProvider.php 中注册服务类:
php
<?php
namespace App\Providers;
use App\Services\PayPalService;
class AppServiceProvider extends ServiceProvider
{
public function register()
{
$this->app->singleton('paypal', function () {
// 根据环境配置
$config = config('paypal');
return new PayPalService($config);
});
}
}
5. 创建控制器
bash
$ php artisan make:controller PaymentController
控制器的主要代码如下:
php
<?php
namespace App\Http\Controllers;
use App\Models\Order;
class PaymentController extends Controller
{
public function payByPayPalCheckout(Order $order)
{
// 省略具体逻辑
}
public function payPalReturn(Request $request)
{
// 处理支付回跳
}
public function payPalNotify(Request $request)
{
// 处理异步通知
}
}
1. 创建计划并激活
php
<?php
namespace App\Services;
use PayPal\Api\Plan;
use PayPal\Api\PaymentDefinition;
use PayPal\Api\MerchantPreferences;
class PayPalService
{
public function createPlan(Order $order)
{
// 省略具体实现
}
}
2. 创建订阅申请
php
<?php
namespace App\Services;
use PayPal\Api\Agreement;
class PayPalService
{
public function createAgreement(Plan $plan, Order $order)
{
// 省略具体实现
}
}
3. 执行订阅
php
<?php
namespace App\Services;
use PayPal\Api\Agreement;
class PayPalService
{
public function executeAgreement($token)
{
// 省略具体实现
}
}
4. 控制器调用
bash
$ php artisan make:controller SubscriptionsController
控制器的主要代码如下:
php
<?php
namespace App\Http\Controllers;
use App\Models\Order;
class SubscriptionsController extends Controller
{
public function createPlan(Order $order)
{
// 省略具体逻辑
}
public function executeAgreement(Request $request)
{
// 处理订阅回跳
}
public function payPalNotify(Request $request)
{
// 处理异步通知
}
}
通过本文的详细介绍,您应该已经掌握了 PayPal 支付的两种主要方式:Checkout 收银台支付和 Subscription 订阅计划。无论是单次支付还是周期性订阅,PayPal 都提供了完善的解决方案。希望本文能帮助您在实际项目中快速集成 PayPal 支付功能。