Authentication
Образец кода:
require 'api-auth'
require 'rest-client'
headers = {
'Content-MD5' => "e59ff97941044f85df5297e1c302d260",
'Content-Type' => "application/json",
'Date' => "Mon, 23 Jan 1984 03:29:56 GMT"
}
@request = RestClient::Request.new(url: "https://api.exchanger.money/v1/crypto/offers",
:headers => headers,
:method => :post)
@signed_request = ApiAuth.sign!(@request, @access_id, @secret_key, digest: 'sha256')
@headers = {
'Content-MD5' => "e59ff97941044f85df5297e1c302d260",
'Content-Type' => "application/json",
'Date' => "Mon, 23 Jan 1984 03:29:56 GMT",
'Authorization' => @signed_request
}
public class HmacClientHandler : DelegatingHandler
{
private readonly string _applicationId;
private readonly string _secretKey;
public HmacClientHandler(string appId, string secretKey)
{
_applicationId = appId;
_secretKey = secretKey;
}
protected async override Task<HttpResponseMessage>
SendAsync(HttpRequestMessage request,
CancellationToken cancellationToken)
{
HttpResponseMessage response = null;
string url = Uri.EscapeUriString(request.RequestUri.AbsolutePath.ToLowerInvariant());
string methodName = request.Method.Method;
DateTime timestamp = DateTime.UtcNow;
string contentType = methodName.Equals("GET") ? string.Empty : "application/json; charset=utf-8";
string contentMd5 = string.Empty;
if (request.Content != null)
{
byte[] content = await request.Content.ReadAsByteArrayAsync();
MD5 md5 = MD5.Create();
byte[] contentMd5Hash = md5.ComputeHash(content);
contentMd5 = Convert.ToBase64String(contentMd5Hash);
request.Content.Headers.ContentMD5 = contentMd5Hash;
}
//plain string = 'http method,content-type,content-MD5,request URI,timestamp'
string authenticationKeyString = string.Format("{0},{1},{2},{3},{4}", methodName, contentType, contentMd5, url, timestamp.ToString("R"));
byte[] secretKeByteArray = Encoding.UTF8.GetBytes(_secretKey);
using (HMACSHA256 hmac = new HMACSHA256(secretKeByteArray))
{
byte[] authenticationKeyBytes = Encoding.UTF8.GetBytes(authenticationKeyString);
byte[] authenticationHash = hmac.ComputeHash(authenticationKeyBytes);
string hashedBase64String = Convert.ToBase64String(authenticationHash);
request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("APIAuth-HMAC-SHA256", string.Format("{0}:{1}", _applicationId, hashedBase64String));
request.Headers.Date = timestamp;
}
response = await base.SendAsync(request, cancellationToken);
return response;
}
}
HOST=https://api.exchanger.money
URI=/v1/crypto/offers
UUID=SOME_ACCESS_ID
SECRET_KEY=SOMEKEY
CONTENT_TYPE=application/json
DATE=$(TZ=GMT date "+%a, %d %b %Y %T %Z")
curl -H "Content-Type: $CONTENT_TYPE" -H "Authorization: APIAuth-HMAC-SHA256 $UUID:$(echo -n "GET,$CONTENT_TYPE,,$URI,$DATE" | openssl dgst -sha256 -binary -hmac $SECRET_KEY "$@" | base64)" -H "Date: $DATE" "$HOST$URI"
Для работы с сервисом необходимо иметь пару ключей: access_id и private_key. access_id - используюется для идентификации пользователя, а private_key для подписывания запроса.
Content-MD5 = "md5 хэш тела содержимого запроса"
Date = дата и время запроса в формате Mon, 23 Jan 1984 03:29:56 GMT
Authorization = APIAuth-HMAC-SHA256 'access_id':'signature'
где signature - Base64( HMAC-SHA256( private_key, UTF-8-Encoding-Of( StringToSign ) ) )
StringToSign - http method,content-type,content-MD5,request URI,timestamp
Crypto
Create Purse
Ответ сервиса
{
"purse": "созданный адрес"
}
Образец кода:
Создает новый кошелек (криптографический адрес) для аккаунта пользователя в заданной валюте.
HTTP Request
POST https://api.exchanger.money/v1/purses/<currency>/
Query Parameters
Параметр | Описание |
---|---|
currency | Криптовалюта. Доступные значения: eth, btc, bch, btg, ltc, xmr, xrp, dash, iota |
Possible Errors
Код ошибки | Описание |
---|---|
404 | Not found -- Если передана неверная криптовалюта. |
Balance
Ответ сервиса
{
"balance": "баланс на кошельке"
}
Образец кода:
Метод возвращает баланс на кошельке в заданной валюте
HTTP Request
GET https://api.exchanger.money/v1/crypto/purses/<currency>/balance/
Query Parameters
Параметр | Описание |
---|---|
currency | Криптовалюта. Доступные значения: eth, btc, bch, btg, ltc, xmr, xrp, dash, iota |
Possible Errors
Код ошибки | Описание |
---|---|
404 | Not Found -- Если передана неизвестная валюта. |
Offers List
Ответ сервиса
[
{
"id": "идентификатор предложения",
"direction": "направление обмена",
"provider": "Система денежных переводов",
"details": {
"bank_name": "Название банка, если provider - cards или wire"
},
"state": "статус предложения",
"min_amount": "минимальная сумма сделки",
"max_amount": "максимальная сумма сделки",
"rate": "курс",
"description": "дополнительные условия",
"user": {
"rating": "рейтинг пользователя"
},
"is_owner": "флаг, показывающий является ли пользователь создателем этого предложения"
}
]
Образец кода:
Метод возвращает список предложений по заданному направлению обмена и системе денежных переводов
HTTP Request
GET https://api.exchanger.money/v1/crypto/offers/<direction>/<provider>
Query Parameters
Параметр | Описание |
---|---|
direction | Направление обмена |
provider | Система денежных переводов |
page | Номер страницы для пагинации |
Possible Errors
Код ошибки | Описание |
---|---|
404 | Not Found -- Если передано неизвестное направление обмена или система денежных переводов. |
Offers Info
Ответ сервиса
{
"id": "идентификатор предложения",
"direction": "направление обмена",
"provider": "Система денежных переводов",
"details": {
"bank_name": "Название банка, если provider - cards или wire"
},
"state": "статус предложения",
"min_amount": "минимальная сумма сделки",
"max_amount": "максимальная сумма сделки",
"rate": "курс",
"description": "дополнительные условия",
"user": {
"rating": "рейтинг пользователя"
},
"is_owner": "флаг, показывающий является ли пользователь создателем этого предложения"
}
Образец кода:
Метод возвращает информацию по предложению
HTTP Request
GET https://api.exchanger.money/v1/crypto/offers/<id>/
Query Parameters
Параметр | Описание |
---|---|
id | Идентификатор предложения |
Possible Errors
Код ошибки | Описание |
---|---|
404 | Not Found -- Если предложение не найдено. |
Offers Create
Ответ сервиса
{
"id": "идентификатор предложения",
"direction": "направление обмена",
"provider": "Система денежных переводов",
"details": {
"bank_name": "Название банка, если provider - cards или wire"
},
"state": "статус предложения",
"min_amount": "минимальная сумма сделки",
"max_amount": "максимальная сумма сделки",
"rate": "курс",
"description": "дополнительные условия",
"user": {
"rating": "рейтинг пользователя"
},
"is_owner": "флаг, показывающий является ли пользователь создателем этого предложения"
}
Образец кода:
Метод создает новое предложение
HTTP Request
POST https://api.exchanger.money/v1/crypto/offers/
Query Parameters
Параметр | Описание |
---|---|
direction | направление обмена |
provider | система денежных переводов |
rate_type | тип курса (фиксированный, плавающий) |
rate | курс |
min_amount | минимальная сумма |
max_amount | максимальная сумма |
money_purse | куда переводить фиат (только для yandex, qiwi, skrill, paypal, alipay, wechat) |
card_number | номер банковской карты (только для cards) |
bank_name | банк (только для cards, wire) |
bank_details | информация о счете (только для wire) |
description | дополнительные условия сделки |
адрес электронной почты для связи | |
working_hours | рабочие часы (в остальное время предложение не будет видно) |
Possible Errors
Код ошибки | Описание |
---|---|
400 | Bad Request -- Ошибка валидации. |
Offers Update
Ответ сервиса
{
"id": "идентификатор предложения",
"direction": "направление обмена",
"provider": "Система денежных переводов",
"details": {
"bank_name": "Название банка, если provider - cards или wire"
},
"state": "статус предложения",
"min_amount": "минимальная сумма сделки",
"max_amount": "максимальная сумма сделки",
"rate": "курс",
"description": "дополнительные условия",
"user": {
"rating": "рейтинг пользователя"
},
"is_owner": "флаг, показывающий является ли пользователь создателем этого предложения"
}
Образец кода:
Метод обновляет данные предложения
HTTP Request
PATCH https://api.exchanger.money/v1/crypto/offers/
Query Parameters
Параметр | Описание |
---|---|
rate_type | тип курса (фиксированный, плавающий) |
rate | курс |
min_amount | минимальная сумма |
max_amount | максимальная сумма |
money_purse | куда переводить фиат (только для yandex, qiwi, skrill, paypal, alipay, wechat) |
card_number | номер банковской карты (только для cards) |
bank_name | банк (только для cards, wire) |
bank_details | информация о счете (только для wire) |
description | дополнительные условия сделки |
адрес электронной почты для связи | |
working_hours | рабочие часы (в остальное время предложение не будет видно) |
Possible Errors
Код ошибки | Описание |
---|---|
400 | Bad Request -- Ошибка валидации. |
Offers Delete
Ответ сервиса
Образец кода:
Метод удаляет предложение
HTTP Request
DELETE https://api.exchanger.money/v1/crypto/offers/<id>/
Query Parameters
Параметр | Описание |
---|---|
id | Идентификатор предложения |
Possible Errors
Код ошибки | Описание |
---|---|
404 | Not Found -- Если предложение не найдено. |
Errors
Error Code | Meaning |
---|---|
400 | Bad Request -- Your request is invalid. |
401 | Unauthorized -- Your API key is wrong. |
403 | Forbidden -- The requested info is hidden for administrators only. |
404 | Not Found -- The specified info could not be found. |
405 | Method Not Allowed -- You tried to access API with an invalid method. |
406 | Not Acceptable -- You requested a format that isn't json. |
410 | Gone -- The requested info has been removed from our servers. |
418 | I'm a teapot. |
429 | Too Many Requests -- There are too many requests! Slow down! |
500 | Internal Server Error -- We had a problem with our server. Try again later. |
503 | Service Unavailable -- We're temporarily offline for maintenance. Please try again later. |