Skip to content

AES密钥获取

接口信息

  • 接口地址: /api/getAesKey
  • 请求方式: POST
  • Content-Type: application/json

接口说明

此接口用于获取正式AES密钥,采用临时密钥换取正式密钥的机制。

加密流程

客户端步骤

  1. 生成临时AES密钥: 生成32字节AES Key + 16字节IV
  2. RSA加密临时密钥: 使用服务端RSA公钥加密临时AES密钥
  3. 加密alliesNo: 使用临时AES密钥加密alliesNo作为data
  4. 构建Payload: {key: RSA加密的临时AES密钥, iv: 临时AES的IV, data: 临时AES加密的alliesNo}
  5. Base64编码: 整个JSON进行Base64编码

服务端步骤

  1. 解密Payload: 获取临时AES密钥和IV
  2. 验证alliesNo: 解密data得到alliesNo,与请求头中的X-Allies-No对比验证
  3. 生成正式密钥: 生成新的32字节正式AES Key + 16字节正式IV
  4. 加密正式密钥: 使用临时AES密钥加密正式AES密钥
  5. 存储到Redis: 正式密钥存储10分钟有效期
  6. 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)"
}

加密流程说明

重要: 此接口不同于其他业务接口,需要特殊的加密处理:

  1. 生成临时AES密钥(tempAesKey + tempIv)
  2. 临时AES密钥加密alliesNo作为data
  3. 用服务端RSA公钥加密临时AES密钥作为key
  4. 构建 {key, iv, data} 并Base64编码

响应参数

成功响应

json
{
  "code": "0000",
  "msg": "Success",
  "encryptedAesKey": "临时AES加密的正式AES密钥(Base64)",
  "encryptedAesIv": "临时AES加密的正式AES IV(Base64)",
  "timestamp": "1739424800000",
  "sign": "MD5签名"
}

响应字段说明

参数类型说明
codeString响应码(0000表示成功)
msgString响应消息
encryptedAesKeyString临时AES加密的正式AES密钥
encryptedAesIvString临时AES加密的正式AES IV
timestampString服务端时间戳(毫秒)
signStringMD5签名(alliesCode + alliesSecret签名后的MD5)

客户端解密流程

收到响应后:

  1. 提取 encryptedAesKey 和 encryptedAesIv
  2. 使用临时AES密钥解密得到正式AES密钥正式AES IV
  3. 保存正式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密钥,无需调用此接口。

注意事项

  1. 密钥绑定: 每个alliesNo拥有专属的正式AES密钥和IV
  2. 密钥更新: 每次请求都会更新密钥,旧密钥有2分钟宽限期
  3. 有效期: 新密钥有效期为10分钟
  4. 身份验证: 通过验证alliesNo确保请求的合法性
  5. 密钥存储: 建议将获取的正式AES密钥安全存储在内存或配置中
  6. 代付必需: 调用代付API前必须先获取正式AES密钥

代码示例

详细的加密和API调用示例:

相关文档