废话不多说,我们先从请求的生命周期来分析,逐步实现整个过程。
一. 生命周期
1. Checkout – 收银台支付
拆解流程如图所示(过程类似支付宝的收银台):
流程详解:
- 本地应用组装好参数并请求 Checkout 接口,接口同步返回一个支付 URL;
- 本地应用重定向至这个 URL,登录 PayPal 账户并确认支付,用户支付后跳转至设置好的本地应用地址;
- 本地请求 PayPal 执行付款接口发起扣款;
- PayPal 发送异步通知至本地应用,本地拿到数据包后进行验签操作;
- 验签成功则进行支付完成后的业务(修改本地订单状态、增加销量、发送邮件等)。
2. Subscription – 订阅支付
拆解流程:
流程详解:
- 创建一个计划;
- 激活该计划;
- 用已经激活的计划去创建一个订阅申请;
- 本地跳转至订阅申请链接获取用户授权并完成第一期付款,用户支付后携带 token 跳转至设置好的本地应用地址;
- 回跳后请求执行订阅;
- 收到订阅授权异步回调结果,收到支付结果的异步回调,验证支付异步回调成功则进行支付完成后的业务。
二. 具体实现
了解了以上流程,接下来开始 Coding。
GitHub 上有很多 SDK,这里使用的是官方的 SDK。
Checkout
在项目中安装扩展
bash
$ composer require paypal/rest-api-sdk-php:* // 这里使用的最新版本
创建 PayPal 配置文件
bash
$ touch config/paypal.php
配置内容如下(沙箱和生产两套配置):
php
<?php
return [
/
|————————————————————————–
| PayPal sandbox config
|————————————————————————–
|
|
/
'sandbox' => [
'client_id' => env('PAYPAL_SANDBOX_CLIENT_ID', ''),
'secret' => env('PAYPAL_SANDBOX_SECRET', ''),
'notify_web_hook_id' => env('PAYPAL_SANDBOX_NOTIFY_WEB_HOOK_ID', ''), // 全局回调的钩子id(可不填)
'checkout_notify_web_hook_id' => env('PAYPAL_SANDBOX_CHECKOUT_NOTIFY