# 接口说明
# 公共参数
每个接口都需要传入的参数
| 参数 | 类型 | 是否必填 | 说明 |
|---|---|---|---|
| fleet_id | int64 | 是 | 车头id |
| location_country | string | 是 | 所属国家,见附录“所属国家和语言”中“国家简写” |
| lang | string | 是 | 语言,见附录“所属国家和语言”中“语言” |
# 接口返回值说明
| 参数 | 类型 | 说明 |
|---|---|---|
| errno | int32 | 返回码,见附录“返回码” |
| msg | string | 返回信息 |
| trace_id | string | 请求id,每个请求分配一个唯一值 |
| data.response | string | 加密数据,需要通过解密算法获取原始数据,原始数据是json对象经过json序列化得到的字符串 |
# 用户数据解密规则
返回数据中的“response”数据会被加密,接口使用者需要按照解密规则获取对应的数据。 数据加密规则:采用AES解密算法的CBC模式,填充方式为PKCS5UnPadding,最终输出加密后的base64格式的字符串。 解密的密钥和偏移量会通过邮件发送给申请用户。 加密和解密的过程示例:
服务端:
1、获取原始数据:
{
"errno": 0,
"msg": "success",
"data": {
"response": {
"driver_balance": "-217.01",
"currency_code": "₽"
},
"trace_id": "0a6072d45f3cdd6be61db3f9ffdfc9b0"
}
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
2、"response"对象序列化:
"response": "{\"driver_balance\":\"-217.01\",\"currency_code\":\"₽\"}"
1
3、"response"加密:
"response": "1DS74IGSmdq/ynQljl31jqvhlZJtDRtgGela2Sq/p7PozMjv82rXdJeZzIlWxcX3zqO3xqVSUefYZGAFsc91cQ=="
1
4、输出:
{
"errno": 0,
"msg": "success",
"data": {
"response": "1DS74IGSmdq/ynQljl31jqvhlZJtDRtgGela2Sq/p7PozMjv82rXdJeZzIlWxcX3zqO3xqVSUefYZGAFsc91cQ==",
"trace_id": "0a6072d45f3cdd6be61db3f9ffdfc9b0"
}
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
用户端:
1、获取加密数据:
{
"errno": 0,
"msg": "success",
"data": {
"response": "1DS74IGSmdq/ynQljl31jqvhlZJtDRtgGela2Sq/p7PozMjv82rXdJeZzIlWxcX3zqO3xqVSUefYZGAFsc91cQ==",
"trace_id": "0a6072d45f3cdd6be61db3f9ffdfc9b0"
}
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
2、"response"解密:
"response": "{\"driver_balance\":\"-217.01\",\"currency_code\":\"₽\"}"
1
3、反序列化得到原始数据:
"response":{
"driver_balance": "-217.01",
"currency_code": "₽"
}
1
2
3
4
2
3
4
解密数据算法示例: php 版本
// 加密偏移量
const iv = '';
// AES密钥
const encryptKey = '';
//解密
function decrypt($encryptStr) {
$localIV = iv;
$encryptKey = encryptKey;
//Open module
$module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, $localIV);
mcrypt_generic_init($module, $encryptKey, $localIV);
$encryptedData = base64_decode($encryptStr);
$encryptedData = mdecrypt_generic($module, $encryptedData);
return $encryptedData;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
java 版本
import java.io.*;
import java.security.AlgorithmParameters;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchProviderException;
import java.security.Security;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class AES {
// AES密钥
private static final String key = "";
// 加密偏移量
private static final String initVector = "";
public static String decrypt(String encrypted) {
try {
IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
byte[] original = cipher.doFinal(Base64.getDecoder().decode(encrypted.getBytes()));
return new String(original);
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
golang版本
import (
"bytes"
"crypto/aes"
"crypto/cipher"
"encoding/base64"
"fmt"
)
const (
// AES密钥
key = ""
// 加密偏移量
iv = ""
)
func AesDecrypt(decodeStr string, key []byte) ([]byte, error) {
//先解密base64
decodeBytes, err := base64.StdEncoding.DecodeString(decodeStr)
if err != nil {
return nil, err
}
block, err := aes.NewCipher(key)
if err != nil {
return nil, err
}
blockMode := cipher.NewCBCDecrypter(block, []byte(iv))
origData := make([]byte, len(decodeBytes))
blockMode.CryptBlocks(origData, decodeBytes)
origData = PKCS5UnPadding(origData)
return origData, nil
}
func PKCS5UnPadding(origData []byte) []byte {
length := len(origData)
unpadding := int(origData[length-1])
return origData[:(length - unpadding)]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39