Laravel Cashier订阅结账异常:返回空白页未跳转至Stripe页面
Laravel Cashier订阅结账未跳转至Stripe页面,返回JSON空白页问题解决
问题场景
- 刚完成Laravel 5.8 → 6.x、Cashier 10.2 → 12.17.2的升级,使用Cashier 12.7新增的订阅结账功能
- Blade页面仅包含表单和提交按钮,提交至
subscription.create路由 - 路由返回包含Stripe支付页面URL的JSON对象,但页面不自动跳转,显示空白页
核心原因
Cashier 12.x版本调整了checkout()方法的响应逻辑:
- POST请求:返回重定向响应,自动跳转至Stripe结账页(适配传统表单提交场景)
- GET请求:返回JSON响应(适配AJAX/SPA场景)
你的路由是GET类型,所以默认返回JSON而非跳转,导致页面显示空白。
解决方案
方案1:改为POST路由(推荐,符合传统表单提交逻辑)
修改路由为POST类型,Cashier会自动返回重定向响应:
Route::post('/subscription-checkout', function (Request $request) { return $request->user() ->newSubscription('default', 'plan') ->allowPromotionCodes() ->checkout([ 'success_url' => route('thankyou'), 'cancel_url' => route('home'), ]); })->name('subscription.create');
同时更新Blade表单,添加POST方法和CSRF令牌:
<form method="POST" action="{{ route('subscription.create') }}"> @csrf <button type="submit">开始订阅</button> </form>
方案2:保留GET路由,手动处理跳转
如果需要保留GET路由,可在后端手动提取URL并重定向:
Route::get('/subscription-checkout', function (Request $request) { $checkoutData = $request->user() ->newSubscription('default', 'plan') ->allowPromotionCodes() ->checkout([ 'success_url' => route('thankyou'), 'cancel_url' => route('home'), ]); // 手动跳转至Stripe结账页 return redirect($checkoutData['url']); })->name('subscription.create');
或者通过前端JS处理(若使用AJAX提交):
document.querySelector('form').addEventListener('submit', async function(e) { e.preventDefault(); const res = await fetch(this.action); const data = await res.json(); window.location.href = data.url; });
内容的提问来源于stack exchange,提问作者Rick Calder
相关产品推荐
相关产品推荐

