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

为什么CURLOPT_POSTFIELDS设置的数据未传递到服务端,接口返回null?

问题原因与解决方法

1. 核心原因:Laravel CSRF 校验拦截

Laravel 默认对所有 POST、PUT、DELETE 等修改类请求开启 CSRF 令牌校验,你发起 CURL POST 请求时没有携带 CSRF 令牌,请求会直接被中间件拦截,返回 419 页面过期的 HTML 内容,而你用 json_decode() 解析 HTML 内容自然得到 null。
你去掉 curl_setopt($cURLConnection, CURLOPT_POSTFIELDS , $data); 后请求能正常返回,是因为无 POST 数据时部分 CURL 版本会自动将 POST 请求降级为 GET 请求,而你的路由配置是 Route::any 支持 GET 请求,GET 请求默认不需要校验 CSRF,所以能拿到正常的返回值。

2. 修复步骤

  • 步骤1:将接口加入 CSRF 排除名单

打开 app/Http/Middleware/VerifyCsrfToken.php 文件,在 $except 属性中添加你的接口路径:

protected $except = [
    '/store/cstore/receipt',
    // 其他需要排除CSRF校验的接口
];
  • 步骤2:修正返回值解析逻辑

你当前控制器返回的是纯字符串 Success,不是 JSON 格式,不需要调用 json_decode() 解析,直接输出 $apiResponse 即可拿到返回内容。如果需要返回 JSON 格式,修改控制器代码:

public function StoreCstoreReceipt(Request $request){
    Log::debug($request->all());
    // 返回JSON格式响应
    return response()->json(['status' => 'success', 'message' => 'Success']);
}
  • 可选优化:CURL 参数调整

如果需要传递 JSON 格式的数据,可将 POST 数据转为 JSON 字符串,并指定请求头:

// 传JSON格式数据时使用
curl_setopt($cURLConnection, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($cURLConnection, CURLOPT_HTTPHEADER, [
    'Content-Type: application/json',
    'Accept: application/json'
]);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 20:45:04