PHP-cURL调用CTM API时Basic Auth授权头设置报错求助
解决PHP-cURL调用CTM API的Basic Auth认证失败问题
你的认证失败是因为Authorization请求头格式错误,正确的Basic Auth格式需要包含Basic 前缀,且不能用{{}}包裹编码后的凭证字符串。下面是两种正确的实现方式:
方式1:手动构造正确的Authorization请求头
先确保你用base64_encode()编码的是API_KEY:API_SECRET格式的字符串,然后按照Authorization: Basic [编码后的字符串]的格式构造请求头:
$apiKey = 'a20374d463f8a02b68fdc3bed8eb8bb4bb5a0c6'; $apiSecret = '16ebe4fe438b2bdf2e80599baec8f7a6bbc4'; // 编码 API_KEY:API_SECRET 格式的字符串 $encodedCredentials = base64_encode("$apiKey:$apiSecret"); $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => 'https://api.calltrackingmetrics.com/api/v1/accounts', CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => array( // 正确的Authorization头格式:Basic + 编码后的凭证 "Authorization: Basic $encodedCredentials", 'Content-Type: application/json' ), )); $response = curl_exec($curl); curl_close($curl); echo $response;
方式2:使用cURL自带的CURLOPT_USERPWD选项(推荐)
cURL提供了专门的参数CURLOPT_USERPWD来处理Basic Auth,不需要手动构造请求头,cURL会自动完成编码和头设置,更不易出错:
$apiKey = 'a20374d463f8a02b68fdc3bed8eb8bb4bb5a0c6'; $apiSecret = '16ebe4fe438b2bdf2e80599baec8f7a6bbc4'; $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => 'https://api.calltrackingmetrics.com/api/v1/accounts', CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'GET', // 直接传入 API_KEY:API_SECRET,cURL自动处理Basic Auth CURLOPT_USERPWD => "$apiKey:$apiSecret", CURLOPT_HTTPHEADER => array( 'Content-Type: application/json' ), )); $response = curl_exec($curl); curl_close($curl); echo $response;
错误原因复盘
你之前的代码存在两个问题:
- 缺少
Basic前缀:Authorization头必须以Basic开头,API才能识别这是Basic Auth认证方式 - 多余的
{{}}包裹:API需要的是纯编码字符串,{{}}是文档中的占位符标记,实际代码中不需要保留
内容的提问来源于stack exchange,提问作者God Uncle
相关产品推荐
相关产品推荐

