You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 12:07:48