采用 HMAC-SHA256 算法,根据 secret_key 生产签名信息,通过校验签名进行鉴权。
- 签名所需参数
参数名 | 数据类型 | 描述
--- | --- | ---
app_secret | string | 账号密钥
timestamp | int | 当前时间戳(精确到秒,10位)
nonce_str | string | 随机字符串(由英文字母或数字组成,长度大于或等于8位)
query | string | 发起 HTTP 请求 URL 中的查询字符串,即 URL 中问号(?)后面的字符串内容
body | string | 请求正文(payload,即 body,对于 GET/DELETE 请求,此值固定为空字符串)
- 签名步骤
假设
```
$app_secret = ca8K9a0fbLf2M6effL5f3M6J
$timestamp = 1631696860
$nonce_str = 046J575b
$query = page=1
$body =
```
先对 `body` 以 `app_secret` 为key,做 SHA256 哈希,然后十六进制编码,最后编码串转换成小写字母
```
// 伪代码
$body_hash = hash_hmac($body, $app_secret);
// $body_hash = hash_hmac("", "ca8K9a0fbLf2M6effL5f3M6J");
// 即 $body_hash = "8ebd0495eef272cb47b1ba64745963f5d6e9b7846c7676dbffb1237b33830deb";
```
再对 `query` 以 `app_secret` 为key,做 SHA256 哈希,然后十六进制编码,最后编码串转换成小写字母
```
// 伪代码
$query_hash = hash_hmac($query, $app_secret);
// $query_hash = hash_hmac("page=1", "ca8K9a0fbLf2M6effL5f3M6J");
// 即 $query_hash = "1bd5303b65eda3009b5a65f79f979b0bb30be4848f552e723b53870af4fd75dd";
```
按以下顺序,拼接字符串
```
// 伪代码
$origin_str = "app_secret=" + $app_secret + "\n"
+ "body=" + $body_hash" + "\n"
+ "nonce_str=" + $nonce_str" + "\n"
+ "query=" + $query_hash" + "\n"
+ "timestamp=" + $query_hash"
// 即 $origin_str = "app_secret=ca8K9a0fbLf2M6effL5f3M6J\nbody=8ebd0495eef272cb47b1ba64745963f5d6e9b7846c7676dbffb1237b33830deb\nnonce_str=046J575b\nquery=1bd5303b65eda3009b5a65f79f979b0bb30be4848f552e723b53870af4fd75dd\ntimestamp=1631696860"
```
然后对拼接的字符串,以 `app_secret` 为key,做 SHA256 哈希,然后十六进制编码,最后编码串转换成小写字母,得到签名
```
// 伪代码
$signature = hash_hmac($origin_str, $app_secret);
// 即 $signature = "0a2fee4c71360d8ac9fae5032644c1d2e5190a52d83a0eb80bf49e6679bc2269"
```
对签名前面,拼接 `FP-SIGN-HMAC-SHA256 `,得出对应的 `Authorization` 值
```
Authorization: FP-SIGN-HMAC-SHA256 0a2fee4c71360d8ac9fae5032644c1d2e5190a52d83a0eb80bf49e6679bc2269
```
最后,把以上信息放到请求的 Header
```
{
"X-FP-NonceStr": "046J575b",
"X-FP-Timestamp": "1631696860",
"Authorization": "FP-SIGN-HMAC-SHA256 0a2fee4c71360d8ac9fae5032644c1d2e5190a52d83a0eb80bf49e6679bc2269"
}
```
<p class="align-center"><a href="https://beian.miit.gov.cn" target="_blank">粤ICP备18096044号</a></p>
