本文将详细解析PayPal Checkout收银台支付和Subscription订阅支付的完整流程,并通过代码示例帮助你快速实现。
一、支付流程解析
1. Checkout收银台支付
流程拆解如下:
流程详解:
- 发起支付请求:本地应用组装参数并请求Checkout接口,接口同步返回一个支付URL。
- 用户支付:本地应用重定向至支付URL,用户登录PayPal账户并确认支付,支付成功后跳转至本地应用地址。
- 执行扣款:本地应用请求PayPal执行付款接口发起扣款。
- 异步通知:PayPal发送异步通知至本地应用,本地应用验签数据包。
- 支付完成处理:验签成功后,执行订单状态更新、销量增加、发送邮件等业务。
2. Subscription订阅支付
流程拆解如下:
流程详解:
- 创建计划:创建一个订阅计划。
- 激活计划:激活该计划。
- 创建订阅申请:使用已激活的计划创建订阅申请。
- 用户授权并支付:本地应用跳转至订阅申请链接,用户授权并完成第一期付款,支付后携带token跳转至本地应用地址。
- 执行订阅:回跳后请求执行订阅。
- 异步回调处理:收到订阅授权和支付结果的异步回调,验证成功后执行业务处理。
二、具体实现
1. Checkout收银台支付
安装PayPal SDK
bash
$ composer require paypal/rest-api-sdk-php:*
创建配置文件
php
$ 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’, ”),
],
];
创建PayPal服务类
bash
$ mkdir -p app/Services && touch app/Services/PayPalService.php
服务类代码示例:
php
<?php
namespace App\Services;
use PayPal\Rest\ApiContext;
use PayPal\Auth\OAuthTokenCredential;
use PayPal\Api\Payment;
use PayPal\Api\PaymentExecution;
class PayPalService
{
protected $config;
protected $apiContext;
public function __construct($config)
{
$this->config = $config;
$this->apiContext = new ApiContext(
new OAuthTokenCredential(
$this->config['client_id'],
$this->config['secret']
)
);
}
public function checkout(Order $order)
{
// 创建支付请求
}
public function executePayment($paymentId)
{
// 执行付款
}
}
创建控制器
bash
$ php artisan make:controller PaymentsController
控制器代码示例:
php
<?php
namespace App\Http\Controllers;
use App\Models\Order;
class PaymentController extends Controller
{
public function payByPayPalCheckout(Order $order)
{
// 处理支付请求
}
}
设置PayPal WebHook
在PayPal开发者中心配置WebHook事件,确保回调地址为https://yoursite.com/payment/paypal/notify
,并勾选Payments payment created
和Payment sale completed
事件。
2. Subscription订阅支付
创建计划并激活
php
public function createPlan(Order $order)
{
// 创建并激活订阅计划
}
创建订阅申请
php
public function createAgreement(Plan $param, Order $order)
{
// 创建订阅申请
}
执行订阅
php
public function executeAgreement($token)
{
// 执行订阅
}
控制器调用
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)
{
// 处理订阅计划创建
}
}
设置PayPal WebHook
在开发者中心配置WebHook事件,勾选Payment sale completed
事件。
至此,PayPal Checkout收银台支付和Subscription订阅支付的完整流程已经完成。通过本文的详细解析和代码示例,你应该能够顺利实现PayPal支付功能。