获取授权密钥
1、注册登录金康云
2、访问会员中心->AccessKey管理
3、创建AppKey和AppSecrect
公共参数
参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 |
X-CS-AccessKeyID | String | 是 | 32 | 访问会员中心->AccessKey管理,创建获得 | 2Z2elmz7fBUMH |
X-CS-Timestamp | String | 是 | 20 | 当前请求时间:如果和服务器时间相差超过10分钟,签名失败 | 2018-01-01 20:00:00 |
X-CS-SignatureMethod | String | 是 | 11 | 生成签名字符串所使用的签名算法类型,目前支持HMAC-SHA256和MD5,推荐使用HMAC-SHA256 | HMAC-SHA256 |
X-CS-SignatureNonce | String | 是 | 32 | 签名唯一随机数。用于防止网络重放攻击,建议您每一次请求都使用不同的随机数,推荐使用唯一UUID,10-32个字符以内 | 3455676AFV7435 |
X-CS-ErrMsgLang | String | 是 | 2 | 返回错误时显示语言,默认EN(英文),CN为中文 | CN |
X-CS-Signature | String | 是 | 256 | 签名结果,注意数据签名时,不要把此参数作为数据签名 | 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; }