PayPal 提供了实现自动订阅的详细流程,分为五个主要步骤。为了确保顺利集成,开发者还需要处理支付结果和订阅管理等额外功能。以下是实现自动续费的核心步骤:
- 创建并激活订阅计划;
- 用户创建订阅并跳转到 PayPal 网站进行同意;
- 用户同意后,跳转回网站并执行订阅;
- 获取用户账单,包括每次扣款结果通知或主动查询支付结果;
- 处理用户取消订阅等通知。
使用 PayPal SDK 集成
要开始使用 PayPal SDK,首先需要通过 Composer 安装:
bash
composer require paypal/rest-api-sdk-php
PayPal 提供了完整的 SDK 示例,可以参考进行集成。
你还可以通过 PayPal Sandbox 进行调试,确保在开发过程中一切顺利。
创建并激活订阅计划
- 订阅计划(Billing Plan)相当于产品,需要为每个商品创建不同价格的计划。对于不同的用户,可以在创建协议时调整;
- 如果使用
TRIAL
类型支付,还必须同时存在REGULAR
类型支付。TRIAL
并不能自动判断是否为新用户,首次优惠需要通过业务代码实现; - 由于创建订阅协议时,协议生效时间需在当前时间24小时之后,因此首次扣款无法立即进行,通常需要设置
MerchantPreferences
的setSetupFee
来指定首次扣款金额; - PayPal SDK 会出现
NotifyUrl
为空的错误,这是 PayPal 服务器的问题,官方尚未修复,可以参考 GitHub 解决方案。
创建订阅
用户可以为同一订阅计划创建多个订阅协议(Billing Agreement),创建完成后会跳转到 PayPal 网站等待用户同意。以下是实现步骤:
- 由于协议的
start_date
最早为当前时间24小时后,实际设置的是第二次扣款时间。如果设置为按月支付,start_date
应设置为一个月后,并通过setSetupFee
设置首次扣款; - 创建订阅后,
Agreement.id
尚未生成。需要从跳转链接中提取token
,以便与用户同意后的回调信息对应。
php
$link = $agreement->getApprovalLink();
parse_str(parse_url($link, PHP_URL_QUERY), $params);
$token = $params['token'];
订阅管理
- 同一用户可以多次订阅同一计划,因此在创建新协议时,可能需要手动取消之前的订阅;
- PayPal 的扣款时间通常会有所延迟,建议提前一天设置扣款时间,确保扣款的连续性;
- 可以在 PayPal 开发者中心 设置
webhook
,监听PAYMENT.SALE.COMPLETED
事件,每次扣款成功时会收到通知,帮助匹配已创建的订阅与付款协议。
每次执行 AgreementDetail
查询时,返回的 next
参数指示下次扣款时间。需要注意的是,实际扣款可能会延迟,建议多次重试查询。