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

Laravel 8点击支付按钮出现500内部服务器错误求助

Laravel 8 AJAX POST 500错误排查与解决

我在Laravel 8项目的主blade文件中添加了<meta name="csrf-token" content="{{ csrf_token() }}">,并在JS文件中配置了$.ajaxSetup携带CSRF令牌,反复检查代码后,点击支付按钮仍出现POST http://localhost:8000/pay 500 (Internal Server Error),且success回调的alert未触发。

相关代码

checkout.js

$(document).ready(function () {
$('.razorpay_btn').click(function (e){
    e.preventDefault();
    
    $.ajaxSetup({
        headers: {
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
       }
    });
    
    var firstname = $('.firstname').val();
    var lastname = $('.lastname').val();
    var email = $('.email').val();
    var phone = $('.phone').val();
    var address = $('.address').val();
    var city = $('.city').val();
    
    
    
    if(!firstname){
        fname_error = "First Name is required";
        $('#fname_error').html('');
        $('#fname_error').html(fname_error);
    }else{
        fname_error = "";
        $('#fname_error').html('');
    }

    if(!lastname){
        lname_error = "Last Name is required";
        $('#lname_error').html('');
        $('#lname_error').html(lname_error);
    }else{
        lname_error = "";
        $('#lname_error').html('');
    }

    if(!email){
        email_error = "Email is required";
        $('#email_error').html('');
        $('#email_error').html(email_error);
    }else{
        email_error = "";
        $('#email_error').html('');
    }

    if(!phone){
        phone_error = "Phone Number is required";
        $('#phone_error').html('');
        $('#phone_error').html(phone_error);
    }else{
        phone_error = "";
        $('#phone_error').html('');
    }
    
    if(!address){
        address_error = "Address is required";
        $('#address_error').html('');
        $('#address_error').html(address_error);
    }else{
        address_error = "";
        $('#address_error').html('');
    }
    
    if(!city){
        city_error = "First Name is required";
        $('#city_error').html('');
        $('#city_error').html(city_error);
    }else{
        city_error = "";
        $('#city_error').html('');
    }
    
    if(fname_error!='' || lname_error!='' || email_error!='' || phone_error!='' || address_error!='' || city_error!=''){
        return false;
    }else{
        var data= {
            'firstname':firstname,
            'lastname':lastname,
            'email':email,
            'phone':phone,
            'address':address,
            'city':city
        }
        
        $.ajax({
            method: "POST",
            url: "/pay",
            data: data,
            success: function (response) {
                alert(response.total_price);
            },
            
        });
    }
    

});
});

web.php

Route::post('/pay','Frontend\CheckoutController@pay');

checkout.blade.php

<button type="button" class="btn btn-danger pay_btn">Ryzorpay</button>

CheckoutController.php

public function pay(Request $request){
    $cartitem = Cart::where('user_id',Auth::id())->get();
    $total_price = 0;
    foreach($cartitem as $item){
        $total_price += $item->products->selling_price*$item->product_quantity;
       
    }

    $firstname = $request->input('firstname');
    $lastname = $request->input('lastname');
    $email = $request->input('email');
    $phone = $request->input('phone');
    $address = $request->input('address');
    $city = $request->input('city');

    return response()->json([
        'firstname'=>$firstname,
        'lastname'=>$lastname,
        'email'=>$email,
        'phone'=>$phone,
        'address'=>$address,
        'city'=>$city,
        'total_price'=>$total_price
    ]);
}

问题排查与解决方案

  1. 按钮类名不匹配
    JS中监听的是.razorpay_btn,但blade文件里按钮的类是pay_btn,导致点击事件无法正确绑定。

    • 修正方案:将blade中的按钮类改为razorpay_btn,或者把JS中的选择器改成.pay_btn。
  2. 未登录用户Auth::id()返回null
    Controller中直接使用Auth::id(),若用户未登录会导致Cart查询失败,抛出异常。

    • 修正方案:在pay方法开头添加登录判断:
      if (!Auth::check()) {
          return response()->json(['error' => '请先登录'], 401);
      }
      
  3. Cart模型关联错误
    $item->products可能关联名称错误(购物车项通常对应单个商品,关联名应为product而非products),调用selling_price时会触发异常。

    • 修正方案:检查Cart模型的关联定义,若为一对一关联,应改为:
      // Cart模型内
      public function product()
      {
          return $this->belongsTo(Product::class, 'product_id');
      }
      
      同时Controller中修改为:
      $total_price += $item->product->selling_price * $item->product_quantity;
      
  4. JS变量未声明导致全局污染
    JS中的fname_error、lname_error等变量未用var/let/const声明,可能引发意外逻辑错误。

    • 修正方案:为所有错误变量添加声明:
      let fname_error = "";
      let lname_error = "";
      let email_error = "";
      let phone_error = "";
      let address_error = "";
      let city_error = "";
      
  5. 查看Laravel日志定位具体错误
    500错误的详细信息会记录在storage/logs/laravel.log中,直接查看日志能快速定位关联错误、权限问题等根源。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 15:27:49