将获取JWT令牌的Ajax POST脚本转换为PHP cURL POST脚本的问题排查
报错原因
- 参数格式与请求头不匹配:你主动设置了
Content-Type: application/json请求头,但向CURLOPT_POSTFIELDS传入PHP数组时,cURL会自动将请求头覆盖为multipart/form-data,且参数不会自动序列化为JSON格式,后端按JSON规则解析无法获取到正确的api_key参数,因此校验失败。 - 可选排查点:确认
$this->getTokenUrl()返回的接口地址是否和原Ajax请求的目标地址一致,避免请求到错误的接口实例。
修复代码
优先选择和原jQuery Ajax行为一致的表单传参方案,兼容性更高:
方案1:适配默认表单传参(与原请求逻辑一致)
原jQuery Ajax默认使用application/x-www-form-urlencoded格式传参,无需设置JSON请求头,代码如下:
$url = $this->getTokenUrl(); $curl = curl_init($url); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); $data = [ "api_key" => "xOMjVpz83rxDKjJUX9qNClB2BwadcRWjm09YSCdasdabdasdasdasdgTR8fuvR7jQHP8ZVpbOOmdXqKEt0AVX" ]; // 处理参数保证请求格式为x-www-form-urlencoded curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data)); // 调试用,生产环境建议移除 curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); $resp = curl_exec($curl); // 捕获cURL请求错误 if(curl_errno($curl)) { $error_msg = curl_error($curl); // 自定义错误处理逻辑 } curl_close($curl); // 解析返回结果获取JWT存入变量 $resArr = json_decode($resp, true); if(isset($resArr['status']) && $resArr['status'] == 'success') { $jwtToken = $resArr['response']; // 可根据接口实际返回字段调整取值逻辑 // 后续API调用携带该token即可 } else { // 自定义接口报错处理逻辑 var_dump($resArr['response']); }
方案2:适配JSON格式传参
如果接口明确要求接收JSON格式参数,需要将参数序列化为JSON字符串后再传递:
$url = $this->getTokenUrl(); $curl = curl_init($url); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // 设置JSON请求头 $headers = [ "Content-Type: application/json", ]; curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); $data = [ "api_key" => "xOMjVpz83rxDKjJUX9qNClB2BwadcRWjm09YSCdasdabdasdasdasdgTR8fuvR7jQHP8ZVpbOOmdXqKEt0AVX" ]; // 将数组序列化为JSON字符串 curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data)); // 调试用,生产环境建议移除 curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); $resp = curl_exec($curl); if(curl_errno($curl)) { $error_msg = curl_error($curl); } curl_close($curl); // 解析返回结果逻辑同方案1 $resArr = json_decode($resp, true);
内容的提问来源于stack exchange,提问作者demo7up
相关产品推荐
相关产品推荐

