将发送API密钥的CURL命令转PHP CURL时出现403错误如何解决
问题根源
你当前代码的核心错误是CURLOPT_POSTFIELDS配置与请求头声明的格式不匹配:
- 原始CURL命令使用
application/x-www-form-urlencoded格式提交参数,参数结构为key=YOUR_KEY&secret=YOUR_SECRET的键值对字符串 - 你的代码里给
CURLOPT_POSTFIELDS传的是JSON格式字符串,服务端按照表单格式解析时无法读取到正确的key、secret参数,因此返回403未授权错误。
修正后的代码
$curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => "https://api.example.co.uk/authenticate", CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => "", CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_POST => true, // 此处替换原来的CURLOPT_CUSTOMREQUEST配置,POST请求写法更规范 // 用http_build_query生成符合x-www-form-urlencoded格式的参数字符串 CURLOPT_POSTFIELDS => http_build_query([ "key" => "MYKEY", "secret" => "MYSECRET" ]), CURLOPT_HTTPHEADER => array( "content-type: application/x-www-form-urlencoded" ), )); $response = curl_exec($curl); $err = curl_error($curl); curl_close($curl); if ($err) { echo "cURL Error #:" . $err; } else { echo $response; }
补充说明
- 也可以直接手动拼接字符串
"key=MYKEY&secret=MYSECRET"赋值给CURLOPT_POSTFIELDS,效果一致,用http_build_query()可以自动处理参数URL编码,避免手动拼接出现格式错误 - 如需排查请求细节,可在curl配置中添加
CURLOPT_VERBOSE => true,会打印完整的请求交互日志,方便定位参数发送问题
内容的提问来源于stack exchange,提问作者Harry
相关产品推荐
相关产品推荐

