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

03-05 15:29