简单说下 开发中遇到的坑。这里用到的是 阿里云的视频直播服务,其实坑还是挺多的。
阿里云手册里写了的我就不再赘述。直接上代码(基于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里面是拼接出来的(最开始以为函数能直接获取)。
最后 我在自己开发的时候 百度了很多,但是帮助并不 希望这些代码能帮到正在准备研究直播的你。。。