• hash_hmac 签名


    <?php
    /**
     * ===========================================================
     * Model_Base
     * Description
     *             Model_Base
     * @Author     wzhu.email@gmail.com
     * @Version    1.0
     * @Copyright  Zhuweiwei
     *             Copyright © 2008-2012
     *             China. All Rights Reserved.
     * ===========================================================
     */
    
    namespace Action;
    
    use ZWUtility as Utility;
    use ZWHttpClient as HttpClient;
    
    class Expo
    {
        CONST URL_BASE = 'https://api.webexpotec.cn';
    
        CONST URL_EVENT = '/v1/event';
        //登录
        CONST URL_AUTH_SIGNIN = '/v1/auth/signin';
        //获取验证码和验证验证码
        CONST URL_AUTH_VCODE = '/v1/auth/vcode';
        //下订单
        CONST URL_ORDER = '/v1/order';
        //生成凭证
        CONST URL_ADMISSION = '/v1/admission';
        //查询用户是否已经有凭证
        CONST URL_ADMISSION_LISTING = '/v1/admission/listing';
        //二维码
        CONST URL_QR = '/v1/qr';
        //问卷调查
        CONST URL_QURESTION = '/v1/question/listing';
        //提交问题
        CONST URL_SURVEY = '/v1/survey/submit';
        //lifecbd 接口路径
        CONST URL_ARTICLE           = '/v1/article';
    
        /*   protected $app_key      = '1467721313';
           protected $app_secret   = '21e122dba62dcd9aed1488aced61f2c2';
            protected $eventid      = '1440860341';//
            protected $ticketid     = '1463800736';//票务ID*/
    
        protected $app_key    = '1467721309';
        protected $app_secret = '567aa793d2cfb865eec8623dc7b9de92';
        protected $eventid    = '1440860340';//活动id
        protected $ticketid   = '000000';//票务ID--随便写
    
    
        protected $app_ver = '1.0.0';
        protected $app_uuid = 'ABCDEFG';
        protected $sig_method = 'HMAC-SHA1';
        protected $il8n_lang = 'zh-cn';
    
        public function decodeQrcode($string)
        {
            $arrParam = array(
                'string' => $string,
            );
            return $this->get(self::URL_QR, $arrParam);
        }
    
    
        public function getSignin($arrParam = array())
        {
            $arrParam = array(
                'username'    => '13436919765',
                'password'    => '919765',
                'countrycode' => 'CN',
            );
            return $this->get(self::URL_AUTH_SIGNIN, $arrParam);
        }
    
        //登录
        public function getEventListing(array $arrParam = array(), $start = 0, $num = 100, $scope = 0)
        {
            $arrParam['start'] = (int)$start;
            $arrParam['num']   = (int)$num;
            $arrParam['scope'] = $scope;
            $url               = sprintf('%s/listing', self::URL_EVENT);
            return $this->get($url, $arrParam);
        }
    
        //获取活动内容
        public function getEvent($eventId, $scopes = 1)
        {
            $url      = sprintf('%s/%d', self::URL_EVENT, $eventId);
            $arrParam = array(
                'id'     => (int)$eventId,
                'scopes' => (int)$scopes,
            );
            return $this->get($url, $arrParam);
        }
    
        //获取验证码
        public function getAuthVcode($username, $type = 4, $countryCode = 'CN')
        {
            $arrParam = array(
                'username'    => $username,
                'countrycode' => $countryCode,
                'type'        => $type,
            );
            return $this->get(self::URL_AUTH_VCODE, $arrParam);
        }
    
        /**
         *读取列表数据
         */
        public function getArticleList($channel, $start = 0, $num = 20, $type = 0){
    
            $arrParam = array(
                'channel'    => $channel,
                'type'       => $type,
                'start'      => $start,
                'num'        => $num,
            );
            $url = sprintf('%s/listing', self::URL_ARTICLE);
            return $this->get($url, $arrParam);
        }
    
        /**读取文章数据
         * @param $articleId 文章id
         */
        public function getArticle($articleId){
            $url = sprintf('%s/%d', self::URL_ARTICLE, $articleId);
            return $this->get($url, array());
        }
    
        //校验验证码
        public function chkAuthVcode($username, $vcode = '', $type = 0, $countryCode = 'CN')
        {
            if (empty($vcode)) {
                $vcode = "abcdfg";
            }
            $arrParam = array(
                'username'    => $username,
                'countrycode' => $countryCode,
                'type'        => $type,
                'vcode'       => $vcode,
            );
            return $this->post(self::URL_AUTH_VCODE, $arrParam);
        }
    
        //提交注册表单
        public function orderForm($arr)
        {
            $goods    = [
                'id'  => $arr['id'],
                'num' => $arr['num'],
            ];
            $goods    = '[' . json_encode($goods) . ']';
            $arrParam = array(
                'type'        => $arr['type'],
                'goods'       => $goods,
                'realname'    => $arr['realname'],
                'cellphone'   => $arr['cellphone'],
                'email'       => $arr['email'],
                'corp'        => $arr['corp'],
                'title'       => $arr['title'],
                'address'     => $arr['address'],
                'countrycode' => $arr['countrycode'],
                'adminmemo'   => $arr['adminmemo'],
                'promocode'   => $arr['promocode'],
            );
            return $this->post(self::URL_ORDER, $arrParam);
        }
    
        //检查订单状态
        public function chkOrder($orderid)
        {
            $arrParam = array(
                'orderid' => $orderid,
            );
            return $this->get(self::URL_ORDER . "/" . $orderid, $arrParam);
        }
    
        //注册凭证
        public function registerAdmission($ticketnoid, $arr)
        {
    
            $arrParam = array(
                'ticketno'    => $ticketnoid,
                'realname'    => $arr['realname'],
                'cellphone'   => $arr['cellphone'],
                'email'       => $arr['email'],
                'corp'        => $arr['corp'],
                'title'       => $arr['title'],
                'countrycode' => 'CN',
                'extdata'     => $arr['adminmemo'],
            );
            return $this->post(self::URL_ADMISSION, $arrParam);
        }
    
        public function getUserAdmissionList($arrParam)
        {
    
            $arrParam['eventid']  = $this->eventid;
            $arrParam['ticketid'] = $this->ticketid;
    
            return $this->get(self::URL_ADMISSION_LISTING, $arrParam);
        }
    
    
        //获取问题列表
        public function getQuestionList($token, $suveryid)
        {
            $arrParam = array('surveyid' => (int)$suveryid,
                              'token'    => $token,);
            return $this->get(self::URL_QURESTION, $arrParam);
        }
    
        //提交问题列表
        public function submitSuvery($id, $answers)
        {
            return $this->post(self::URL_SURVEY . '/' . $id, $answers);
        }
    
    
        //////////////////////////////////////////////////////////////////////////
    
    
        //stdClass Object转array  
        public function objectArray($array)
        {
            if (is_object($array)) {
                $array = (array)$array;
            } else if (is_array($array)) {
                foreach ($array as $key => $value) {
                    $array[$key] = $this->objectArray($value);
                }
            }
            return $array;
        }
    
        //get组装curl字符串
        protected function urlGetstr($url, $arrParam)
        {
            $url = $url . "?" . $this->arrayTostr($arrParam);
            return $url;
        }
    
        //curl调用接口
        protected function httpCurlExce($url, $arrParam = array(), $method)
        {
            //如果是get提交需要组装url,post的则不需要
            if ($method == 'get') {
                $url = $this->urlGetstr($url, $arrParam);
            }
            //echo $url;
            //curl发送
            $curl = curl_init();
            //设置抓取的url
            curl_setopt($curl, CURLOPT_URL, $url);
            //设置头文件的信息作为数据流输出
            curl_setopt($curl, CURLOPT_HEADER, 1);
            //设置获取的信息以文件流的形式返回,而不是直接输出。
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
            //绕过ssl验证
            //curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            //在尝试连接时等待的秒数
            curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 90);
            //最大执行时间
            curl_setopt($curl, CURLOPT_TIMEOUT, 90);
            if ($method == 'post') {
                //设置post方式提交
                curl_setopt($curl, CURLOPT_POST, 1);
                //设置post数据
                curl_setopt($curl, CURLOPT_POSTFIELDS, $arrParam);
            }
            //执行命令
            $data = curl_exec($curl);
            //处理头信息
            // 获得响应结果里的:头大小
            $headerSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
            // 根据头大小去获取头信息内容
            $ret = substr($data, $headerSize);
            //关闭URL请求
            curl_close($curl);
            //stdClass Object转array
            $ret = json_decode($ret);
            $ret = $this->objectArray($ret);
            //echo "<pre>";
            //print_r($data);
            return $ret;
        }
    
        //签名算法
        protected function getSignature($str, $key)
        {
            $signature = "";
            if (function_exists('hash_hmac')) {
                //$signature = bin2hex(hash_hmac("sha1", $str, $key, true));
                $signature = hash_hmac("sha1", $str, $key, true);
            } else {
                $blocksize = 64;
                $hashfunc  = 'sha1';
                if (strlen($key) > $blocksize) {
                    $key = pack('H*', $hashfunc($key));
                }
                $key  = str_pad($key, $blocksize, chr(0x00));
                $ipad = str_repeat(chr(0x36), $blocksize);
                $opad = str_repeat(chr(0x5c), $blocksize);
                $hmac = pack(
                    'H*', $hashfunc(
                        ($key ^ $opad) . pack(
                            'H*', $hashfunc(
                                ($key ^ $ipad) . $str
                            )
                        )
                    )
                );
                //$signature = bin2hex($hmac);
                $signature = $hmac;
            }
            return $signature;
        }
    
        //base64UrlEncode
        protected function base64UrlEncode($str)
        {
            $search  = array('+', '/', '=');
            $replace = array('*', '-', '');
            $basestr = base64_encode($str);
            return str_replace($search, $replace, $basestr);
        }
    
        /**
         * 将数组中的值,按照键值排序,之后将每个元素拼接成url样式
         * @param $arrParam:数组
         * @return $str : 拼接的url地址
         */
        protected function arrayTostr($arrParam)
        {
            $i   = $arr_num = 0;
            $str = "";
            ksort($arrParam, SORT_NATURAL);
            $arr_num = count($arrParam);
            foreach ($arrParam as $key => $val) {
                $i++;
                if ($i < $arr_num) {
                    $str .= $key . '=' . urlencode($val) . '&';
                } else {
                    $str .= $key . '=' . urlencode($val);
                }
            }
            return $str;
        }
    
        protected function buildSignature($arrParam)
        {
            $str       = $this->arrayTostr($arrParam);//url地址拼接
            $signature = $this->getSignature($str, $this->app_secret);//hash_hmac 签名
            $signature = $this->base64UrlEncode($signature);//base64加密
            return $signature;
        }
    
        protected function getRandStr()
        {
            $str = '';
            for ($i = 1; $i <= 10; $i++) {
                $str .= chr(rand(65, 90));
            }
            return $str;
        }
    
        protected function adaptSysParam(array $arrParam)
        {
            $arrParam['app_key']    = $this->app_key;
            $arrParam['timestamp']  = NOW_TIME;
            $arrParam['sig_method'] = $this->sig_method;
            $arrParam['app_uuid']   = $this->app_uuid;
            $arrParam['app_ver']    = '1.0.0';
            $arrParam['il8n_lang']  = $this->il8n_lang;
            $arrParam['req_uuid']   = $this->getRandStr();
            $arrParam['signature']  = $this->buildSignature($arrParam);
            return $arrParam;
        }
    
        /**
         * @param :$url  url地址
         * @param :adaptSysParam  组合需要的传参,最后生成签名:签名方法:将数组组成url参数,生成hmac签名,base64加密
         * @param :httpCurlExce  curl获取接口内容
         */
        protected function get($url, array $arrParam)
        {
            $arrParam = $this->adaptSysParam($arrParam);
            $arr      = $this->httpCurlExce(self::URL_BASE . $url, $arrParam, 'get');
            return $arr;
        }
    
        protected function post($url, array $arrParam)
        {
            $arrParam = $this->adaptSysParam($arrParam);
            $arr      = $this->httpCurlExce(self::URL_BASE . $url, $arrParam, 'post');
            return $arr;
        }
    
    
    }
  • 相关阅读:
    python学习日记(OOP访问限制)
    python学习日记(OOP——@property)
    python学习日记(OOP——静态方法和类方法)
    python学习日记(isinstance和issubclass)
    python学习日记(OOP——反射)
    python学习日记(初识面向对象)
    python学习日记(内置、匿名函数练习题)
    python学习日记(内置函数)
    python学习日记(内置函数补充)
    Raft一致性协议
  • 原文地址:https://www.cnblogs.com/yszr/p/10621764.html
Copyright © 2020-2023  润新知