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 ZW\Utility as Utility;
use ZW\Http\Client 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;
    }


}

 

posted @ 2019-03-29 15:48  御世制人  阅读(2472)  评论(0编辑  收藏  举报