一、GET请求
function mediaInfo(){
$vodId = $_GET['vodId']; //腾讯云视频ID
$secretKey = '你的腾讯云的SecretKey';
//拼签名用; 拼接方式:请求地址大写+请求的地址+?
$srcStr = 'GETvod.tencentcloudapi.com/?';
//请求接口的公共参数+必填参数数组
$param = array(
"Action"=> 'DescribeMediaInfos',//默认
"Nonce"=> rand(1000,9999), //随机一个1000-9999之间的数字
"SecretId"=>'你的腾讯云的SecretId',
'Region'=>'ap-beijing',//区域列表中选
"Timestamp"=> time(), //秒级时间戳
'FileIds.0'=>$vodId, //腾讯云视频地址
'Filters.0'=>'basicInfo',//获取基础信息
"Token"=>'',//为空 //固定
"Version"=>'2018-07-17'//默认
);
将数组的键名按字母正序排序
ksort($param); //参数排序
$srcStr .= urldecode(http_build_query($param)); //将数组变成Action=DescribeMediaInfos&Nonce=123456的字符串格式,然后将得到的字符串通过urldecode编码拼上前面的GETvod.tencentcloudapi.com/?
//排序后连接字符串 生成签名 官网有验证签名的地方 签名不对的话 可以把时间戳和随机数写死之后校验
$sign = urlencode(base64_encode(hash_hmac('sha1', $srcStr, $secretKey, true))); //使用哈希的sha1方式加密,然后通过base64转码,然后urlencode转回来,是为了不将“=”转变
$url ='https://vod.tencentcloudapi.com/?Action=DescribeMediaInfos&Nonce='.$param['Nonce'].'&Region=ap-beijing&SecretId='.$param['SecretId'].'&Signature='.$sign.'&Timestamp='.$param['Timestamp'].'&Token=&Version='.$param['Version'].'&FileIds.0='.$param['FileIds.0'].'&Filters.0='.$param['Filters.0']; //通过http方式访问接口地址,将所有数组中的参数都拼上
$res = $this->CurlRequest($url,'get'); //通过get请求获取到结果,获取到的结果是一个json字符串,然后需要json_encode转回来
//到这基本上就完事了。 后面就可以直接打印看结果了。 如果需要加密的话, 就将地址加上昨天说的那个加密。
// echo json_encode($res);exit;
}
二、POST请求
function idCardCheck(){
$base64img = 'base64的图片'; //不加data://的前缀
$secretKey = '你的secretKey';
$srcStr = 'POSTfaceid.tencentcloudapi.com/?';
$param = array(
"Action"=> 'IdCardOCRVerification',//默认
"Nonce"=> rand(1000,9999),
"SecretId"=>'你的SecretId',
'Language'=>'zh-CN',
'Region'=>'ap-beijing',//区域列表中选
"Timestamp"=> time(),
'ImageBase64'=>$base64img,
"Version"=>'2018-03-01'//默认
);
ksort($param); //参数排序
$strParam = http_build_query($param);
$srcStr .= urldecode($strParam);
//排序后连接字符串 生成签名 官网有验证签名的地方 签名不对的话 可以把时间戳和随机数写死之后校验
$sign = urlencode(base64_encode(hash_hmac('sha1', $srcStr, $secretKey, true)));
$strParam .= '&Signature='.$sign;
$url ='https://faceid.tencentcloudapi.com';
$res = $this->CurlRequest($url,'post',$strParam);
}
三、POST_V3请求
//v3格式签名 //有照片就要用这个
private function idCardCheckV3(){
$base64img = 'base64的图片'; //不带data://
$secretId = $this->getSecretId();
$secretKey = $this->getSecretKey();
$host = "faceid.tencentcloudapi.com";
$service = "faceid";
$version = "2018-03-01";
$action = "IdCardOCRVerification";
$region = "ap-beijing";
$timestamp = time();
$algorithm = "TC3-HMAC-SHA256";
$param = array('ImageBase64'=>$base64img); //需要发送的action独有参数
// step 1: build canonical request string
$httpRequestMethod = "POST";
$canonicalUri = "/";
$canonicalQueryString = "";
$canonicalHeaders = "content-type:application/json\n"."host:".$host."\n";
$signedHeaders = "content-type;host";
$payload = json_encode($param); //php5.6以上才要加第二个参数
$hashedRequestPayload = hash("SHA256", $payload);
$canonicalRequest = $httpRequestMethod."\n"
.$canonicalUri."\n"
.$canonicalQueryString."\n"
.$canonicalHeaders."\n"
.$signedHeaders."\n"
.$hashedRequestPayload;
// echo $canonicalRequest.PHP_EOL;
// step 2: build string to sign
$date = gmdate("Y-m-d", $timestamp);
$credentialScope = $date."/".$service."/tc3_request";
$hashedCanonicalRequest = hash("SHA256", $canonicalRequest);
$stringToSign = $algorithm."\n"
.$timestamp."\n"
.$credentialScope."\n"
.$hashedCanonicalRequest;
// echo $stringToSign.PHP_EOL;
// step 3: sign string
$secretDate = hash_hmac("SHA256", $date, "TC3".$secretKey, true);
$secretService = hash_hmac("SHA256", $service, $secretDate, true);
$secretSigning = hash_hmac("SHA256", "tc3_request", $secretService, true);
$signature = hash_hmac("SHA256", $stringToSign, $secretSigning);
// echo $signature.PHP_EOL;
// step 4: build authorization
$authorization = $algorithm
." Credential=".$secretId."/".$credentialScope
.", SignedHeaders=content-type;host, Signature=".$signature;
// echo $authorization.PHP_EOL;
$url = "https://".$host;
$header[] = "Authorization:".$authorization;
$header[] = "Content-Type:application/json";
$header[] = "Host:".$host;
$header[] = "X-TC-Action:".$action;
$header[] = "X-TC-Timestamp:".$timestamp;
$header[] = "X-TC-Version:".$version;
$header[] = "X-TC-Region:".$region;
$header[] = "X-TC-Language:zh-CN";
$res = $this->CurlRequest($url,'post',$payload,$header);
}
四、需要配合的方法
1. 哈希256
private function SHA256Hex($str){
$re=hash('sha256', $str, true);
return strtolower(bin2hex($re));
}
2. 支持很多方式的curl
//发送请求方法
protected function CurlRequest($url,$type = null,$data=null,$header=null){
//初始化浏览器
$ch = curl_init();
//设置浏览器,把参数url传到浏览器的设置当中
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_NOBODY, false);
//以字符串形式返回到浏览器当中
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//禁止https协议验证域名,0就是禁止验证域名且兼容php5.6
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
//禁止https协议验证ssl安全认证证书
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
//判断data是否有数据,如果有data数据传入那么就把curl的请求方式设置为POST请求方式
if ( !empty($data) ) {
switch ($type) {
case 'get':
//设置POST请求方式
@curl_setopt($curl, CURLOPT_HTTPGET, true);
break;
case 'post':
//设置POST请求方式
@curl_setopt($ch, CURLOPT_POST, true);
//设置POST的数据包
@curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
break;
case 'put':
//设置PUT请求方式
@curl_setopt($ch, CURLOPT_CUSTOMREQUEST,"PUT");
//设置POST的数据包
@curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
break;
case 'delete':
//设置POST请求方式
@curl_setopt ($ch, CURLOPT_CUSTOMREQUEST, "DELETE");
//设置POST的数据包
@curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
break;
default:
//设置POST请求方式
@curl_setopt($ch, CURLOPT_POST, true);
//设置POST的数据包
@curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
break;
}
}
//设置header头
if ( !empty($header) ) {
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
}
//让curl发起请求
$httpCode = curl_exec($ch);
$errorCode = curl_errno($ch);
//关闭curl浏览器
curl_close($ch);
if(0 !== $errorCode) {
return false;
}
//把请求回来的数据返回
return json_decode($httpCode,true);
}