获取授权密钥

1、注册登录金康云

2、访问会员中心->AccessKey管理

3、创建AppKey和AppSecrect



公共参数

参数类型是否必填最大长度描述示例值
X-CS-AccessKeyIDString32访问会员中心->AccessKey管理,创建获得2Z2elmz7fBUMH
X-CS-TimestampString20当前请求时间:如果和服务器时间相差超过10分钟,签名失败2018-01-01 20:00:00
X-CS-SignatureMethodString11生成签名字符串所使用的签名算法类型,目前支持HMAC-SHA256和MD5,推荐使用HMAC-SHA256HMAC-SHA256
X-CS-SignatureNonceString32签名唯一随机数。用于防止网络重放攻击,建议您每一次请求都使用不同的随机数,推荐使用唯一UUID,10-32个字符以内3455676AFV7435
X-CS-ErrMsgLangString2返回错误时显示语言,默认EN(英文),CN为中文CN
X-CS-SignatureString256签名结果,注意数据签名时,不要把此参数作为数据签名O0JWdyKb6kHJaJiwHOFOLKYSX1qx79nhDDePOItbm=



拼接签名字符串

1、 对公共参数名按字母升序排序, 得到:

  • X-CS-AccessKeyID : "2Z21jEelmz7fBUMH"    

  • X-CS-ErrMsgLang : "CN"

  • X-CS-SignatureMethod: "HMAC-SHA256"

  • X-CS-SignatureNonce: "suiji-1596366544"

  • X-CS-Timestamp: "2020-08-02 19:09:04"


将上一步排序好的请求参数格式化成“参数名”=“参数值”的形式,然后将格式化后的各个参数用“&”拼接在一起。


X-CS-AccessKeyID=2Z21jEelmz7fBUMH&X-CS-ErrMsgLang=CN&X-CS-SignatureMethod=HMAC-SHA256&X-CS-SignatureNonce=suiji-1596366544&X-CS-Timestamp=2020-08-02 19:09:04




计算签名

通过HMAC-SHA256 ,用应用密钥AppSecrect对上一步拼接的字符串进行计算,返回格式为Base64。

crypto    
    .createHmac("sha256", appSecret)
    .update('signString')
    .digest("base64");

得到签名结果:ABNBrbrj2awewbTzDeZvsPJKiXv5ftYXaCIBbQPFhqM=


使用签名

将计算的签名结果放到请求的 Header 中,Key为:X-CS-Signature

POST /v2/text/query HTTP/1.1
Host: http://api2.aimlt.com/
Content-Type: application/json;charset=utf-8
X-CS-AccessKeyID : 221jEelmz7fBUMH    
X-CS-ErrMsgLang : CN      
X-CS-SignatureMethod : HMAC-SHA256    
X-CS-SignatureNonce : suiji-1596366544    
X-CS-Timestamp : 2015-08-02 19:09:04    
X-CS-Signature : O0JWdyKb6kHJaJiwHOFOLKYSX1qx79nhDDePOItbm+Y=  

// Payload data
{"key1":"val1","key2":"val2"}



代码示例


PHP

//请求接口URL
$url     = 'http://api2.aimlt.com/v2/Company/getrea'; 

//公共参数
$headers = [
    'X-CS-AccessKeyID'     => '22j1jEelmz7fBUMH',   
    'X-CS-Timestamp'       => date("Y-m-d H:i:s", time()),
    'X-CS-SignatureMethod' => 'HMAC-SHA256',
    'X-CS-SignatureNonce'  => guid(),
    'X-CS-ErrMsgLang'      => 'CN',
];

//请求参数
$para = [
    'fileNum'  => '参数1',
    'driveNum' => '567',
];

//生成签名
$secret                    = '你的应用密钥AppSecrect';
$signdata                  = array_merge($para, $headers);
$headers['X-CS-Signature'] = compute_signature($signdata, $secret, $headers['X-CS-SignatureMethod']);
    

//发起请求
$ret = getHttpResponse($url, 'post', $para, $headers);
print_r($ret);

/*
 * 自行生成的随机唯一UUID
 */
function guid() {
    if (function_exists('com_create_guid')) {
        return com_create_guid();
    } else {
        mt_srand((double) microtime() * 10000);
        $charid = strtoupper(md5(uniqid(rand(), true)));
        $hyphen = chr(45);
        $uuid   = substr($charid, 0, 8) . $hyphen
        . substr($charid, 8, 4) . $hyphen
        . substr($charid, 12, 4) . $hyphen
        . substr($charid, 16, 4) . $hyphen
        . substr($charid, 20, 12);
        return $uuid;
    }
}

/**
 * 替换特征字符
 * 使用urlencode编码后,将"+","*","%7E"做替换即满足ECS API规定的编码规范
 */
function signature_encode($str) {
    $res = urlencode($str);
    $res = preg_replace('/\+/', '%20', $res);
    $res = preg_replace('/\*/', '%2A', $res);
    $res = preg_replace('/%7E/', '~', $res);
    return $res;
}

/**
 * 生成签名
 * @param $para      待签名数组数据
 * @param $secret    密钥
 * @param $signType  签名方式:HMAC-SHA256、MD5
 */
function compute_signature($para, $secret, $signType = 'HMAC-SHA256') {
    if (!is_array($para)) {
        return false;
    }
    $signType = strtolower($signType);
    // 将参数Key按字典顺序排序
    ksort($para);
    // 生成规范化请求字符串
    $str = '';
    foreach ($para as $key => $value) {
        $str .= '&' . signature_encode($key) . '=' . signature_encode($value);
    }
    //删除左右&符号
    $str = trim($str, '&');

    // 生成用于计算签名的字符串 stringToSign
    $stringToSign = signature_encode($str);

    // 计算签名,注意AccessKeySecret后面要加上字符'&'
    if ($signType == 'hmac-sha256') {
        $signature = base64_encode(hash_hmac('sha256', $stringToSign, $secret . '&', true));
    } else {
        $signature = md5($stringToSign . $secret . '&');
    }
    return $signature;
}

/**
 * 远程获取数据
 * 注意:
 * 1.使用Crul需要修改服务器中php.ini文件的设置,找到php_curl.dll去掉前面的";"就行了
 * @param $url              指定URL完整路径地址
 * @param $method           请求方式:post、get
 * @param $para             请求的数据,数组数据
 * @param $headers          请求头信息,格式:$array = ['Content-type'=>'Content']
 * @param $userPasswd       用户名与密码,格式:user:passwd
 * @param $cacert_url       指定当前工作目录绝对路径,SSL证书请保证其路径有效
 * @param $input_charset    编码格式。默认值:空值
 * @param $seeError         如果执行curl过程中出现异常,可打开此开关,以便查看异常内容

 * return                   远程输出的数据
 */
function getHttpResponse($url, $method = 'post', $para = '', $headers = [], $userPasswd = '', $cacert_url = '', $input_charset = '', $seeError = false) {

    $method = strtolower($method);

    if (!empty($para) && is_array($para)) {
        $para = http_build_query($para);
    }

    if ($method == 'post') {
        if (trim($input_charset) != '') {
            $url = $url . "_input_charset=" . $input_charset;
        }
    } else {
        $m = strrpos($url, '?') > -1 ? '&' : '?';
        if (!empty($para)) {
            $url .= $m . $para;
        }
    }

    if (!function_exists('curl_init')) {
        return ['errcode' => '500', 'errmsg' => 'Your server does not support curl'];
    }

    $curl = curl_init($url);

    curl_setopt($curl, CURLOPT_URL, $url);

    //POST方式
    if ($method == 'post') {
        curl_setopt($curl, CURLOPT_POST, true); // post传输数据
        curl_setopt($curl, CURLOPT_POSTFIELDS, $para); // post传输数据
    }

    if (!empty($userPasswd)) {
        curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
        curl_setopt($curl, CURLOPT_USERPWD, $userPasswd);
    }

    $is_ssl = !empty($cacert_url) ? true : false;
    if (1 == strpos("$" . $url, "https://")) {
        $is_ssl = false;
    }

    curl_setopt($curl, CURLOPT_HEADER, 0); // 过滤HTTP头
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, $is_ssl); //SSL证书认证
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); //严格认证

    if (!empty($cacert_url)) {
        curl_setopt($curl, CURLOPT_CAINFO, $cacert_url); //证书地址
    }

    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 显示输出结果

    //设置请求头
    if (!empty($headers) && is_array($headers)) {
        $headers['Expect'] = ''; //防止HTTP/1.1 100-continue
        foreach ($headers as $k => $v) {
            $_list[] = $k . ':' . $v;
        }
        $headers = array_filter($_list);
        curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
    }

    $responseText = curl_exec($curl);
    if ($seeError) {
        return ['errcode' => '500', 'errmsg' => curl_error($curl)];
    }

    curl_close($curl);
    $json = json_decode($responseText, true);
    return is_array($json) ? $json : $responseText;
}