如何通过PHP实现Stripe Connected关联订阅账号创建并解决脚本运行失败问题
问题定位步骤
- 首先补充输出异常的完整错误详情:现有代码仅获取了异常的
getMessage()返回值,可追加输出$e->getJsonBody()拿到Stripe返回的错误码、错误原因等完整信息,快速定位是参数错误、权限问题还是账号能力受限 - 检查变量初始化状态:脚本中
$email、$token、$planPrice、$currency、$planInterval、$STRIPE_API_KEY必须提前赋值,任意变量未定义都会直接导致脚本中断执行 - 核对Stripe PHP SDK版本:你用到的
Plan接口是旧版接口,若SDK版本高于v2020-08-27,官方已推荐用Price接口替代Plan,版本不兼容会导致创建套餐失败 - 验证API密钥权限:你使用的密钥必须是平台主账号的完整权限密钥,不能是受限密钥,否则无法创建Custom类型关联账号、触发跨账号操作
现有代码已知问题
- 语法错误:第一层创建关联账号的
try块未补全catch逻辑和闭合大括号,脚本直接会报语法错误无法运行 - 参数错误:创建订阅的
items参数格式错误,缺少一层数组嵌套,Stripe接口会直接拒绝请求 - 逻辑缺陷:Custom类型关联账号必须完成服务条款确认、身份验证、收款账户绑定才能发起交易,刚创建的空账号直接创建订阅会被接口拦截
- 关联逻辑缺失:未添加平台分账参数的订阅不会和主账号产生关联,不会展示在主账号的关联交易列表中
修复后可运行代码
// 引入Stripe PHP库 require_once 'stripe-php/init.php'; // 提前初始化所有必填变量 $STRIPE_API_KEY = '替换为你的平台主账号API密钥'; $email = '用户邮箱'; $token = '前端生成的支付方式token'; $planName = '订阅套餐名称'; $planPrice = 9.9; // 单位为美元 $currency = 'usd'; $planInterval = 'month'; // 订阅周期支持day/week/month/year $api_error = ''; // 设置全局API密钥 \Stripe\Stripe::setApiKey($STRIPE_API_KEY); try { // 创建Custom类型关联账号 $connectedAccount = \Stripe\Account::create([ "email" => $email, "country" => "US", "type" => "custom", 'capabilities' => [ 'card_payments' => ['requested' => true], 'transfers' => ['requested' => true], ], // 提交服务条款接受记录,激活账号基础能力 "tos_acceptance" => [ "date" => time(), "ip" => $_SERVER['REMOTE_ADDR'] ] ]); // 在关联账号下创建客户对象 try { $customer = \Stripe\Customer::create([ "email" => $email, "source" => $token ], ["stripe_account" => $connectedAccount->id]); } catch(Exception $e) { $api_error = "创建客户失败: " . $e->getMessage(); // 排查时可打开下方注释打印完整错误信息 // var_dump($e->getJsonBody()); } if(empty($api_error) && $customer){ // 金额转换为美分单位 $priceCents = round($planPrice*100); // 创建订阅套餐(新版SDK建议替换为Price接口创建) try { $plan = \Stripe\Plan::create([ "product" => [ "name" => $planName ], "amount" => $priceCents, "currency" => $currency, "interval" => $planInterval, "interval_count" => 1 ], ["stripe_account" => $connectedAccount->id]); } catch(Exception $e) { $api_error = "创建套餐失败: " . $e->getMessage(); } if(empty($api_error) && $plan){ // 创建关联订阅 try { $subscription = \Stripe\Subscription::create([ "customer" => $customer->id, // 修复items参数格式 "items" => [ ["plan" => $plan->id] ], // 添加平台分账比例,订阅会自动关联到主账号仪表盘 "application_fee_percent" => 10 ], ["stripe_account" => $connectedAccount->id]); echo "关联订阅创建成功,订阅ID:" . $subscription->id; } catch(Exception $e) { $api_error = "创建订阅失败: " . $e->getMessage(); } } } if (!empty($api_error)) { echo $api_error; } // 补全关联账号创建的异常捕获逻辑 } catch (Exception $e) { echo "创建关联账号失败: " . $e->getMessage(); }
内容的提问来源于stack exchange,提问作者Justin Crawfish
相关产品推荐
相关产品推荐

