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

已配置对应路由,Laravel仍返回404:Stripe嵌入支付加载失败

Stripe嵌入支付iframe加载404问题排查

问题描述

尝试加载Stripe嵌入支付iframe时触发404错误,已在web.php中添加POST路由:

Route::post('admin/checkout/checkoutStripeCredit', ['as' => 'admin.checkout.checkoutStripeCredit', 'uses' => 'CheckoutController@loadStripeCreditForm']);

对应CheckoutController方法代码:

public function loadStripeCreditForm(Request $request) {
    if(!Session::has('credit_details')) {
        return redirect()
                ->route('admin.checkout.show')
                ->with('flash_error', 'Your session has expired, please try again.');
    }

    try {
        $credit_details = Session::get('credit_details');
        header('Content-Type: application/json');

        $stripe = new \Stripe\StripeClient(env('STRIPE_SECRETKEY'));

        $product = $stripe->products->create([
            'name' => 'Editor World Credit'
        ]);

        $price = $stripe->prices->create([
            'product' => $product->id,
            'unit_amount' => $credit_details['credit_amount'] * 100,
            'currency' => 'usd'
        ]);

        $callback_url = route('admin.checkout.successStripeCredit');

        $checkout_session = $stripe->checkout->sessions->create([
            'mode' => 'payment',
            'ui_mode' => 'embed',
            'line_items' => [
                [
                    'price' => $price->id,
                    'quantity' => 1
                ]
            ],
            'metadata' => [
                'user_id' => json_encode(Auth::user()->id)
            ],
            'success_url' => $callback_url . '?session_id={CHECKOUT_SESSION_ID}',
            'cancel_url' => route('admin.checkout.cancel'),
            'invoice_creation' => ['enabled' => true]
        ]);

        session(['checkout_session_id' => $checkout_session->id]);
        echo json_encode(array('clientSecret' => $checkout_session->client_secret));
    }
    catch (Exception $x) {
        EWLogHelper::create('STRIPE_SUBMIT_ERROR', ['msg' => $x->getMessage(), 'trace' => $x->getTrace()]);
        return redirect()->back()->with('flash_error', $x->getMessage());
    }
}

向/admin/checkout/checkoutStripeCredit发送POST请求时返回404,以下是可能的错误点及解决方法:

  • CSRF令牌验证拦截:Laravel的web路由默认启用CSRF保护,POST请求必须携带CSRF令牌。检查前端请求是否在表单中添加了@csrf指令,或者AJAX请求是否携带了X-CSRF-TOKEN请求头。如果遗漏,Laravel会拦截请求,表现为404错误。

  • 路由前缀重复:如果你的admin路由是包裹在Route::prefix('admin')分组内,当前路由的路径会变成/admin/admin/checkout/checkoutStripeCredit,导致实际请求路径不匹配。此时需要修改路由定义,去掉重复的admin前缀:

    Route::post('checkout/checkoutStripeCredit', ['as' => 'admin.checkout.checkoutStripeCredit', 'uses' => 'CheckoutController@loadStripeCreditForm']);
    
  • 路由缓存未更新:如果之前执行过php artisan route:cache生成路由缓存,修改路由后必须重新执行php artisan route:cache或php artisan route:clear清除缓存,否则新路由不会生效。

  • 控制器命名空间错误:如果CheckoutController位于App\Http\Controllers\Admin命名空间下,路由中的uses参数需要指定完整命名空间:

    Route::post('admin/checkout/checkoutStripeCredit', ['as' => 'admin.checkout.checkoutStripeCredit', 'uses' => 'Admin\CheckoutController@loadStripeCreditForm']);
    
  • 请求路径拼写错误:检查前端请求的URL是否与路由定义完全一致,注意大小写、斜杠位置等细节。可以通过php artisan route:list命令查看所有已注册路由,确认目标路由的实际路径。

内容的提问来源于stack exchange,提问作者adam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 09:57:02