AES密钥获取
接口信息
- 接口地址:
/api/getAesKey - 请求方式:
POST - Content-Type:
application/json
接口说明
此接口用于获取正式AES密钥,采用临时密钥换取正式密钥的机制。
加密流程
客户端步骤
- 生成临时AES密钥: 生成32字节AES Key + 16字节IV
- RSA加密临时密钥: 使用服务端RSA公钥加密临时AES密钥
- 加密alliesNo: 使用临时AES密钥加密alliesNo作为data
- 构建Payload:
{key: RSA加密的临时AES密钥, iv: 临时AES的IV, data: 临时AES加密的alliesNo} - Base64编码: 整个JSON进行Base64编码
服务端步骤
- 解密Payload: 获取临时AES密钥和IV
- 验证alliesNo: 解密data得到alliesNo,与请求头中的X-Allies-No对比验证
- 生成正式密钥: 生成新的32字节正式AES Key + 16字节正式IV
- 加密正式密钥: 使用临时AES密钥加密正式AES密钥
- 存储到Redis: 正式密钥存储10分钟有效期
- MD5签名响应: 返回加密的正式密钥
请求头
| 名称 | 类型 | 必填 | 说明 | |------|------|------| | X-Allies-No | String | 是 | 友商编号(用于验证身份) | | Content-Type | String | 是 | 固定值: application/json |
请求参数
请求体结构
json
{
"encryptedPayload": "Base64编码的加密数据"
}encryptedPayload 解密后的结构
json
{
"key": "Base64(RSA加密的临时AES密钥)",
"iv": "Base64(AES初始化向量)",
"data": "Base64(AES加密的alliesNo)"
}加密流程说明
重要: 此接口不同于其他业务接口,需要特殊的加密处理:
- 生成临时AES密钥(tempAesKey + tempIv)
- 用临时AES密钥加密alliesNo作为data
- 用服务端RSA公钥加密临时AES密钥作为key
- 构建
{key, iv, data}并Base64编码
响应参数
成功响应
json
{
"code": "0000",
"msg": "Success",
"encryptedAesKey": "临时AES加密的正式AES密钥(Base64)",
"encryptedAesIv": "临时AES加密的正式AES IV(Base64)",
"timestamp": "1739424800000",
"sign": "MD5签名"
}响应字段说明
| 参数 | 类型 | 说明 |
|---|---|---|
| code | String | 响应码(0000表示成功) |
| msg | String | 响应消息 |
| encryptedAesKey | String | 临时AES加密的正式AES密钥 |
| encryptedAesIv | String | 临时AES加密的正式AES IV |
| timestamp | String | 服务端时间戳(毫秒) |
| sign | String | MD5签名(alliesCode + alliesSecret签名后的MD5) |
客户端解密流程
收到响应后:
- 提取 encryptedAesKey 和 encryptedAesIv
- 使用临时AES密钥解密得到正式AES密钥和正式AES IV
- 保存正式AES密钥用于后续业务API调用(代付等)
密钥管理机制
Redis存储结构
AES_KEY:{alliesNo} = {
alliesNo: "IG20250911001",
aesKey: "正式AES密钥(Base64)",
aesIv: "正式AES IV(Base64)",
keyId: "IG20250911001_1739424800000_0123",
createTime: 1739424800000
}宽限期机制
- 有效期: 10分钟
- 更新: 每次请求更新密钥,旧密钥移至宽限期缓存(2分钟)
- 目的: 确保请求期间不会因为密钥更新而失败
请求示例
bash
curl -X POST "https://pay.example.com/api/getAesKey" \
-H "Content-Type: application/json" \
-H "X-Allies-No: IG20250911001" \
-d '{
"encryptedPayload": "eyJrZXkiOiAiLi4uIiwgIml2IjogIi4uLiJ9...f+z/WUfp1IjOVh..."
}'错误响应
Payload解密失败
json
{
"code": "1008",
"msg": "Payload decryption failed",
"data": null
}友商不存在
json
{
"code": "1001",
"msg": "Unable to find user",
"data": null
}错误码
| 错误码 | 说明 | 处理建议 |
|---|---|---|
| 0000 | 操作成功 | - |
| 1001 | 友商不存在 | 检查alliesNo是否正确 |
| 1008 | 加密/解密失败 | 检查加密流程是否正确 |
| 9999 | 系统错误 | 联系技术支持 |
使用场景
代付API必须先获取AES密钥
代付API (/api/peerPay) 需要使用从此接口获取的正式AES密钥:
1. 调用 /api/getAesKey 获取正式AES密钥
2. 使用正式AES密钥加密代付请求参数
3. 调用代付API时会验证密钥是否匹配代收API可选
代收API (/api/alliesPay) 可以自行生成临时AES密钥,无需调用此接口。
注意事项
- 密钥绑定: 每个alliesNo拥有专属的正式AES密钥和IV
- 密钥更新: 每次请求都会更新密钥,旧密钥有2分钟宽限期
- 有效期: 新密钥有效期为10分钟
- 身份验证: 通过验证alliesNo确保请求的合法性
- 密钥存储: 建议将获取的正式AES密钥安全存储在内存或配置中
- 代付必需: 调用代付API前必须先获取正式AES密钥
代码示例
详细的加密和API调用示例:
