Skip to content

API 加签文档

Python 示例参考

1. 接入准备

1.1 获取接入凭证

请访问管理后台获取接入所需凭证:

1.2 接入必要参数

参数名说明示例值
生产环境地址API 网关地址https://openapi.suanleme.cn
API 版本号当前支持的版本1.0.0
token接口调用凭证a0e13fe1-5626-4c05-926b-20f586c69102-20240821144204
user_rsa_prik用户上传的 RSA 私钥-
system_rsa_pubk系统分配的 RSA 公钥-

2. 接口调用规范

2.1 请求规范

  • 字符编码:UTF-8
  • 请求方式:仅支持 POST/GET
  • Content-Type:application/json

2.2 请求头 Header 参数

参数名是否必填说明示例值
versionAPI 版本号1.0.0
token接口调用凭证a0e13fe1-5626-4c05-926b-20f586c69102-20240821144204
timestamp时间戳 (毫秒)1721299458423
sign_str签名字符串 (Base64)

2.3 响应格式

列名类型不是 null说明实例值
codeString响应 code0000
messageString响应说明success
dataObject数据体{"username":"user1","password":"password1"}
json
{
    "code": "0000",      // 响应码
    "message": "success", // 响应说明
    "data": {            // 业务数据
        "key": "value"
    }
}

3. 加签规则

3.1 签名规则

  1. 计算请求体待签名字符串,如果为请求 GET 请求,则验签是 data 字段为空字符串。

构造待签名字符串,按以下格式拼接:

text
{path}\n{version}\n{timestamp}\n{token}\n{data}

Rust 示例如下

Rust
//format!("{}\n{}\n{}\n{}\n{}", path, version, timestamp, token, data)

/api/user/order/get_this_week_residue_withdrawal_count
1.0.0
1724222524375
a0e13fe1-5626-4c05-926b-20f586c69102-20240821144204
{"username":"user1","password":"password1"}
  1. 获取到待签名字符串后,获取 RSA 私钥通过 rsa_sha256_prik_sign 签名算法,进行计算签名,然后生成 BASE64 字符串。
  2. 然后设置请求头里的 sign_str 字段,值为生成的 BASE64 格式的加签字符串。

3.2 加密规则

  1. 只对请求体(Body)内容进行加密
  2. 加密需要通过获取的 RSA 公钥进行加密操作。
  3. 首先将请求体内容序列化为 bytes 数组,然后根据 RSA 公钥对该字符串进行 rsa_pubk_encrypt 算法加密。
  4. 之后将加密 bytes 数组转换为 BASE64 字符串,放入请求体中。
  5. 如果请求同时需要加密和加签,则需要先进行加密步骤,再进行加签步骤。

3.3 调用示例

sh
curl --location --request POST 'https://openapi.suanleme.cn/api/{api-path}' \
--header 'version: 1.0.0' \
--header 'token: a0e13fe1-5626-4c05-926b-20f586c69102-20240821144204' \
--header 'timestamp: 1724222524375' \
--header 'sign_str: {签名结果}' \
--data-raw '{"key":"value"}'

例如

sh
curl --location --request POST 'https://openapi.suanleme.cn/api/{api-path}' \\  
\--header 'token: a0e13fe1-5626-4c05-926b-20f586c69102-20240821144204' \\  
\--header 'timestamp: 1724222524375' \\  
\--header 'version: 1.0.0' \\  
\--header 'sign_str: EowIBAAKCAQEArbNcSNSLjHzqOzrYL+7afEh5TI4hn1BCxsuzY02c1RMn24a2YEvpqCCVDxmgN/dcAdcCcvhO/2wDG389LuEkw+QhVPzdAE29bbzz+Gb/FDusVNo6tl8mbfd/XA53h3sOCekEMP2QCoPAoUO94wUWK5RpjsONf9Bs0Q6YUmL4TWqvPGmWjc/Y8winDtFzKN2his5PhbWlRiSkENGXSma6lr66BA/SduAY/Fl8YxEWThVkYsAurg0rEd83DilN4zp7hZf82Msjgp8kPm/SMHTEF2V2cOo82m12HyRJKuKS0L8WPVIwQmXJ6VN55ue+b96sryUs/WZyfiXTh0thoa9vqQIDAQABAoIBAQCsOMDQSUTPl27aKR7+b5FbVrRF7kpx3i9HUeLcG7DbJrIHHAspcTsLgrqoDR1pQC2OeXMpMP+KirqOAdtU5tAAFenijRBGY83kx0sSSHSyx/O28eTyu2ar84/oY0OqJZ0mwE1ykYXGlxlgC31zYLC5pt3+Oe/LAYlSwmjOjuhoQDMZoiCByIw6oDAVLIlZwTl8A/HAR1yacDTh6lps1vTZ5lBfIDpbn1gHb2GWqHu8q9oD9G9IEyWwwTE1IsNXVwBKEifjLubd2WfTWDmROVZZ9T4AXm/40/Eb6ALApwY5s7lBMIiapmcJZzlyELEukUMmYN7vHBjdMDOPK3tjLSKNA' \\  
\--data-raw '{"username":"test1","password":"password1"}'