PayPal 订阅:付款后如何获取订阅详情?
PayPal Subscriptions: How to get Subscription details after payment?
我正在使用 PayPal 按钮设置定期付款计划,但我希望在用户完成付款后获得订阅详细信息,例如用户电子邮件和姓名。我曾尝试使用下面的代码从 PayPal 获取详细信息,但最终出现此错误,如
后所示
var_dump => "object(stdClass)#1 (5) { ["name"]=> string(16) "VALIDATION_ERROR" ["debug_id"] => string(12) "f1579954da9c" ["message"]=> string(29) "无效请求。查看详细信息。" ["information_link"]=> string(67) "https://developer.paypal.com/docs/api/payments.billing-plans#errors" ["details"]=> array (1) { [0]=> object(stdClass)#2 (2) { ["field"]=> string(22) "模板 id 无效" ["issue"]=> string(18) "不正确的计划编号。”} } }”
代码:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api-m.sandbox.paypal.com/v1/payments/billing-plans/'.$plan_id);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
$headers = array();
$headers[] = 'Content-Type: application/json';
$headers[] = 'Authorization: Bearer '.rawurlencode($token);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$result = curl_exec($ch);
if (curl_errno($ch)) {
echo 'Error:' . curl_error($ch);
}
curl_close($ch);
$response=json_decode($result);
var_dump($response);
编辑:实际上这里的主要问题是使用 deprecated v1/payments/billing-plans
API. Instead use the v1/billing/plans
API 来管理当前的订阅计划——尽管这个问题更多的是关于订阅本身,而不是计划。
根据错误,您指定了一个无效的 plan_id;计划 ID 必须以“P-”开头。由于您的问题陈述是获取用户实际 订阅 的状态(不是计划),因此请勿使用 plan_id 或 API 调用。
订阅 ID 以“I-”开头,并在订阅按钮的 onApprove 数据中返回,如果您使用的是此类 JS 按钮。然后,您可以通过 API 调用使用订阅 ID get the status。
在后端填充订阅 ID 的最可靠方法(因为它不依赖于任何客户端代码)是创建一个 webhook 事件侦听器,以便在 new Subscription events 发生时收到通知REST app/client_id 。最有用的此类事件是 PAYMENT_SALE_COMPLETED
,因为每次订阅付费时都会发生这种情况,可用于将其标记为 1 个月有效(通常 logic/business 需要),但也有 BILLING.SUBSCRIPTION.ACTIVATED
开始的时候。
为了协调,您可以在创建订阅时包含任意 custom_id
(如果使用按钮,则在 createSubscription 内,如果使用按钮,则在 API create 内)。此 custom_id
将在与该订阅相关的所有 webhook 中返回,因此您可以确定它用于哪个 user/profile。
我正在使用 PayPal 按钮设置定期付款计划,但我希望在用户完成付款后获得订阅详细信息,例如用户电子邮件和姓名。我曾尝试使用下面的代码从 PayPal 获取详细信息,但最终出现此错误,如
后所示var_dump => "object(stdClass)#1 (5) { ["name"]=> string(16) "VALIDATION_ERROR" ["debug_id"] => string(12) "f1579954da9c" ["message"]=> string(29) "无效请求。查看详细信息。" ["information_link"]=> string(67) "https://developer.paypal.com/docs/api/payments.billing-plans#errors" ["details"]=> array (1) { [0]=> object(stdClass)#2 (2) { ["field"]=> string(22) "模板 id 无效" ["issue"]=> string(18) "不正确的计划编号。”} } }”
代码: $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://api-m.sandbox.paypal.com/v1/payments/billing-plans/'.$plan_id); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
$headers = array();
$headers[] = 'Content-Type: application/json';
$headers[] = 'Authorization: Bearer '.rawurlencode($token);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$result = curl_exec($ch);
if (curl_errno($ch)) {
echo 'Error:' . curl_error($ch);
}
curl_close($ch);
$response=json_decode($result);
var_dump($response);
编辑:实际上这里的主要问题是使用 deprecated v1/payments/billing-plans
API. Instead use the v1/billing/plans
API 来管理当前的订阅计划——尽管这个问题更多的是关于订阅本身,而不是计划。
根据错误,您指定了一个无效的 plan_id;计划 ID 必须以“P-”开头。由于您的问题陈述是获取用户实际 订阅 的状态(不是计划),因此请勿使用 plan_id 或 API 调用。
订阅 ID 以“I-”开头,并在订阅按钮的 onApprove 数据中返回,如果您使用的是此类 JS 按钮。然后,您可以通过 API 调用使用订阅 ID get the status。
在后端填充订阅 ID 的最可靠方法(因为它不依赖于任何客户端代码)是创建一个 webhook 事件侦听器,以便在 new Subscription events 发生时收到通知REST app/client_id 。最有用的此类事件是 PAYMENT_SALE_COMPLETED
,因为每次订阅付费时都会发生这种情况,可用于将其标记为 1 个月有效(通常 logic/business 需要),但也有 BILLING.SUBSCRIPTION.ACTIVATED
开始的时候。
为了协调,您可以在创建订阅时包含任意 custom_id
(如果使用按钮,则在 createSubscription 内,如果使用按钮,则在 API create 内)。此 custom_id
将在与该订阅相关的所有 webhook 中返回,因此您可以确定它用于哪个 user/profile。