Laravel Stripe Cashier v13 $request->payment_method返回空问题求助
Stripe Cashier v13
payment_method为空问题排查方案 - 首先排查前端参数提交是否正确:手动传入测试卡ID
pm_card_visa可正常运行,说明后端Stripe配置、基础权限逻辑没有问题,优先检查前端在「使用默认支付方式」的场景下,是否没有传递payment_method字段,或者参数名拼写和后端接收的payment_method不匹配。 - 修复现有代码的逻辑缺陷:当前代码未兼容「使用已有默认支付方式」的场景,当用户选择使用已保存的默认支付方式时,前端本身不会传递新的
payment_method参数,你需要新增空值判断逻辑,读取用户已有的默认支付方法ID,参考修改如下:
public function create(Request $request, Plan $plan) { $plan = Plan::findOrFail($request->get('plan')); $user = $request->user(); $user->createOrGetStripeCustomer(); $payment_method = $request->payment_method; // 新增:未传支付方法时,优先读取用户默认支付方法 if (empty($payment_method)) { // 无支付方法时返回错误提示 if (!$user->hasPaymentMethod()) { return back()->withErrors('请先添加或选择支付方式'); } $payment_method = $user->defaultPaymentMethod()->id; } if(!$user->hasPaymentMethod()){ $user->addPaymentMethod($payment_method); $user->updateDefaultPaymentMethod($payment_method); } else { foreach ($user->paymentMethods() as $payment){ if($payment->asStripePaymentMethod()->id == $payment_method){ $user->updateDefaultPaymentMethod($payment_method); } } } $user->newSubscription('default', $plan->stripe_plan) ->create($payment_method, [ 'email' => $user->email, ]); return redirect()->route('home')->with('success', 'Your plan subscribed successfully'); }
- 检查请求参数是否被过滤:部分自定义中间件、全局参数过滤逻辑可能会移除
payment_method字段,你可以在方法入口打印$request->all(),确认请求中是否真的携带了对应字段。 - 检查Stripe支付组件配置:如果使用Stripe官方Elements组件实现支付功能,确认组件初始化时是否正确配置回调,是否将生成的支付方法ID正确绑定到提交参数中。
内容的提问来源于stack exchange,提问作者Gerulisss
相关产品推荐
相关产品推荐

