DIGITAL-SIGN.COM.CN

签名介绍

1.系统参数

系统参数有以下这些:
  • accessKeyId: 请求者的accessKeyId,申请API(代理商)权限后由系统分配。
  • timestamp: 时间戳,格式为 YYYY-mm-dd\THH:ii:ss\Z,如2019-10-10T12:00:01Z,特别注意的是需要获取中华人民共和国北京时区下的时间,且误差不能超过15分钟。
  • nonce: 幂等token,格式为英文大小写字母加数字,长度32字符内,开发者需要保证在24小时内不冲突。
  • sign: 签名,将请求API的URI+系统参数+业务参数排序后做为数据,由 accessKeySecret进行 sha256 摘要后 base64 得到。具体生成规则请见签名
<?php
$defaultTimeZone = date_default_timezone_get(); //获取签名前的时区
date_default_timezone_set('PRC'); //设置到东八区

$parameters['accessKeyId'] = $this->accessKeyId;
$parameters['nonce'] = uniqid();
$parameters['timestamp'] = date('Y-m-d\TH:i:s\Z'); //获取时间戳
date_default_timezone_set($defaultTimeZone); //还原到签名前的时区


2.参数整理

首先以业务参数优先,将系统参数合并进业务参数:
<?php
$defaultTimeZone = date_default_timezone_get(); //获取签名前的时区
date_default_timezone_set('PRC'); //设置到东八区

$parameters['accessKeyId'] = $this->accessKeyId;
$parameters['nonce'] = uniqid();
$parameters['timestamp'] = date('Y-m-d\TH:i:s\Z'); //获取时间戳
date_default_timezone_set($defaultTimeZone); //还原到签名前的时区

// 以上是之前的代码
$business_parameters = [/* 业务参数 */];

// 将业务参数中的两头空格移除
function trimize($business_parameters) {
    foreach($business_parameters as $key => $value) {
        if (is_string($value)) {
            // 当 value 为数组时, 需要对 value 下的子项也 trim 操作
            $business_parameters[$key] = trim($value);
            if ('' === $business_parameters[$key]) {
                $business_parameters[$key] = null;
            }
        } else if (is_array($value)) {
            $business_parameters[$key] = trimize($value);
        }
    }
    return $business_parameters;
}
$business_parameters = trimize($business_parameters);

$parameters = array_merge($parameters, isset($arguments[1]) ? $arguments[1] : []);

ksort($parameters);


3.签名

将请求的API完整相对地址(不带域名部分和?后参数部分),与第二部合并后的所有参数,以 `key1=urlencode(value1)&key2=urlencode(value2)`的方式拼到一个字串,使用 sha256 以 `accessKeySecret` 为加密KEY签名:
<?php
$defaultTimeZone = date_default_timezone_get(); //获取签名前的时区
date_default_timezone_set('PRC'); //设置到东八区

$parameters['accessKeyId'] = $this->accessKeyId;
$parameters['nonce'] = uniqid();
$parameters['timestamp'] = date('Y-m-d\TH:i:s\Z'); //获取时间戳
date_default_timezone_set($defaultTimeZone); //还原到签名前的时区

$business_parameters = [/* 业务参数 */];
$parameters = array_merge($parameters, isset($arguments[1]) ? $arguments[1] : []);

ksort($parameters);
// 以上是之前的代码
$parameters['sign'] = base64_encode(hash_hmac(
    'sha256',
    $resource . '?' .http_build_query($parameters),
    $this->accessKeySecret,
    true // 务必选择raw类型,而不要十六进制类型
));

$uri = $this->apiOrigin . $resource;

//接下来可以向 $uri 发起请求了,GET/POST参数就是 $parameters