2026-06-20 13:28:22 +08:00

113 lines
2.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 接口签名算法说明
## 概述
本接口使用 **HMAC-MD5** 算法对请求参数进行签名,以确保请求的合法性与完整性,防止请求被篡改或伪造。
生成的sign值放在header中key=X-signvalue=加密值。
---
## 签名生成流程
```
请求参数
① 参数递归排序ksort
② 构造签名字符串key=value&key=value...
│ 数组/对象类型 → JSON 字符串
③ HMAC-MD5(query_string, secret_key)
sign签名结果
```
---
## 详细步骤
### 第一步:参数递归排序
对所有请求参数按照**键名字典序ksort进行递归排序**,嵌套数组也需同样处理,以保证双方构造字符串的顺序一致。
### 第二步:构造签名字符串
遍历排序后的参数,按以下规则拼接为字符串:
| 参数类型 | 处理方式 |
| ------------------------ | -------------------------------------------------------- |
| 普通值(字符串、数字等) | 直接使用原始值 |
| 数组 / 对象 | 转为 JSON 字符串(中文不转义,`JSON_UNESCAPED_UNICODE` |
拼接格式:
```
key1=value1&key2=value2&key3=value3
```
> ⚠️ **注意**:参数值**不做 URL encode**,与 `http_build_query` 的行为不同。数组参数也**不展开**为 `key[0]=...` 形式,而是整体转为 JSON 字符串。
### 第三步:计算签名
使用 `secret_key` 对上一步得到的字符串执行 **HMAC-MD5** 计算:
```
sign = HMAC-MD5(query_string, secret_key)
```
---
## 示例
### 原始请求参数
```json
{
"uid": 1001,
"amount": 100,
"currency": "CNY",
"items": [
{ "id": 1, "name": "商品A" }
]
}
```
### 第一步:排序后的参数顺序
```
amount, currency, items, uid
```
### 第二步:构造签名字符串
```
amount=100&currency=CNY&items=[{"id":1,"name":"商品A"}]&uid=1001
```
### 第三步:计算签名
```
sign = HMAC-MD5("amount=100&currency=CNY&items=[{\"id\":1,\"name\":\"商品A\"}]&uid=1001", "your_secret_key")
```
---
## 注意事项
| 项目 | 说明 |
| -------- | -------------------------------------------------------- |
| 排序方式 | 字典序递归排序,嵌套数组也要排序 |
| 数组参数 | 转为 JSON 字符串,中文不转义(`JSON_UNESCAPED_UNICODE` |
| URL 编码 | 参数值**不做** URL encode |
| 数组展开 | **不展开**为 `key[0]=...` 形式 |
| 密钥管理 | `secret_key` 需双方提前约定,**严禁在请求中传输** |
| 算法 | HMAC-MD5输出为 32 位十六进制小写字符串 |
---
密钥: H6p*2RfEu4ITcL