已配置对应路由,Laravel仍返回404:Stripe嵌入支付加载失败
问题描述
尝试加载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

