如何在PayPal Checkout SDK中启用订阅产品?代码无效果求助
PayPal Checkout SDK添加订阅功能无效果的解决方法
问题描述
尝试在PayPal结账流程中添加订阅功能,使用PayPal Checkout SDK开发,但PayPal端未显示任何与订阅相关的内容,当前实现代码如下:
$environment = new \PayPalCheckoutSdk\Core\SandboxEnvironment(PAYPAL_SANDBOX_CLIENT_ID, PAYPAL_SANDBOX_CLIENT_SECRET); $client = new \PayPalCheckoutSdk\Core\PayPalHttpClient($environment); $request = new \PayPalCheckoutSdk\Orders\OrdersCreateRequest(); $request->prefer('return=representation'); $subscription = ['plan_id' => '23423432', 'start_time' => '2023-09-01T00:00:00Z', 'quantity' => 1]; $request->body = [ "intent" => "CAPTURE", "purchase_units" => [[ "reference_id" => $orderInfo['id'], "amount" => [ "value" => $orderInfo['total'], "currency_code" => "AUD" ], 'subscription' => $subscription, ]], "application_context" => [ "cancel_url" => FRONTEND_APP_URL."order-status/?pstatus=payment-declined&source=paypal", "return_url" => FRONTEND_APP_URL."order-status/?pstatus=payment-processing&source=paypal" ] ];
解决方法
1. 明确API使用边界
你当前使用的OrdersCreateRequest属于一次性付款的Orders API,该API不支持在订单参数中嵌套订阅配置。订阅功能需要使用PayPal专门的Subscriptions API实现,两者不能混合调用。
2. 改用Subscriptions API创建订阅
替换原有的订单创建逻辑,使用订阅专属的请求类实现:
$environment = new \PayPalCheckoutSdk\Core\SandboxEnvironment(PAYPAL_SANDBOX_CLIENT_ID, PAYPAL_SANDBOX_CLIENT_SECRET); $client = new \PayPalCheckoutSdk\Core\PayPalHttpClient($environment); // 使用订阅创建请求,而非订单请求 $request = new \PayPalCheckoutSdk\Subscriptions\SubscriptionsCreateRequest(); $request->prefer('return=representation'); $request->body = [ "plan_id" => "23423432", // 必须是沙箱后台已创建的有效订阅计划ID "start_time" => "2023-09-01T00:00:00Z", "quantity" => "1", "application_context" => [ "cancel_url" => FRONTEND_APP_URL."order-status/?pstatus=payment-declined&source=paypal", "return_url" => FRONTEND_APP_URL."order-status/?pstatus=payment-processing&source=paypal" ] ]; // 执行请求并处理响应 try { $response = $client->execute($request); // 提取订阅授权URL,引导用户跳转至PayPal完成订阅确认 $approvalUrl = $response->result->links[0]->href; header("Location: $approvalUrl"); exit; } catch (\Exception $ex) { // 捕获并处理错误(如计划ID无效、权限不足等) echo $ex->getMessage(); }
3. 验证订阅计划有效性
- 确保
plan_id对应的是PayPal沙箱后台已创建的ACTIVE状态订阅计划,若计划未激活或不存在,订阅创建会失败,PayPal端也不会显示订阅内容。 - 检查订阅计划的币种、周期等配置是否与代码中的参数匹配。
4. 前端流程调整
创建订阅成功后,需将用户重定向到响应返回的approval_url,用户在该页面即可看到完整的订阅信息(包括周期金额、续订规则等),完成授权后会跳转回你配置的return_url。
关键误区提示
- 不要在Orders API的
purchase_units中添加subscription参数,该参数不属于Orders API的规范,PayPal不会识别。 - 订阅流程无需创建订单,直接通过Subscriptions API完成创建与授权即可。
内容的提问来源于stack exchange,提问作者Addy
相关产品推荐
相关产品推荐

