Authentication
Интерфейс API системы Any.Money выполнен на основе протокола удаленного вызова процедур JSON-RPC, но его реализация имеет такие ограничения:
- уведомления (notifications) не обрабатываются;
- не поддерживаются групповые запросы/ответы (batch request/response);
- все значения параметров в запросе передаются только в строчном или boolean форматах;
- в поле params поддерживается передача аргументов в формате json-объекта, но не массивом;
- если для аргумента передано значение
null, то используется его значение по умолчанию. Когда оно не предусмотрено - возвращается соответствующая ошибка.
Формирование запроса
Запросы к API отправляются на endpoint https://api.any.money/.
Запрос должен быть подписан. Данные мерчанта передаются в заголовках.
Заголовки
- x-merchant - идентификатор мерчанта;
- x-signature - хеш-подпись запроса;
- x-utc-now-ms - время создания запроса, в миллисекундах (utc timestamp).
Параметры
- method - имя метода запроса;
- params - параметры метода в виде
ключ: значение; - jsonrpc - версия спецификации (всегда равна "2.0");
- id - идентификатор запроса.
Подпись
Для аутентификации запроса его нужно подписать и передать подпись в
заголовке x-signature.
Подпись формируется по алгоритму HEX(HMAC-SHA512(data, api_key)),
где:
- data - строка, составленная из значений объекта params. Для
формирования строки необходимо:
- отсортировать ключи params по алфавиту;
- составить строку из их значений, за исключением вложенных
объектов и
null; - к концу полученной строки добавить значение хедера x-utc-now-ms;
- привести строку к нижнему регистру;
- api_key - ключ мерчанта для взаимодействия по API.
Пример запроса по API
Python
import hashlib
import hmac
import requests
import time
def sign_data(key: str, data: dict, utc_now: str) -> str:
if data: sorted_data = sorted(data.items())
else: sorted_data = {}
msg = ''.join(
str(v) for k, v in sorted_data
if not isinstance(v, (dict, list, type(None)))
) + str(utc_now)
msg = msg.lower()
return hmac.new(key.encode(), msg.encode(), hashlib.sha512).hexdigest()
data = {
"method": "balance",
"params": {"curr": "BTC"},
"jsonrpc": "2.0",
"id": "1"
}
MERCHANT = '1234'
API_KEY = 'your api_key here'
utc_now = str(int(time.time() * 1000))
headers = {
"x-merchant": MERCHANT,
"x-signature": sign_data(API_KEY, data.get('params') or {}, utc_now),
"x-utc-now-ms": utc_now
}
response = requests.post(url='https://api.any.money/', json=data, headers=headers)
PHP
<?php
function sign_data(string $key, array $data, string $utc_now) : string {
ksort($data);
$s = '';
foreach($data as $k=>$value) {
if (in_array(gettype($value), array('array', 'object', 'NULL')) ){
continue;
}
if(is_bool($value)){
$s .= $value ? "true" : "false";
} else {
$s .= $value;
}
}
$s .= $utc_now;
return hash_hmac('sha512', strtolower($s), $key);
}
$data = array(
"method" => "balance",
"params" => array("curr" => "BTC"),
"jsonrpc" => "2.0",
"id" => "1"
);
$MERCHANT = '1234';
$API_KEY = 'your api_key here';
$utc_now = strval(((int)round(microtime(true) * 1000)));
$data_string = json_encode($data);
$ch = curl_init('https://api.any.money/');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Content-Length: ' . strlen($data_string),
'x-merchant: ' . $MERCHANT,
'x-signature: ' . sign_data($API_KEY, $data['params'] ?: array(), $utc_now),
'x-utc-now-ms: ' . $utc_now)
);
$result = curl_exec($ch);
?>
Варианты ответа системы
Если запрос корректен, то по ключу "result" будет возвращен результат
выполнения метода в виде json-объекта.
Ответ метода
{
"result": {"UAH": "0"},
"id": "1",
"jsonrpc": "2.0",
}
- result
- результат выполнения метода
- id
- идентификатор запроса, на который получен данный ответ
- jsonrpc
- версия спецификации (всегда равен "2.0")
Иначе, по ключу "error" будет возвращен код, сообщение и данные
возникшей ошибки:
Ошибка
{
"error": {
"code": -32003,
"message": "EParamInvalid",
"data": {
"field": "externalid",
"value": "25"
}
},
"jsonrpc": "2.0",
"id": "R5822"
}
Возвращаемые в заголовках данные
- x-utc-now-ms
- время ответа, в миллисекундах (utc timestamp)
- x-signature
- хеш-подпись ответа