# Основные принципы
# Точки входа
Боевое (production) окружение для авторизации: https://accounts.mandarinbank.com/ (opens new window) Боевое (production) окружение для запросов: https://api.psp.io/ (opens new window)
# Аутентификация запросов
Каждый запрос должен быть аутентифицирован с помощью токена (access_token
), полученного в соответствии с протоколом OAuth 2.0 для приложений.
Токен действует в течение 36 000 секунд (10 часов). Если срок действия истек, токен нужно запросить еще раз.
Запрос на получение токена
Включает в себя обязательные form-data параметры, которые передаются в теле запроса (параметры application.client_id
и application.client_secret
неизменны для приложения и хранятся на стороне клиента).
Параметр | Описание | Пример |
---|---|---|
grant_type | Грант авторизации (всегда равен client_credentials ). | client_credentials |
client_id | Идентификатор клиента (равен значению application.client_id , предоставленному Mandarin). | VvPtlhcyldKtkuoUWY42 pErdrj4er2AwFoBWrn8n |
client_secret | Секретный ключ-пароль клиента (равен значению application.client_secret , предоставленному Mandarin). | uQfOIMsltZYL8x3XMqUGP5 iFM59PyFnKlN0UmD3Ihre2 Ry3AGazUAv5jPdUI4dBJqV 0Of6b9GFvWvzGahYnq2aVV xkxn9n4qWF57FP0C01Kp6l EtajhfYv3UZ2f4pAZ7 |
scope | Запрашиваемые скоупы (области доступа): например, transactions.read - "Чтение транзакций". Разделитель - пробел. Запрашивать можно любой список скоупов, при этом в ответе вернется тот список запрошенных скоупов, который может быть предоставлен для данного приложения. | transactions.read |
curl --location --request POST 'https://accounts.mandarinbank.com/oauth/token/' \
--form 'grant_type=client_credentials' \
--form 'client_id=VvPtlhcyldKtkuoUWY42pErdrj4er2AwFoBWrn8n' \
--form 'client_secret=uQfOIMsltZYL8x3XMqUGP5iFM59PyFnKlN0UmD3Ihre2Ry3AGazUAv5jPdUI4dBJqV0Of6b9GFvWvzGahYnq2aVVxkxn9n4qWF57FP0C01Kp6lEtajhfYv3UZ2f4pAZ7' \
--form 'scope=transactions.read'
Ответ
Параметр | Описание | Пример |
---|---|---|
access_token | Токен (ключ доступа). | VnuxZiW14mXBedDeZO7d W7GBmzPxMn |
expires_in | Срок действия токена (в секундах). Всегда равен 36 000 секунд (10 часов). | 36000 |
token_type | Тип токена (всегда равен Bearer ). | Bearer |
scope | Разрешенные скоупы (области доступа): например, transactions.read - "Чтение транзакций". Разделитель - пробел. Запрашивать можно любой список скоупов, при этом в ответе вернется тот список запрошенных скоупов, который может быть предоставлен для данного приложения. | transactions.read |
{
"access_token": "VnuxZiW14mXBedDeZO7dW7GBmzPxMn",
"expires_in": 36000,
"token_type": "Bearer",
"scope": "transactions.read"
}
Использование токена
Указывается в headers каждого запроса, в поле Authorization
, после зарезервированного слова Bearer
.
Authorization:Bearer VnuxZiW14mXBedDeZO7dW7GBmzPxMn
# Принципы работы
API реализовано в соответствии с принципами REST API.
API оперирует ресурсами, которые представляют сущности - объекты бизнес-логики (бизнес-модели, доме́нные модели, модели предметной области). Существует два основных типа ресурсов: ресурс коллекции и ресурс сущности.
Ресурсы коллекций названы во множественном числе, например: /transactions
.
Ресурс сущности — это ресурс конкретной сущности в какой-то коллекции. Доступ к нему осуществляется всегда через ресурс коллекции и по уникальному номеру, например:
/transactions/{{id}}
API использует JSON как для ответов, так и для запросов (если это применимо). Ответы API стандартизированы.
Ответы ресурсов коллекции всегда содержат поле, названное так же, как и сам
ресурс, и содержащее массив бизнес моделей. Если в ответ на запрос данных нет,
то массив будет пустой. Например, если это ответ ресурса /transactions
, то
ответ будет такой:
{
"transactions": [
{ {{transaction_model}} },
{ ... },
{ ... }
]
}
Допустимые параметры запроса:
filter_by
- выборка по заданным полям и условиям;sort_by
- список полей (через запятую) для сортировки в порядке “по убыванию” (добавив минус-
перед названием поля, можно переключить порядок сортировки на “по возрастанию”). По умолчанию отсортирован поid
;limit_to
- ограничить количество сущностей, выдаваемое за один раз; число, по умолчанию 50;cursor
- используется для получения следующей/предыдущей части выдачи, имеет приоритет над остальными запросами, то есть, если передаётсяcursor
, то остальные параметры игнорируются.
Параметр filter_by
формируется следующим образом: список полей и значений, по
которому нужно отфильтровать сущности, операторы сравнения (=
, >
, >=
, <
, <=
, возможно использование оператора IN
), фильтры объединяются знаком амперсанда: &
(который обозначает логический оператор AND
).
Формируется следующая строка:
field_name1=value1&field_name2 in value2_1,value2_2&field_name3>=value3_1&field_name3<value3_2
Например, mw_type=transaction&opcode in 1,3&updated>=2019-10-01&updated<2019-10-31
.
После чего эта строка URL-энкодится и передаётся как значение
параметра filter_by
:
?filter_by=mw_type%3Dtransaction%26opcode%20in%201%2C3%26updated%3E%3D2019-10-01%26updated%3C2019-10-31
Параметры верхнего уровня sort_by
и limit_to
и их значения не URL-энкодятся.
Пример результирующего query-string
:
?filter_by=mw_type%3Dtransaction%26opcode%20in%201%2C3%26updated%3E%3D2019-10-01%26updated%3C2019-10-31&sort_by=-opcode&limit_to=100
Ответы ресурсов коллекции всегда содержат вложенный объект пагинации (курсор). Объект курсора всегда содержит поля:
count
- количество сущностей в текущем ответе.total
- общее количество сущностей по данному запросу (с такими фильтрами и т.д.).next
- указатель на следующую страницу выдачи (null
, если такая страница не существует).prev
- указатель на предыдущую страницу выдачи (null
, если такая страница не существует).
Пример запроса, который вернет первые 100 сущностей:
GET /transactions?filter_by=mw_type%3Dtransaction%26opcode%20in%201%2C3%26updated%3E%3D2019-10-01%26updated%3C2019-10-31&sort_by=-opcode&limit_to=100
{
"transactions": [ ... ],
"cursor": {
"count": 100,
"next": "aad0f17a6af11672",
"prev": "f0bb6887c3b2f501",
"total": 4200
}
}
Пример запроса для получения последующих 100 сущностей (в параметр cursor
подставлено значение из поля ответа next
):
GET /transactions?cursor=aad0f17a6af11672
Ответы ресурсов сущностей всегда содержат поле, названное так же, как и сам ресурс, но в единственном числе, например:
GET /transactions/12345
{
"transactions": {
{{transaction_model}}
}
}