# Описание 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. Ключ расшифровки и смещение будут отправлены запрашивающему по электронной почте. Пример процесса шифрования-дешифрования:

На стороне сервера:

  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
  1. "response"Сериализация объекта:
"response": "{\"driver_balance\":\"-217.01\",\"currency_code\":\"₽\"}"
1
  1. "response"Шифрование:
"response": "1DS74IGSmdq/ynQljl31jqvhlZJtDRtgGela2Sq/p7PozMjv82rXdJeZzIlWxcX3zqO3xqVSUefYZGAFsc91cQ=="
1
  1. Выход:
{
    "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
  1. "response"Расшифровка:
"response": "{\"driver_balance\":\"-217.01\",\"currency_code\":\"₽\"}"
1
  1. Получение исходных данных через десериализацию:
"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;
}

Версия 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)]
}