签名方式
# 签名方式
所有HTTP请求必须带上公共头和签名,服务器端将会进行对请求进行验签。
签名参数和值区分大小写,字符编码统一采用utf-8
### 1,签名所需的参数
#### `accessKeyId`
获取平台颁发的accessKeyId
#### `timestamp`
时间戳。按照ISO8601标准表示,并需要使用UTC时间,格式为yyyy-MM-ddTHH:mm:ssZ
例如:北京时间2020/10/1 21:00:00,需要转换为2020-10-01T13:00:00Z
#### `signatureNonce`
随机数,每次请求使用不同的随机数防止网络重放攻击。
#### `path`
https://test.openapi.huitravel.com/api/v1/product/1?price=100.1&name=
取`/api/v1/product/1`部分。
#### query params部分
https://test.openapi.huitravel.com/api/v1/product/1?price=100.1&name=
取`price=100.1`和`name=`
### 2,拼接 stringToSign
将四个固定参数和值,外加所有Query Params参数和值,以key,value形式组成集合,请求Body不参与签名。
```
[
{accessKeyId,7568512625},
{timestamp,2020-10-01T13:00:00Z},
{signatureNonce,0.265155265282885},
{path,/api/v1/product/1},
{price,100.01},
{name,}
]
```
按照key的字典顺序进行排序
```
[
{accessKeyId,7568512625},
{name,},
{path,/api/v1/product/1},
{price,100.01},
{signatureNonce,0.265155265282885},
{timestamp,2020-10-01T13:00:00Z}
]
```
对参数值进行urlencode,编码采用<a href="https://tools.ietf.org/html/rfc3986" target="_blank">RFC3986</a>。使用 %XY 对特殊字符例如汉字进行百分比编码,其中“X”和“Y”为十六进制字符(0-9 和大写字母 A-F),并且为大写。
对于字符 `A~Z` `a~z` `0~9` 以及字符 `-` `_` `.` `~` 不编码;
对于其它字符编码成 `%XY` 的格式,其中 `XY` 是字符对应 `ASCII` 码的16进制表示。
比如英文的双引号 `"` 对应的编码为 `%22`,英文空格 ` ` 要编码成 `%20`
然后以key=value的形式用 `\n` 换行符隔开进行拼接,并且需要对value进行urlencode编码,最后得到字符串`stringToSign`
```
accessKeyId=7568512625
name=
path=%2Fapi%2Fv1%2Fproduct%2F1
price=100.1
signatureNonce=0.265155265282885
timestamp=2020-10-01T13%3A00%3A00Z
```
### 3,使用HmacSHA1摘要算法进行签名
`stringToSign`作为待签名串,平台分配的`accessKeySecret`值作为密钥,此处accessKeySecret="a02f3025-9c9b-4737-897d-7e94242797a0"
```
得到签名结果signature
fd66b76abd2de3964aca2a079fefff06c5b85898
```
<a href="http://www.metools.info/code/c25.html" target="_blank">在线签名 </a>http://www.metools.info/code/c25.html
