You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 15:07:07