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

如何仅通过PayPal返回页面的token获取subscription_id(无需启用PDT)

问题

我使用旧版PayPal订阅支付方式,客户完成支付后会跳转至表单return参数指定的感谢页,默认情况下PayPal仅向该页面传递GET参数token(例如thank-you.php?token=XXXXXXXXXXXXXXXXX)。我需要在该感谢页获取subscription_id。

已知一种实现方式是启用PayPal自动返回和PDT功能,步骤如下:

  • 在PayPal商家后台网站偏好设置中启用自动返回
  • 硬编码默认返回URL
  • 开启自动返回下方的Payment Data Transfer(PDT)功能
  • 获取PDT身份令牌
  • 在感谢页使用令牌与URL中的tx参数向PayPal请求包含subscription_id的交易详情

但我拥有多个网站,不想在PayPal中设置固定返回URL这类全局配置。请问是否存在方法,仅借助感谢页拿到的默认token参数,通过API获取交易详情(仅需subscription_id),无需执行上述整套PDT配置?

我已有API密钥,但现有API功能多为通过subscription_id查询详情、取消订阅等;后台也在使用IPN,但此次需求偏向客户端场景。

当前支付表单代码:

<form action="https://www.paypal.com/cgi-bin/webscr" method="post" enctype="multipart/form-data" target="_top">
<input type="hidden" name="cmd" value="_xclick-subscriptions">
<input type="hidden" name="business" value="my-paypal-id">
<input type="hidden" name="lc" value="GB">
<input type="hidden" name="item_name" value="Some service purchase">
<input type="hidden" name="rm" value="2">
<input type="hidden" name="return" value="https://www.example.com/thanks">
<input type="hidden" name="cancel_return" value="https://www.example.com/">
<input type="hidden" name="src" value="1">
<input type="hidden" name="a3" value="9.00">
<input type="hidden" name="p3" value="1">
<input type="hidden" name="t3" value="M">
<input type="hidden" name="currency_code" value="USD">
<input type="hidden" name="bn" value="PP-SubscriptionsBF:btn_buynowCC_LG.gif:NonHosted">
<input type="submit" value="Subscribe">
</form>

可行方案:使用PayPal NVP API通过token获取订阅ID

你可以利用PayPal的NVP(键值对)API,仅通过感谢页的token参数查询订阅详情,无需配置PDT或固定全局返回URL,步骤如下:

1. 准备API凭证

使用你已有的PayPal API密钥,需要以下三项:

  • API用户名
  • API密码
  • API签名

这些凭证可在PayPal商家后台的API访问页面获取。

2. 在感谢页后端发起API请求

该请求必须在服务器端执行(不能在前端直接调用,避免泄露API凭证),以PHP为例:

<?php
// 从URL获取token参数
$token = $_GET['token'] ?? '';
if (empty($token)) {
    die('无效token');
}

// 填入你的PayPal API凭证
$api_username = '你的API用户名';
$api_password = '你的API密码';
$api_signature = '你的API签名';

// 选择对应环境的NVP API端点:生产环境或沙箱环境
$api_endpoint = '替换为对应环境的NVP API端点';

// 构建API请求参数
$params = [
    'METHOD' => 'GetExpressCheckoutDetails',
    'VERSION' => '124.0',
    'USER' => $api_username,
    'PWD' => $api_password,
    'SIGNATURE' => $api_signature,
    'TOKEN' => $token
];

// 发起POST请求
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $api_endpoint);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);

$response = curl_exec($ch);
curl_close($ch);

// 解析API响应
parse_str($response, $result);

// 提取subscription_id
$subscription_id = $result['SUBSCRIPTIONID'] ?? '';
if (!empty($subscription_id)) {
    echo "订阅ID:$subscription_id";
    // 此处可添加后续业务逻辑,如存储至数据库
} else {
    echo '无法获取订阅ID';
}
?>

3. 关键说明

  • 该方案无需修改PayPal后台的任何全局配置,完全依赖自有API凭证和后端请求
  • NVP API与你当前使用的旧版订阅表单完全兼容
  • 注意区分生产环境和沙箱环境的API端点,测试时使用沙箱地址

长期优化方案:切换至PayPal智能支付按钮

若后续有重构计划,建议升级为PayPal新版智能支付按钮(基于REST API),可在前端完成支付后直接获取订阅ID,无需依赖跳转后的token参数,灵活性更高。


内容的提问来源于stack exchange,提问作者adrianTNT

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 06:59:51