# 接口说明

# 公共参数

每个接口都需要传入的参数

参数 类型 是否必填 说明
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、"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

用户端:

1、获取加密数据:

{
    "errno": 0,
    "msg": "success",
    "data": {
        "response": "1DS74IGSmdq/ynQljl31jqvhlZJtDRtgGela2Sq/p7PozMjv82rXdJeZzIlWxcX3zqO3xqVSUefYZGAFsc91cQ==",
        "trace_id": "0a6072d45f3cdd6be61db3f9ffdfc9b0"
    }
}
1
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

解密数据算法示例: 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

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

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