Laravel自定义Ajax页面集成Stripe支付时return_url错误解决
Laravel自定义页面Ajax集成Stripe支付网关报错解决
错误原因
这个错误的核心逻辑是:你的支付操作(Charge)默认继承了Stripe后台启用的全部自动支付方式,其中部分支付方式(如3DS验证、网银类支付)需要跳转至外部页面完成验证。但当前代码既未指定支付完成后的回调return_url,也未限制禁用需要跳转的支付方式,因此Stripe抛出该提示。
具体到你的代码问题:
- 创建
SetupIntent时使用默认配置,未对自动支付方式的跳转权限做限制 - 调用
charge方法时指定了confirmation_method => 'manual',但未配套添加return_url,也未明确禁止跳转类支付方式
解决方案
方案一:指定回调地址,兼容所有支付方式
适合需要支持Stripe后台全部启用支付方式的场景,需在两个关键步骤补充参数:
- 修改SetupIntent创建代码
$user = Auth::user(); $user->createOrGetStripeCustomer(); // 添加自动支付方式配置与回调地址 $intent = $user->createSetupIntent([ 'automatic_payment_methods' => [ 'enabled' => true, ], 'return_url' => route('checkout.complete') // 替换为你的支付完成回调路由 ]); return view('website.checkout.index', compact('data', 'intent'));
- 修改Charge操作代码
$user = Auth::user(); $user->createOrGetStripeCustomer(); $paymentMethod = $request->input('paymentMethod'); $user->updateDefaultPaymentMethod($paymentMethod); try { $response = $user->charge( $request->input('grand_total') * 100, $paymentMethod, [ 'currency' => 'USD', 'confirmation_method' => 'manual', 'return_url' => route('checkout.complete'), // 同步指定回调路由 'automatic_payment_methods' => [ 'enabled' => true, ] ] ); if ($response->id) { // 存储支付方法到会话等业务逻辑 } } catch (\Exception $exception) { return response()->json($exception->getMessage()); }
需同步创建checkout.complete路由,处理支付跳转后的回调逻辑,验证最终支付状态。
方案二:禁用跳转类支付方式,仅支持无需跳转的支付方式(如信用卡)
适合仅需支持信用卡等无需跳转支付方式的场景,直接限制自动支付方式的跳转权限:
- 修改SetupIntent创建代码
$user = Auth::user(); $user->createOrGetStripeCustomer(); $intent = $user->createSetupIntent([ 'automatic_payment_methods' => [ 'enabled' => true, 'allow_redirects' => 'never' // 禁止所有需要跳转的支付方式 ] ]); return view('website.checkout.index', compact('data', 'intent'));
- 修改Charge操作代码
$user = Auth::user(); $user->createOrGetStripeCustomer(); $paymentMethod = $request->input('paymentMethod'); $user->updateDefaultPaymentMethod($paymentMethod); try { $response = $user->charge( $request->input('grand_total') * 100, $paymentMethod, [ 'currency' => 'USD', 'confirmation_method' => 'manual', 'automatic_payment_methods' => [ 'enabled' => true, 'allow_redirects' => 'never' ] ] ); if ($response->id) { // 存储支付方法到会话等业务逻辑 } } catch (\Exception $exception) { return response()->json($exception->getMessage()); }
内容的提问来源于stack exchange,提问作者Malik Umair
相关产品推荐
相关产品推荐

