api请求统一接口参数及返回
请求参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| reqId | string | 是 | 请求id,作为幂等性检查 |
| version | string | 是 | 版本号 |
| method | string | 是 | 请求方法 |
| timestamp | int | 是 | 时间戳 |
| supplierNo | string | 是 | 供应商编号 |
| params | string | 是 | 方法的请求参数,aes加密转base64 |
2.1.2. 主返回数据
| 参数 | 二级参数 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| code | - | int | 是 | 状态码 200成功 |
| message | - | string | 是 | 错误信息 |
| data | - | string | 是 | 成功返回数据,aes加密转base64 |
安全
接口通过aes 加密 cbc 模式
请求时序图如下

备注:
- 请求加密串最终存在params,返回数据加密串存在data参数
- 如果返回数据只有状态码,没有data数据,就不需要做加密返回。
数据加密
- 消息内容为: TestMessage (前后无空格)
- 密钥为: qwertyuiop123456 (前后无空格)
- 通过aes_cbc模式,并Base64后: 5cfJMwX0w65sEQVBxu9zHw==
请求json示例
{
"reqId":"qqqqqqqqqqqqqqqq",
"version":"2.0",
"timestamp":1719887928,
"method":"GetProductStock",
"supplierNo":"testsupplier",
"params":"5cfJMwX0w65sEQVBxu9zHw=="
}
返回json示例
{
"code":200,
"message":"ok",
"data":"5cfJMwX0w65sEQVBxu9zHw=="
}
go aes cbc加解密函数
package cryptos
import (
"bytes"
"crypto/aes"
"crypto/cipher"
)
// =================== CBC ======================
// key的长度必须为16, 24或者32
func AesEncryptCBC(origData []byte, key []byte) (encrypted []byte, err error) {
// 分组秘钥
block, _err := aes.NewCipher(key)
if _err != nil {
err = _err
return
}
blockSize := block.BlockSize() // 获取秘钥块的长度
origData = pkcs5Padding(origData, blockSize) // 补全码
blockMode := cipher.NewCBCEncrypter(block, key[:blockSize]) // 加密模式
encrypted = make([]byte, len(origData)) // 创建数组
blockMode.CryptBlocks(encrypted, origData) // 加密
return encrypted, nil
}
// key的长度必须为16, 24或者32
func AesDecryptCBC(encrypted []byte, key []byte) (decrypted []byte, err error) {
block, _err := aes.NewCipher(key) // 分组秘钥
if _err != nil {
err = _err
return
}
blockSize := block.BlockSize() // 获取秘钥块的长度
blockMode := cipher.NewCBCDecrypter(block, key[:blockSize]) // 加密模式
decrypted = make([]byte, len(encrypted)) // 创建数组
blockMode.CryptBlocks(decrypted, encrypted) // 解密
decrypted = pkcs5UnPadding(decrypted) // 去除补全码
return decrypted, nil
}
func pkcs5Padding(ciphertext []byte, blockSize int) []byte {
padding := blockSize - len(ciphertext)%blockSize
padtext := bytes.Repeat([]byte{byte(padding)}, padding)
return append(ciphertext, padtext...)
}
func pkcs5UnPadding(origData []byte) []byte {
length := len(origData)
unpadding := int(origData[length-1])
return origData[:(length - unpadding)]
}