简单说下 开发中遇到的坑。这里用到的是 阿里云的视频直播服务,其实坑还是挺多的。
阿里云手册里写了的我就不再赘述。直接上代码(基于tp3.2)
验签
/**
* 模拟GET
*/
public function httpsGet( $url, $post='',$json=true ) {
date_default_timezone_set("UTC");
$Timestamp = date('c');
$Timestamp = explode('+',$Timestamp);
if( is_array( $post ) ){
$public = [
'Version'=>'2016-11-01',
'Format'=> 'json',
'AccessKeyId'=>$this->AccessKeyId,
'SignatureMethod'=>'HMAC-SHA1',
'Timestamp'=>$Timestamp[0].'Z',
'SignatureVersion'=>'1.0',
'SignatureNonce'=>$this->uuid(),
];
$post = array_merge($public,$post);
$Signature = self::getSignature($post,$this->AccessKeySecret);
foreach( $post as $key => $value )
{
$param .= $key . '=' . $value . '&';
}
$param .='Signature='.$Signature;
$urls = $url . '?' .$param;
}else{
$urls = $url;
}
//初始化
$curl = curl_init();
//设置抓取的url
curl_setopt( $curl, CURLOPT_URL, $urls );
//设置获取的信息以文件流的形式返回,而不是直接输出。
curl_setopt( $curl, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt( $curl, CURLOPT_SSL_VERIFYPEER, false );
curl_setopt( $curl, CURLOPT_SSL_VERIFYHOST, false );
//执行命令
$result = curl_exec($curl);
//获取服务器响应状态
$httpCode = curl_getinfo( $curl , CURLINFO_HTTP_CODE );
//关闭URL请求
curl_close($curl);
$result = json_decode( $result , true );
return $result;
}
public function getSignature($parameters, $access_key_secret){
ksort($parameters);
$StringToSign = 'GET&'.urlencode('/').'&';
$q_str = '';
foreach($parameters as $key=>$kval){
$q_str .= urlencode($key).'='.urlencode($kval).'&';
}
$q_str = substr($q_str,0,-1);
$StringToSign .= urlencode($q_str);
$ok_url = urlencode(base64_encode(hash_hmac("sha1",$StringToSign,$access_key_secret.'&',true)));
return $ok_url;
}
public function uuid($prefix = '')
{
$chars = md5(uniqid(mt_rand(), true));
$uuid = substr($chars,0,8) . '-';
$uuid .= substr($chars,8,4) . '-';
$uuid .= substr($chars,12,4) . '-';
$uuid .= substr($chars,16,4) . '-';
$uuid .= substr($chars,20,12);
return $prefix . $uuid;
}
获取验签的方法是个坑。我在阿里云下工单问出来demo的都是错的-.-
好在后来自己弄出来了
httpget 里面的 Timestamp参数也是个坑demo里面是拼接出来的(最开始以为函数能直接获取)。
最后 我在自己开发的时候 百度了很多,但是帮助并不 希望这些代码能帮到正在准备研究直播的你。。。