Download OpenAPI specification:Download
Описание API произведено в формате OpenAPI 3.0.0.
Взаимодействие с сервисом осуществляется по схеме запрос-ответ. Запросы отправляются в формате JSON методом POST. В качестве безопасного доступа к сервису во всех методах используется JWT-токен, он генерируется GET-запросом /public/login, параметр accessToken. Проект обладает свойством Идемпотентности. В случае сетевой ошибки ответ на дублированный запрос будет аналогичен первому. При этом, обработан дублированный запрос не будет. Идемпотентность обеспечивается за счет передачи в запросе уникального значения в заголовке x-req-id.
Статус | Описание | Финальный |
---|---|---|
CREATED | Заказ создан | Да |
DECLINED | Заказ отклонен | Да |
EXPIRED | Время актуальности заказа истекло | Да |
IN_PROCESS | Статус заказа не определен, неoбходимо запросить уточнение | Нет |
PAYOUT_IN_PROGRESS | Статус заказа не определен, неoбходимо запросить уточнение | Нет |
QRCDATA_IN_PROGRESS | Статус заказа не определен, неoбходимо запросить уточнение | Нет |
IPS_ACCEPTED | Успешная оплата по СБП | Да |
CHARGED | Средства списаны | Да |
QRCDATA_CREATED | Получение QR кода прошло успешно | Нет |
PAID | Выплата произведена | Да |
REFUNDED | Заказ возмещен | Да |
Уведомления (webhook, callback) предствляют собой POST запросы, отправляемые системой по факту изменения статуса заказа на адрес, указанный в параметре CallbackUrl метода order. Формат уведомлений соответствует ответу на запрос данных по заказу. Система будеет осуществлять повторные попытки отправки уведомлений до получения http-кода 200 или истечения тайм-лимита. В заголовке http запроса передается параметр payment-sign - подпись, результат подписи исходного тела нотификации (Body из http запроса) приватным ключом, в кодировке base64. Для валидации подписи необходимо использовать публичный ключ:
-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtlD5ORxXDUgnnD9Ri2IB
UcT2Ru1fMi9kub8errQdLaXdFRDZJ1mNHlMJx+CHkhM5GNkMmidAhPcYRs4h/yIb
YLiRSsR+Zl6krjcrEvrTIZ1BySNAxEuCzWGFM27Ef01xNOSPEgtptAmop6vRuaiS
ha2vB5rHN1hSks1td/7xDcFG+C4cnDsTYp39rUvSSMtkW6FCbBoxNPrNOSlZGykx
OFBhOYd/uOK4z/zFSy07f4rA32KNn3zJE5eb6tzNMRNa6lOL96x0OYzw/P6oaS5b
sugVehAM1TGBCzm4Xmz1VZVBhxd3V7VoJuf/0C0W2Yfer+E/G0s3DDWmjzqhbvrc
Eb0y1kOZn4Z39jswv5Bkk8NyqHfNe0dE4pX+dSnfhC/9J5xFZy/CknclEM/0waY8
36iYIy+MaRsQdWXjbvP1AVk/yq2RlXCaOnK7GPvxAP1qjcgt56cGUOks9H9X6lba
PcJd+KDWde1aZZJLUpxu7JDIVTruDy/KrxDtJYi7Mz40Y6pnsKXzPHzVr0km9LI9
zK1j24OS1RIbO2fMM9D2zNQnSUV//aR+/xb7W2UgL2L0GRl7nDzqQL2dLvStHG9O
yUtnH5R/hPuIZqIDZx1N52F1JwArfDY0j9t5suAqN0VXJe2N77cYJ0x2LDeg+rLl
KsdjLKRDtKpXormCUTs/V+0CAwEAAQ==
-----END PUBLIC KEY-----
Пример для проверки подписи при интеграции средствами openssl. В командной строке выполняем команду:
Декодируем base64:
certutil -decode catsign.txt sign.txt.dec
Проверяем подпись:
openssl dgst -sha1 -verify PublicStage.key -signature sign.txt.dec callback.txt
Где catsign.txt - подпись из заголовка Payment-Sign, PublicStage.key - публичный ключ, callback.txt - тело коллбека.
В случае успешной проверки будет сообщение Verified OK.
Проверка статуса заказа get обязательна по истечении срока жизни заказа. Через 30 мин после создания заказа отправка уведомления не гарантирована.
Сценарий с вводом карточных данных на PaymentForm не требует от ТСП соответствия требованиям безопасности PCIDSS, в отличие от сценария с вводом данных карты на стороне ТСП.
Открытие платежной формы осуществляется запросом POST по адресу:
https://payment.{domen}/{ExternalOrderID}
где payment - фиксированное значение
domen - адрес для отправки запросов
ExternalOrderID - номер заказа, полученный в ответе на метод создания платежной формы.
Открытие формы POST-запросом позволяет передать дополнительные параметры, такие как адрес для обратного редиректа по результату оплаты.
Для вызова формы с возможностью редиректа необходимо:
Использовать нативную html форму с методом POST
В action указать URL формы, поддерживающий функционал редиректов
Указать в двух скрытых полях (successUrl, failUrl) ссылки для редиректа
В enctype указать application/x-www-form-urlencoded
Отправить нативную форму стандартным вызовом submit (POST запрос с переходом)
Пример:
<form
action="https://payment.{domen}/{ExternalOrderID}"
method="POST"
enctype="application/x-www-form-urlencoded"
>
<input type="hidden" name="successUrl" value="https://domen.test/{ExternalOrderID}/success" placeholder="successUrl">
<input type="hidden" name="failUrl" value="https://domen.test/{ExternalOrderID}/fail" placeholder="failUrl">
<button type="submit">Оплатить</button>
</form>
login | string Логин (email) кассира в системе |
password | string пароль кассира в системе |
{- "login": "mail@email.com",
- "password": "Password123"
}
{- "success": true,
- "description": "login success",
- "accessToken": "string",
- "expiresAccess": "string",
- "refreshToken": "string",
- "expiresRefresh": "string"
}
tspId | integer <unit64> Id ТСП по которому проходит оплата |
dateFrom | string <date-time> дата начала периода отслеживания заказов |
dateTo | string <date-time> дата окончания периода отслеживания заказов |
status | string текущий статус заказа |
limit | number Limit count orders. Default 30 |
offset | number Offset of orders. Default 0 |
{- "success": true,
- "description": "string",
- "orders": [
- {
- "id": "string",
- "externalOrderId": "Order1",
- "merchantOrderId": "merchantOrderId232",
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z",
- "orderAmount": 100,
- "paymentAmount": 10000,
- "orderCurrency": "USD",
- "paymentCurrency": "RUB",
- "status": "string",
- "paymentType": "string",
- "partner": {
- "id": 0,
- "name": "string"
}, - "agent": {
- "id": 0,
- "name": "string"
}, - "merchant": {
- "id": 0,
- "name": "string"
}, - "tsp": {
- "id": 0,
- "name": "string"
}, - "cashier": {
- "id": 0,
- "name": "string"
}
}
], - "meta": {
- "totalCount": 0,
- "filters": [
- {
- "id": "status",
- "label": "Статус",
- "type": "select",
- "dropdownElements": [
- {
- "id": "status",
- "label": "Статус"
}
]
}, - {
- "id": "tspId",
- "label": "ТСП",
- "type": "select",
- "dropdownElements": [
- {
- "id": 1,
- "label": "TSPname"
}
]
}, - {
- "id": "date",
- "label": "Дата",
- "type": "date"
}
]
}
}
Создать заказ можно двумя способами
orderAmount
- Вы передаете сумму заказа в выбранной валюте.
- После создания сумма автоматически конвертируется в рубли, и платеж будет принят в рублях.
- Все комиссии включаются в итоговую сумму.
- Сумма должна быть указана в копейках (или в центах, евроцентах и т.д.). Например, если вы передаете значение 100 в
orderAmount
, итоговая сумма к оплате будет 100 плюс комиссии.
paymentAmount
- Сумма к оплате остается в рублях.
- Система конвертирует ее в валюту и вычитает комиссии.
- Сумма должна быть указана в копейках. Например, если вы передаете значение 100 в
paymentAmount
, сумма к оплате будет 100, а вorderAmount
будет зафиксирована сумма с учетом вычетов комиссий.
- Для создания заказа на выплату необходимо указать тип
PayOut
. Без этого типа вы не сможете продолжить создание заказа.- При создании заказа на прием (например, на продажу) тип можно не указывать; по умолчанию будет использован тип
PayIn
.
merchantOrderId | string идентификатор заказа продавца, может был заполнен номером заказа из системы продавца |
paymentAmount required | integer сумма, которую оплатит покупатель, передается в копейках |
orderCurrency required | string изначальная валюта заказа, доступные валюты USD, EUR, AED, THB, RUB, TRY |
paymentCurrency | string итоговая валюта заказа, в которой будет произведена оплата |
tspId required | integer Id ТСП по которому проходит оплата |
description | string описание заказа, поле для заметки по заказу |
callbackUrl | string адрес, на который будет отправлен коллбек |
{- "merchantOrderId": "merchantOrderId",
- "orderAmount": 100,
- "orderCurrency": "EUR",
- "tspId": 1,
- "description": "comment",
- "callbackUrl": "callback.com"
}
{- "success": true,
- "description": "",
- "order": {
- "id": "orderId",
- "merchantOrderId": "merchantOrderId",
- "orderAmount": 100,
- "paymentAmount": 10530,
- "orderCurrency": "EUR",
- "paymentCurrency": "RUB",
- "type": "payIn"
}
}
id required | integer Идентификатор заказа в системе |
{- "success": true,
- "description": "string",
- "order": {
- "id": "string",
- "externalOrderId": "Order1",
- "status": "string",
- "paymentInfo": {
- "qrc": {
- "qrcId": "string",
- "payload": "string"
}, - "rate": 0,
- "receipt": true,
- "paymentType": "IPS"
}, - "merchantOrderId": "string",
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z",
- "callbackUrl": "callback.com",
- "orderAmount": 0,
- "paymentAmount": 0,
- "orderCurrency": "string",
- "paymentCurrency": "string",
- "cashier": {
- "id": 0,
- "name": "string"
}, - "merchant": {
- "id": 0,
- "name": "string"
}, - "agent": {
- "id": 0,
- "name": "string"
}, - "partner": {
- "id": 0,
- "name": "string"
}, - "tsp": {
- "id": 0,
- "name": "string"
}
}
}
id required | integer Идентификатор заказа в системе |
amount | integer Сумма возврата в минимальных единицах валюты (копейках). Параметр опциональный. В случае отсутствия возврат производится на полную сумму. |
{- "amount": 300
}
{- "success": true,
- "description": "string",
- "order": {
- "id": "string",
- "status": "Refunded"
}
}
id required | integer Идентификатор заказа в системе |
{- "success": true,
- "description": "string",
- "order": {
- "qrcId": "string",
- "payload": "string",
- "externalOrderId": "string"
}
}
id required | integer |
BackUrl | string Адрес для перенаправления после оплаты |
phoneNumber | string Номер телефона для отправки пуш уведомления для перехода в СБОЛ |
{- "deepLink": "android-app://ru.testbankmobile/main",
- "phoneNumber": "+79876543210"
}
{- "succes": true,
- "description": "string",
- "order": {
- "deepLink": "string",
- "formUrl": "string",
- "externalOrderId": "string"
}
}
для создания выплаты order обязательно должен быть создан с параметром type PayOut. При получении статуса IN_PROCESS неoбходимо запросить уточнение
id required | integer |
pan required | string номер карты получателя |
holder | string Имя и Фамилия получателя |
phone | string номер телефона получателя |
{- "pan": 4189732800687140,
- "holder": "Ivan Ivanov",
- "phone": 79998887766
}
{- "success": true,
- "description": "",
- "order": {
- "externalOrderId": "externalOrderId",
- "status": "PAID",
- "authCode": "string",
- "rrn": "string"
}
}
для открытия платежной формы необходимо вызвать ее с полученным в ответе externalOrderId
id required | integer Идентификатор заказа в системе |
tspCode required | string Код ТСП в системе |
{- "id": "string",
- "externalOrderId": "string"
}
Для карточных операций типа PayIn необходимо первым шагом создать order методом POST /order, после получения id нужно получить externalOrderId методом /form. В дальнейших запросах externalOrderId должен передаваться в поле OrderId.
OrderId required | string Индекс заказа в Payment API |
{- "OrderId": "ExternalOrderId"
}
{- "Response": {
- "Success": true
}, - "Order": {
- "OrderId": "ExternalOrderId",
- "MerchantOrderId": "id",
- "ShopId": 123,
- "Currency": "RUB",
- "Amount": 300,
- "Status": "CHARGED"
}, - "Charge": {
- "rrn": "123456789"
}
}
Для карточных операций типа PayIn необходимо первым шагом создать order методом POST /order, после получения id нужно получить externalOrderId методом /form. В дальнейших запросах externalOrderId должен передаваться в поле OrderId.
OrderId required | string Индекс заказа в Payment API |
{- "OrderId": "ExternalOrderId"
}
{- "Response": {
- "Success": true
}, - "Order": {
- "OrderId": "ExternalOrderId",
- "MerchantOrderId": "id",
- "Currency": "RUB",
- "ShopId": 123,
- "Amount": 300,
- "Status": "VOIDED"
}, - "Void": {
- "rrn": "123456789"
}
}