Stripe PHP订阅报错:客户无关联支付源问题求助
问题分析与解决方案
看起来你遇到的核心问题是后端没有正确获取到Stripe Checkout返回的支付Token,导致创建Customer时没有关联支付源,进而触发订阅失败的错误。让我帮你一步步排查和解决:
1. 修复Laravel Request的语法错误
你的后端代码里使用了$request->input['stripeEmail']和$request->input['stripeToken'],这是错误的写法。在Laravel中,input是Request类的方法,而非数组属性,正确的调用方式是$request->input('字段名')。
这个错误会直接导致你无法获取到Stripe Checkout提交的stripeToken,创建Customer时source参数为空,自然不会关联任何银行卡信息。
2. 添加错误捕获便于调试
建议在代码中添加Stripe API的异常捕获逻辑,这样能看到更详细的错误细节,帮助你快速定位问题。
修改后的后端代码示例
\Stripe\Stripe::setApiKey(env('STRIPE_SECRET')); try { // 正确获取表单提交的Stripe字段 $customer = \Stripe\Customer::create([ 'email' => $request->input('stripeEmail'), 'source' => $request->input('stripeToken') ]); $planID = null; if($request->input('plan') == 'individual') { $planID = env('STRIPE_INDIVIDUAL_PLAN_ID'); } else if($request->input('plan') == 'business') { $planID = env('STRIPE_BUSINESS_PLAN_ID'); } if (!$planID) { throw new \Exception('Invalid plan selected'); } $subscription = \Stripe\Subscription::create([ 'customer' => $customer->id, 'items' => [['plan' => $planID]] ]); // 这里可以添加订阅成功后的逻辑,比如关联到你的用户模型等 } catch (\Stripe\Exception\ApiErrorException $e) { // 打印Stripe返回的详细错误信息 dd('Stripe API Error: ' . $e->getMessage(), $e->getJsonBody()); } catch (\Exception $e) { dd('General Error: ' . $e->getMessage()); }
3. 额外排查步骤
- 确认前端提交的字段:在后端代码开头添加
dd($request->all());,查看返回结果中是否包含stripeToken和stripeEmail两个字段。如果没有,检查前端表单是否被正确提交,或者nodisplay类是否阻止了表单的正常行为。 - 验证Stripe密钥:确保后端的
STRIPE_SECRET是测试模式的密钥(以sk_test_开头),前端的data-key是对应的测试公钥(以pk_test_开头)。 - 检查测试卡有效性:测试时使用Stripe官方提供的测试卡号(比如
4242 4242 4242 4242,任意过期日期和CVC),避免使用真实卡导致的错误。 - 确认套餐ID正确:检查
STRIPE_INDIVIDUAL_PLAN_ID和STRIPE_BUSINESS_PLAN_ID是否与Stripe控制台中创建的套餐ID完全一致。
内容的提问来源于stack exchange,提问作者Alex Kerr
相关产品推荐
相关产品推荐

