如何通过Cronjob获取PayPal订阅更多数据及优质Webhook文档
解决方案
一、修改代码获取更多订阅数据
原函数仅返回订阅状态,你可以修改它返回包含custom_id、total等字段的关联数组(或对象)。PayPal的v1/billing/subscriptions/{subscription_id}接口返回的响应中包含这些数据,以下是优化后的代码:
function paypal_subscription_get_details($subscriptionid, $accesstoken) { if(empty($subscriptionid) || empty($accesstoken)) { return null; } $headers = [ 'Authorization: Bearer '.$accesstoken, 'Content-Type: application/json' ]; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://api-m.sandbox.paypal.com/v1/billing/subscriptions/" . $subscriptionid); // curl_setopt($ch, CURLOPT_URL, "https://api-m.paypal.com/v1/billing/subscriptions/" . $subscriptionid); // 生产环境切换此URL curl_setopt($ch, CURLOPT_POST, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); $response = curl_exec($ch); if(curl_errno($ch)) { error_log('PayPal API Error: '.curl_error($ch)); // 用日志替代var_dump,适配定时任务场景 curl_close($ch); return null; } curl_close($ch); // 及时释放curl资源 $json = json_decode($response, true); // 转为关联数组,降低对象访问的报错风险 if(!$json || isset($json['error'])) { error_log('PayPal API Response Error: '.json_encode($json)); return null; } // 提取常用字段,可根据实际业务需求扩展 $subscription_details = [ 'status' => $json['status'] ?? null, 'custom_id' => $json['custom_id'] ?? null, // 订阅创建时自定义传入的ID 'plan_id' => $json['plan_id'] ?? null, 'cycle_amount' => $json['plan']['billing_cycles'][0]['pricing_scheme']['fixed_price']['value'] ?? null, // 单周期订阅金额 'currency' => $json['plan']['billing_cycles'][0]['pricing_scheme']['fixed_price']['currency_code'] ?? null, 'latest_invoice_amount' => $json['latest_invoice']['amount']['value'] ?? null, // 最近账单实际付款金额 'subscriber_email' => $json['subscriber']['email_address'] ?? null ]; return $subscription_details; }
代码说明:
- 函数名改为
paypal_subscription_get_details更贴合功能定位 - 新增错误日志记录,方便定时任务的问题排查
- 用关联数组存储返回数据,避免对象属性不存在导致的致命错误
- 字段提取逻辑可根据你的订阅计划结构调整(比如多周期计划需修改
billing_cycles的索引)
二、PayPal Webhook 实用指南
如果你想替代定时查询,实现实时订阅状态同步,重点关注以下内容:
1. 核心订阅相关Webhook事件
只需要监听这些关键事件即可覆盖大部分业务场景:
BILLING.SUBSCRIPTION.CREATED:订阅创建完成BILLING.SUBSCRIPTION.ACTIVATED:订阅正式激活BILLING.SUBSCRIPTION.SUSPENDED:订阅被暂停BILLING.SUBSCRIPTION.CANCELLED:订阅被取消BILLING.SUBSCRIPTION.EXPIRED:订阅过期PAYMENT.SALE.COMPLETED:订阅付款成功
2. 关键配置与调试步骤
- 设置Webhook URL:在PayPal开发者后台的沙箱/生产应用中,添加你的接收URL并勾选上述事件
- 强制验证签名:必须验证PayPal请求的签名,避免伪造请求。官方提供了PHP版的签名验证示例,直接集成即可
- 模拟事件调试:用开发者后台的「Webhook Simulator」发送测试事件,快速验证接收端逻辑
- 处理重复事件:根据事件的
event_id做去重处理,避免重复执行业务逻辑
3. 官方资源重点推荐
- 优先看官方的「Webhook快速入门」:聚焦订阅事件章节,步骤清晰,包含签名验证的可运行代码
- 查阅「订阅Webhook事件参考」:详细列出每个事件的响应结构,方便你解析所需数据
注意事项
- 定时查询适合小规模订阅量,Webhook更适合实时性要求高、订阅量大的场景
- 沙箱环境测试时,可直接用PayPal提供的测试账号模拟订阅状态变化
内容的提问来源于stack exchange,提问作者Miedzegadze
相关产品推荐
相关产品推荐

