Laravel控制器能否用AJAX GET请求获取的数据直接更新数据库无需额外请求
问题根因及修复方案
你遇到的核心问题是变量名拼写不一致,其次还有多处不规范写法、缺少必要校验的问题,修复步骤如下:
1. 直接修复错误代码
你控制器中定义的待更新数组是$u_input,但给donation_sum赋值时误用了$up_input,导致最终传入update方法的数组始终为空,这就是你说的两行赋值代码"未生效"的原因。修正后的控制器代码如下:
public function verify_pay($reference) { // 密钥建议后续放到.env文件中,不要硬编码在业务代码里 $sec = env('PAYSTACK_SECRET_KEY', 'sk_test_1ee78b7e4524cf19d3450e198812d1b8f0ee6562'); $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => "https://api.paystack.co/transaction/verify/$reference", CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => "", CURLOPT_MAXREDIRS => 10, CURLOPT_SSL_VERIFYHOST => 0, CURLOPT_SSL_VERIFYPEER => 0, CURLOPT_TIMEOUT => 30, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => "GET", CURLOPT_HTTPHEADER => array( "Authorization: Bearer $sec", "Cache-Control: no-cache", ), )); $response = curl_exec($curl); $err = curl_error($curl); curl_close($curl); // 先判断curl请求是否出错 if ($err) { return "something went wrong: " . $err; } $newData = json_decode($response); $u_input = []; // 去掉冗余的[$newData][0]写法,同时校验交易实际状态为success if ($newData->status == true && $newData->data->status == 'success') { $amount = $newData->data->amount; // 统一用同一个变量名 $u_input["donation_sum"] = $amount / 100; // 先判断用户是否登录,避免调用update时报错 if (Auth::check()) { Auth::user()->update($u_input); return "paid"; } return "user not login"; }else { return "something went wrong"; } }
2. 补充必要配置
确保你项目中app/Models/User.php里的$fillable属性已经添加了donation_sum字段,否则Laravel的批量赋值机制会自动忽略这个字段的更新:
protected $fillable = [ // 其他原有允许批量赋值的字段,比如name、email等 'donation_sum', ];
3. 可选优化
建议给verify-payment路由添加auth中间件,避免未登录用户可以随意访问该接口:
Route::get('verify-payment/{reference}', 'UsersController@verify_pay') ->name('verify-payment') ->middleware('auth');
内容的提问来源于stack exchange,提问作者WonderPlug
相关产品推荐
相关产品推荐

