# Описание API
# Публичные параметры
Параметры, требуемые для всех API
| Параметр | Тип | Требуется или нет | Описание |
|---|---|---|---|
| fleet_id | int64 | Да | Таксопарк id |
| location_country | string | Да | Страна. См. «Сокращения» в приложении «Страны и языки» |
| lang | string | Да | Язык. См. «Язык» в приложении «Страны и языки» |
# Описание значений возврата API
| Параметр | Тип | Описание |
|---|---|---|
| errno | int32 | Код возврата. См. приложение «Коды возврата» |
| msg | string | Возвращенная информация |
| trace_id | string | Id, запроса, каждому запросу присваивается уникальное значение |
| data.response | string | Зашифрованные данные. Для получения исходных данных должен использоваться алгоритм расшифровки, который представляет собой строку, получаемую через сериализацию json объекта json |
# Правила расшифровки данных пользователей
«данные» в возвращенных данных будут зашифрованы. Пользователи API должны получать данные согласно правилам расшифровки. Правила шифровки данных: используется режим CBC алгоритма расшифровки AES, метод наполнения — PKCS5UnPadding В конце на выходе получается зашифрованная строка base64. Ключ расшифровки и смещение будут отправлены запрашивающему по электронной почте. Пример процесса шифрования-дешифрования:
На стороне сервера:
- Получение исходных данных:
{
"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
- "response"Сериализация объекта:
"response": "{\"driver_balance\":\"-217.01\",\"currency_code\":\"₽\"}"
1
- "response"Шифрование:
"response": "1DS74IGSmdq/ynQljl31jqvhlZJtDRtgGela2Sq/p7PozMjv82rXdJeZzIlWxcX3zqO3xqVSUefYZGAFsc91cQ=="
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
На стороне пользователя:
- Получение зашифрованных данных:
{
"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
- "response"Расшифровка:
"response": "{\"driver_balance\":\"-217.01\",\"currency_code\":\"₽\"}"
1
- Получение исходных данных через десериализацию:
"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;
}
Версия 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;
}
}
Версия 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)]
}