php 对接腾讯直播api的一些坑
本文使用查询流状态为例
授权时出现 The provided credentials could not be validated. Please check your signature is correct.
在获取Authorization 时我们一般使用 json_encode() 将数组转为json
但是在 DescribeLiveStreamState 中没有参数就导致 json_encode([]) = string(2) "[]", 导致签名失败
这个坑我找了好久
下面是小编的demo 如有需要拷贝过去修改 action ,payload 既可
$secretKey = '';
$secretId = '';
$url = 'https://live.tencentcloudapi.com/';
$endpoint = 'live.tencentcloudapi.com';
$contentType = 'application/json';
$action = 'DescribeLiveStreamState';
$requestClient = 'SDK_PHP_3.0.627';
$timestamp = time();
$version = '2018-08-01';
$payload = [];
$payload = $payload ? json_encode($payload) : '{}';
$payloadHash = hash("SHA256", $payload);
$canonicalHeaders = "content-type:".$contentType."\n".
"host:".$endpoint."\n";
$reqmethod = 'POST';
$canonicalUri = '/';
$canonicalQueryString = '';
$signedHeaders = "content-type;host";
$canonicalRequest = $reqmethod."\n".
$canonicalUri."\n".
$canonicalQueryString."\n".
$canonicalHeaders."\n".
$signedHeaders."\n".
$payloadHash;
$algo = "TC3-HMAC-SHA256";
$date = gmdate("Y-m-d", $timestamp);
$service = explode(".", $endpoint)[0];
$credentialScope = $date."/".$service."/tc3_request";
$hashedCanonicalRequest = hash("SHA256", $canonicalRequest);
$str2sign = $algo."\n".
$timestamp."\n".
$credentialScope."\n".
$hashedCanonicalRequest;
$dateKey = hash_hmac("SHA256", $date, "TC3".$secretKey, true);
$serviceKey = hash_hmac("SHA256", $service, $dateKey, true);
$reqKey = hash_hmac("SHA256", "tc3_request", $serviceKey, true);
$signature = hash_hmac("SHA256", $str2sign, $reqKey);
$auth = $algo.
" Credential=".$secretId."/".$credentialScope.
", SignedHeaders=content-type;host, Signature=".$signature;
$header = [
'Host: '.$endpoint,
'X-TC-Action: '.$action,
'X-TC-RequestClient: '.$requestClient,
'X-TC-Timestamp: '.$timestamp,
'X-TC-Version: '.$version,
'Content-Type: '.$contentType,
'Authorization: '.$auth
];
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_TIMEOUT, 30);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl,CURLOPT_HTTPHEADER,$header);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $payload);
$output = curl_exec($curl);
curl_close($curl);
$res = json_decode($output,true);
print_r($res);

浙公网安备 33010602011771号