Общие сведения
Payout API — это универсальное API для выплат денежных средств от юридических лиц. Среди возможных инструментов выплат доступны:
- Банковские карты
- Система быстрых платежей (СБП)
- Прочие инструменты
Обзор API
Выплатное API построено на архитектуре REST, где данные и функциональные возможности считаются ресурсами, доступ к которым осуществляется с помощью универсальных идентификаторов ресурсов (URI).
Ресурсы обрабатываются с помощью набора простых, четко определенных операций. Клиенты и серверы обмениваются представлениями ресурсов, используя стандартизированный интерфейс и HTTP протокол.
Используемые HTTP методы
- GET — методы для получения информации о существующих объектах.
- PUT — методы для создания новых объектов, с присвоением идентификатора на стороне клиента.
- POST — методы, производящие действие над существующими объектами.
Формат данных
Ресурсы представляются в виде JSON объектов, при создании которых (HTTP метод PUT) необходимо указывать Content-Type: application/json
в заголовках запроса.
Способы передачи данных
- path — как элемент URI запроса. Однозначно определяет ресурс, с которым происходит взаимодействие (идентификатор партнера, выплаты и т.п.).
- query - как параметр запроса. Определяет специфичность типа запроса, например, параметры для постраничного вывода.
- header - как заголовок запроса. Определяет дополнительные параметры запроса, например, подпись запроса.
- body - как тело запроса, представленного в виде JSON объекта. Определяет детали создаваемого ресурса, применимо только для HTTP метода PUT.
Идемпотентность
Большинство методов обеспечивают физическую или логическую идемпотентность, т.е. многократное повторение действия эквивалентно однократному. Несмотря на то, что идемпотентные операции производят один и тот же результат на сервере, ответ сам по себе может не быть тем же самым (например, состояние ресурса может измениться между запросами).
Авторизация
В рамках технического взаимодействия доступен только один вид авторизации:
- С помощью Bearer токена
Авторизация с помощью Bearer токена
GET /partner/payout/v2/agents/acme/providers HTTP/1.1
Accept: application/json
Authorization: Bearer <Token-Value>
Host: b2b-api.qiwi.com
curl -X GET \
-H "Authorization: Bearer <Token-Value>" \
https://b2b-api.qiwi.com/partner/payout/v2/agents/acme/providers
При данном типе авторизации все запросы партнера, при вызовах методов, авторизуются по известному только партнеру значению Bearer токена.
Токен указывается в HTTP-заголовке Authorization с префиксом Bearer, согласно спецификации RFC 6750. Например: Authorization: Bearer <Token-Value>.
Версионирование
В универсальном выплатном API Payout поддерживается версионирование методов. URL для вызова метода содержит суффикс, определяющий требуемую версию метода:
https://b2b-api.qiwi.com/partner/payout/v<version>/<method>
На текущий момент поддерживается две версии API Payout — 1
и 2
. Актуальной текущей редакцией протокола выплат является 2
версия. В описании методов явно указываются версии API для использования.
Точки доступа к API
Тестовая среда
Для вызовов методов API в тестовой среде, в зависимости от типа шифрования и способа авторизации, используются следующие точки доступа:
Шифрование | Авторизация | Точка доступа |
---|---|---|
RSA | Токен | https://b2b-api-test.qiwi.com/ |
Производственная среда
Для вызовов методов API в производственной среде, в зависимости от типа шифрования и способа авторизации, используются следующие точки доступа:
Шифрование | Авторизация | Точка доступа |
---|---|---|
RSA | Токен | https://b2b-api.qiwi.com/ |
Сервисные методы
Методы для работы со списком доступных провайдеров для выплат, их параметрами, лимитами, а также получения баланса агента.
Баланс основного счета
GET /partner/payout/v2/agents/acme/balance HTTP/1.1
Accept: application/json
Authorization: Bearer <Token-Value>
Host: b2b-api.qiwi.com
curl -X GET \
-H "Authorization: Bearer <Token-Value>" \
https://b2b-api.qiwi.com/partner/payout/v2/agents/acme/balance
Используется для получения текущего баланса основного счета.
HTTP метод: | GET |
URI ресурса: | /partner/payout/v2/agents/{agentId}/balance |
Параметры
Параметр | Положение | ✓\× | Тип | Описание |
---|---|---|---|---|
agentId | path | ✓ | string | Уникальный идентификатор агента |
Ответ
Ответ
HTTP/1.1 200 OK
Content-Type: application/json
{
"balance": {
"currency": "RUB",
"value": "1000000.00"
},
"overdraft": {
"currency": "RUB",
"value": "500000.00"
},
"available": {
"currency": "RUB",
"value": "1500000.00"
}
}
Успешный ответ содержит текущий баланс основного счета в виде объекта Balance.
Ответ с HTTP кодом ошибки (4xx
, 5xx
) содержит объект Error, для подробной информации следует обратиться к разделу Обработка ошибок.
Баланс всех счетов
GET /partner/payout/v2/agents/acme/balances HTTP/1.1
Accept: application/json
Authorization: Bearer <Token-Value>
Host: b2b-api.qiwi.com
curl -X GET \
-H "Authorization: Bearer <Token-Value>" \
https://b2b-api.qiwi.com/partner/payout/v2/agents/acme/balances
Используется для получения текущих балансов всех счетов.
HTTP метод: | GET |
URI ресурса: | /partner/payout/v2/agents/{agentId}/balances |
Параметры
Параметр | Положение | ✓\× | Тип | Описание |
---|---|---|---|---|
agentId | path | ✓ | string | Уникальный идентификатор агента |
Ответ
Ответ
HTTP/1.1 200 OK
Content-Type: application/json
{
"RUB": {
"balance": {
"currency": "RUB",
"value": "1000000.00"
},
"available": {
"currency": "RUB",
"value": "1000000.00"
}
}
}
Успешный ответ содержит набор балансов всех счетов в виде отношения Currency и Balance.
Ответ с HTTP кодом ошибки (4xx
, 5xx
) содержит объект Error, для подробной информации следует обратиться к разделу Обработка ошибок.
Список провайдеров
GET /partner/payout/v2/agents/acme/providers HTTP/1.1
Accept: application/json
Authorization: Bearer <Token-Value>
Host: b2b-api.qiwi.com
curl -X GET \
-H "Authorization: Bearer <Token-Value>" \
https://b2b-api.qiwi.com/partner/payout/v2/agents/acme/providers
Используется для получения списка доступных провайдеров для выплат.
HTTP метод: | GET |
URI ресурса: | /partner/payout/v2/agents/{agentId}/providers |
Параметры
Параметр | Положение | ✓\× | Тип | Описание |
---|---|---|---|---|
agentId | path | ✓ | string | Уникальный идентификатор агента |
Ответ
Ответ
HTTP/1.1 200 OK
Content-Type: application/json
[
{
"providerCode": "bank-card-russia",
"name": "Банковские карты РФ"
}
]
Успешный ответ содержит последовательный массив элементов провайдеров объекта Provider.
Ответ с HTTP кодом ошибки (4xx
, 5xx
) содержит объект Error, для подробной информации следует обратиться к разделу Обработка ошибок.
Информация о провайдере
GET /partner/payout/v2/agents/acme/providers/bank-card-russia HTTP/1.1
Accept: application/json
Authorization: Bearer <Token-Value>
Host: b2b-api.qiwi.com
curl -X GET \
-H "Authorization: Bearer <Token-Value>" \
https://b2b-api.qiwi.com/partner/payout/v2/agents/acme/providers/bank-card-russia
Используется для получения расширенной информации о провайдере.
HTTP метод: | GET |
URI ресурса: | /partner/payout/v2/agents/{agentId}/providers/{providerCode} |
Параметры
Параметр | Положение | ✓\× | Тип | Описание |
---|---|---|---|---|
agentId | path | ✓ | string | Уникальный идентификатор агента |
providerCode | path | ✓ | ProviderCode | Уникальный идентификатор провайдера |
Ответ
Ответ
HTTP/1.1 200 OK
Content-Type: application/json
{
"name": "Выплаты на банковские карты",
"legalName": "",
"amountLimits": {
"RUB": {
"min": "1.00",
"max": "600000.00"
}
},
"parameters": [
{
"extKey": "pan",
"required": true,
"description": "Немаскированный PAN карты",
"validationPattern": "7\\d{10}"
}
],
"inn": "3111453720",
"contactDetails": {
"address": "адрес",
"phoneNumber": "8-800-111-22-33"
}
}
Успешный ответ содержит расширенную информацию о провайдере в виде объекта ProviderInfo.
Ответ с HTTP кодом ошибки (4xx
, 5xx
) содержит объект Error, для подробной информации следует обратиться к разделу Обработка ошибок.
Платежные методы
Методы для работы с платежами, в том числе создание, проведение и получение информации о платеже.
Создание платежа
PUT /partner/payout/v2/agents/acme/payments/0123456789 HTTP/1.1
Accept: application/json
Content-Type: application/json
Authorization: Bearer <Token-Value>
Signature: <Sign-Value>
Host: b2b-api.qiwi.com
{
"amount": {
"value": "2.00",
"currency": "RUB"
},
"recipientDetails": {
"providerCode": "bank-card-russia",
"fields": {
"pan": "1234567890213456"
}
},
"webhookUrl": "https://acme.inc/webhook",
"customFields": {
"user": "Wile E. Coyote"
}
}
curl -X PUT \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <Token-Value>" \
-H "Signature: <Sign-Value>" \
https://b2b-api.qiwi.com/partner/payout/v2/agents/acme/payments/0123456789 \
-d '{
"amount": {
"value": "2.00",
"currency": "RUB"
},
"recipientDetails": {
"providerCode": "bank-card-russia",
"fields": {
"pan": "1234567890213456"
}
},
"webhookUrl": "https://acme.inc/webhook",
"customFields": {
"user": "Wile E. Coyote"
}
}'
Используется для создания нового платежа.
HTTP метод: | PUT |
URI ресурса: | /partner/payout/v2/agents/{agentId}/payments/{paymentId} |
Параметры
Параметр | Положение | ✓\× | Тип | Описание |
---|---|---|---|---|
agentId | path | ✓ | string | Уникальный идентификатор агента |
paymentId | path | ✓ | string | Уникальный идентификатор платежа от 1 до 36 символов |
Signature | header | ✓ | string | Подпись платежного запроса |
payload | body | ✓ | PaymentPayload | Параметры создаваемого платежа |
Ответ
Ответ
HTTP/1.1 200 OK
Content-Type: application/json
{
"paymentId": "0123456789",
"creationDateTime": "2023-01-17T15:05:51+03:00",
"expirationDateTime": "2023-01-17T15:35:51+03:00",
"status": {
"value": "READY",
"changedDateTime": "2023-01-17T15:05:51+03:00"
},
"amount": {
"currency": "RUB",
"value": "2.00"
},
"recipientDetails": {
"providerCode": "bank-card-russia",
"fields": {
"pan": "1234567890213456"
}
},
"commission": {
"currency": "RUB",
"value": "0.04"
},
"webhookUrl": "https://acme.inc/webhook",
"customFields": {
"user": "Wile E. Coyote"
}
}
Успешный ответ содержит информацию по созданному платежу в виде объекта Payment.
Ответ с HTTP кодом ошибки (4xx
, 5xx
) содержит объект Error, для подробной информации следует обратиться к разделу Обработка ошибок.
Подпись платежного запроса
При создании платежа партнер должен подписать запрос и передать значение подписи в заголовке Signature
.
Чтобы подписать запрос, необходимо выполнить действия:
- Создать пару ключей с помощью алгоритма RSA-2048.
- Передать публичный ключ, соответствующий секретному ключу.
- Подписывать каждый запрос создания платежа.
Шаги 1 и 2 выполняются разово, шаг 3 — каждый раз при создании запроса.
Создание пары ключей
- Сгенерируйте закрытый ключ
openssl genrsa -out private-key.pem 2048
- Получите открытый ключ, соответствующий закрытому
openssl rsa -in private-key.pem -pubout -out public-key.pem
Создание пары ключей выполняется с помощью утилиты OpenSSL.
-
Сгенерируйте закрытый ключ. Размер закрытого ключа — строго 2048 бит, формат — PEM.
В папке выполнения команды будет создан файл с секретным ключом:
private-key.pem
. -
Получите открытый ключ, соответствующий закрытому.
Передача публичного ключа
Партнёр должен передать QIWI ключ, полученный на шаге 2 создания пары ключей. Способ передачи ключа необходимо уточнить у курирующего менеджера.
Вычисление подписи для запроса
- Сформируйте строку для подписи
SIGNATURE_STRING='{agentId}|{paymentId}|{amount.value}|{amount.currency}|{recipientDetails.providerCode}|{значения recipientDetails.fields в алфавитном порядке ключей}'
- Сформируйте цифровую подпись
SIGNATURE_RAW=$(echo -n $SIGNATURE_STRING | openssl dgst -sha256 -sign private-key.pem)
- Закодируйте полученную цифровую подпись
SIGNATURE_BASE64=$(echo -n $SIGNATURE_RAW | base64)
- Сформируйте строку для подписи со значениями выбранных параметров запроса (используйте разделитель
|
для соединения параметров):agentId
paymentId
amount.value
amount.currency
recipientDetails.providerCode
- значения
recipientDetails.fields
в алфавитном порядке ключей.
Можно использовать подготовленные шаблоны строк для подписи, которые для каждого провайдера индивидуальны.
- Сформируйте цифровую подпись с помощью алгоритма SHA256withRSA и секретного ключа
private-key.pem
, полученного на этапе Создание пары ключей. - Закодируйте полученную цифровую подпись при помощи Base64 в строку.
- Передайте закодированную цифровую подпись в заголовке
Signature
при отправке запроса.
Проведение платежа
POST /partner/payout/v2/agents/acme/payments/0123456789/execute HTTP/1.1
Accept: application/json
Authorization: Bearer <Token-Value>
Host: b2b-api.qiwi.com
curl -X POST \
-H "Authorization: Bearer <Token-Value>" \
https://b2b-api.qiwi.com/partner/payout/v2/agents/acme/payments/0123456789/execute
Используется для проведения платежа.
HTTP метод: | POST |
URI ресурса: | /partner/payout/v2/agents/{agentId}/payments/{paymentId}/execute |
Параметры
Параметр | Положение | ✓\× | Тип | Описание |
---|---|---|---|---|
agentId | path | ✓ | string | Уникальный идентификатор агента |
paymentId | path | ✓ | string | Уникальный идентификатор платежа от 1 до 36 символов |
Ответ
Ответ
HTTP/1.1 200 OK
Content-Type: application/json
{
"paymentId": "0123456789",
"creationDateTime": "2023-01-17T15:05:51+03:00",
"expirationDateTime": "2023-01-17T15:35:51+03:00",
"status": {
"value": "COMPLETED",
"changedDateTime": "2023-01-17T15:06:00+03:00"
},
"amount": {
"currency": "RUB",
"value": "2.00"
},
"recipientDetails": {
"providerCode": "bank-card-russia",
"fields": {
"pan": "1234564543654321"
}
},
"commission": {
"currency": "RUB",
"value": "0.04"
},
"webhookUrl": "https://acme.inc/webhook",
"customFields": {
"user": "Wile E. Coyote"
}
}
Успешный ответ содержит информацию по проведенному платежу в виде объекта Payment.
Ответ с HTTP кодом ошибки (4xx
, 5xx
) содержит объект Error, для подробной информации следует обратиться к разделу Обработка ошибок.
Список платежей
GET /partner/payout/v2/agents/acme/payments HTTP/1.1
Accept: application/json
Authorization: Bearer <Token-Value>
Host: b2b-api.qiwi.com
curl -X GET \
-H "Authorization: Bearer <Token-Value>" \
https://b2b-api.qiwi.com/partner/payout/v2/agents/acme/payments
Используется для получения списка последних платежей. Без указания фильтров from
и to
поиск платежей осуществляется за последние 50 дней.
HTTP метод: | GET |
URI ресурса: | /partner/payout/v2/agents/{agentId}/payments |
Параметры
Параметр | Положение | ✓\× | Тип | Описание |
---|---|---|---|---|
agentId | path | ✓ | string | Уникальный идентификатор агента |
limit | query | × | integer | Ограничение на число платежей, возвращаемое в ответе, по умолчанию 20 |
offset | query | × | integer | Число платежей, которое надо пропустить, по умолчанию 0 |
from | query | × | date | Дата начала интервала поиска в формате YYYY-MM-DD |
to | query | × | date | Дата конца интервала поиска в формате YYYY-MM-DD |
Ответ
Ответ
HTTP/1.1 200 OK
Content-Type: application/json
[
{
"paymentId": "0123456789-01",
"creationDateTime": "2023-01-17T15:05:51+03:00",
"expirationDateTime": "2023-01-17T15:35:51+03:00",
"status": {
"value": "COMPLETED",
"changedDateTime": "2023-01-17T15:06:00+03:00"
},
"amount": {
"currency": "RUB",
"value": "2.00"
},
"recipientDetails": {
"providerCode": "bank-card-russia",
"fields": {
"pan": "1234564543654321"
}
},
"commission": {
"currency": "RUB",
"value": "0.04"
},
"webhookUrl": "https://acme.inc/webhook",
"customFields": {
"user": "Wile E. Coyote"
}
},
{
"paymentId": "0123456789-02",
"creationDateTime": "2023-01-18T15:05:51+03:00",
"expirationDateTime": "2023-01-18T15:35:51+03:00",
"status": {
"value": "COMPLETED",
"changedDateTime": "2023-01-18T15:06:00+03:00"
},
"amount": {
"currency": "RUB",
"value": "40.00"
},
"recipientDetails": {
"providerCode": "bank-card-russia",
"fields": {
"pan": "1233764543654321"
}
},
"commission": {
"currency": "RUB",
"value": "0.80"
},
"webhookUrl": "https://acme.inc/webhook",
"customFields": {
"user": "Wile E. Coyote"
}
}
]
Успешный ответ содержит коллекцию платежей Payment согласно условиям заданного поиска.
Ответ с HTTP кодом ошибки (4xx
, 5xx
) содержит объект Error, для подробной информации следует обратиться к разделу Обработка ошибок.
Информация по платежу
GET /partner/payout/v2/agents/acme/payments/0123456789-02 HTTP/1.1
Accept: application/json
Authorization: Bearer <Token-Value>
Host: b2b-api.qiwi.com
curl -X GET \
-H "Authorization: Bearer <Token-Value>" \
https://b2b-api.qiwi.com/partner/payout/v2/agents/acme/payments/0123456789-02
Используется для получения информации о платеже. Поиск платежа осуществляется за последние 50 дней.
HTTP метод: | GET |
URI ресурса: | /partner/payout/v2/agents/{agentId}/payments/{paymentId} |
Параметры
Параметр | Положение | ✓\× | Тип | Описание |
---|---|---|---|---|
agentId | path | ✓ | string | Уникальный идентификатор агента |
paymentId | path | ✓ | string | Уникальный идентификатор платежа от 1 до 36 символов |
Ответ
Ответ
HTTP/1.1 200 OK
Content-Type: application/json
{
"paymentId": "0123456789-02",
"creationDateTime": "2023-01-18T15:05:51+03:00",
"expirationDateTime": "2023-01-18T15:35:51+03:00",
"status": {
"value": "COMPLETED",
"changedDateTime": "2023-01-18T15:06:00+03:00"
},
"amount": {
"currency": "RUB",
"value": "40.00"
},
"recipientDetails": {
"providerCode": "bank-card-russia",
"fields": {
"pan": "1234564543654321"
}
},
"commission": {
"currency": "RUB",
"value": "0.80"
},
"webhookUrl": "https://acme.inc/webhook",
"customFields": {
"user": "Wile E. Coyote"
}
}
Успешный ответ содержит информацию по платежу в виде объекта Payment.
Ответ с HTTP кодом ошибки (4xx
, 5xx
) содержит объект Error, для подробной информации следует обратиться к разделу Обработка ошибок.
Уведомления
Методы для работы с уведомлениями партнера об изменениях в системе, в том числе уведомлениях об изменении статуса платежа.
Уведомление о статусе платежа
POST /webhook HTTP/1.1
Accept: application/json
Content-Type: application/json
Signature: <Sign-Value>
Host: acme.inc
{
"agentId": "acme",
"paymentId": "c0d85b0b-a528-9c66-4a15-cb7a12eda9d6",
"status": {
"value": "FAILED",
"changedDateTime": "2023-01-18T13:00:28Z",
"errorCode": "INTERNAL_ERROR",
"errorMessage": "Some reason"
},
"amount": {
"value": "200.00",
"currency": "RUB"
},
"billingDetails": {
"transactionId": "20221101000019",
"rrn": "A123456",
"accountNumber": "4950001122",
"accountInfo": "Ivanov I.P.",
"receiptUrl": "https://billing.inc/receipt/6f5ec8cc-69ed-4fe5-aa2c-28850fc87ab2"
}
}
curl -X POST \
-H "Content-Type: application/json" \
-H "Signature: <Sign-Value>" \
https://acme.inc/webhook \
-d '{
"agentId": "acme",
"paymentId": "c0d85b0b-a528-9c66-4a15-cb7a12eda9d6",
"status": {
"value": "FAILED",
"changedDateTime": "2023-01-18T13:00:28Z",
"errorCode": "INTERNAL_ERROR",
"errorMessage": "Some reason"
},
"amount": {
"value": "200.00",
"currency": "RUB"
},
"billingDetails": {
"transactionId": "20221101000019",
"rrn": "A123456",
"accountNumber": "4950001122",
"accountInfo": "Ivanov I.P.",
"receiptUrl": "https://billing.inc/receipt/6f5ec8cc-69ed-4fe5-aa2c-28850fc87ab2"
}
}'
Используется для уведомления партнера об изменении статуса платежа.
HTTP метод: | POST |
URI ресурса: | {webhookAddressUrl} |
Параметры
Параметр | Положение | ✓\× | Тип | Описание |
---|---|---|---|---|
webhookAddressUrl | path | ✓ | string | URL адрес для уведомлений со стороны партнера |
Signature | header | ✓ | string | Подпись запроса, см. алгоритм вычисления подписи |
payload | body | ✓ | Webhook | Информация о платеже |
Алгоритм вычисления подписи запроса
Для вычисления подписи Signature
используется следующий алгоритм:
- Сформировать строку для подписи вида:
{agentId}|{paymentId}|{status.value}|{amount.value}|{amount.currency}
.
Где каждый из{param}
является значением соответствующего параметра path в теле уведомления Webhook и затем склеены между собой символом|
. - Вычислить
HMAC
с хэш-функциейSHA256
от сформированной строки и секретного ключа как ключа шифрования. - Передать получившуюся подпись в заголовке запроса в поле
Signature
.
Ответ
Тело ответа не анализируется, система ориентируется только на коды состояния HTTP.
Любой код, отличный от 2xx
, рассматривается как ошибка, система продолжит повторять уведомление.
Обработка ошибок
Согласно REST архитектуре верхнеуровневые ошибки обработки запросов передаются в коде состояния HTTP RFC 2068. В универсальном выплатном API применяются следующие HTTP коды:
Код | Описание |
---|---|
200 | Успешно или условно успешно |
400 | Параметры запроса некорректны, запрос не обработан |
401 | Токен или подпись не предоставлены или невалидны |
403 | Недостаточно прав для выполнения запроса |
404 | Ресурс с запрошенным идентификатором не найден |
5xx | Ошибка при обработке запроса |
Детальная расшифровка результата обработки запроса может передаваться в поле errorCode
запрошенного (возвращаемого) объекта. В случае обработки запроса и невозможности вернуть корректный ответ, API возвращает объект Error с детальной информацией об ошибке.
При получении ошибки из перечня 5xx
в результате обработки платежных методов, особенно запроса проведения платежа, уточняйте результат обработки с помощью запроса информации по платежу.
Модель Error
{
"serviceName": "payout-api",
"errorCode": "internal.error",
"userMessage": "Описание ошибки для отображения пользователя",
"description": "Описание ошибки",
"traceId": "aa99e984dd230404",
"dateTime": "2023-01-01T00:23:46+03:00",
"cause": {
"amount": ["Payout's amount is greater than maximum available"]
}
}
Сводная информация об ошибке.
Параметр | ✓\× | Тип | Описание |
---|---|---|---|
serviceName | ✓ | string | Идентификатор сервиса |
errorCode | ✓ | ErrorCode | Код ошибки |
userMessage | ✓ | string | Описание ошибки для пользователя |
description | ✓ | string | Описание ошибки |
traceId | ✓ | string | Уникальный идентификатор запроса |
dateTime | ✓ | dateTime | Дата возникновения ошибки в формате YYYY-MM-DDThh:mm:ssTZD |
cause | × | map[string, array[string]] | Дополнительные детали ошибки |
Модель ErrorCode
Значение errorCode
имеет доменную структуру с разделителем .
(точка). Слева направо понижается уровень причины (системы), вызвавшей ошибку.
Ошибки уровня авторизации
Значение | Описание |
---|---|
auth.error | Общая ошибка авторизации |
auth.failed | Ошибка авторизации: токен/сертификат не предоставлен или не найден |
auth.forbidden | Доступ запрещен: нет прав для доступа к запрашиваемому ресурсу |
Ошибки уровня валидации
Значение | Описание |
---|---|
payout.bad.request | Некорректный запрос: обязательные параметры отсутствуют или указаны некорректно |
payout.resource.exists | Ресурс уже существует: ресурс с запрашиваемым идентификатором уже существует |
payout.payment.not-found | Платеж не найден: платеж по запрашиваемому идентификатору не найден |
payout.provider.not-found | Провайдер не найден: провайдер по запрашиваемому идентификатору не найден |
validation.error | Ошибка валидации запроса, некорректный JSON |
Ошибки уровня проведения платежа
Значение | Описание |
---|---|
payout.provider.forbidden | Провайдер запрещен: платежи по указанному провайдеру запрещены |
payout.provider.unavailable | Провайдер недоступен: платежи по указанному провайдеру временно невозможны |
payout.billing.declined | Платеж отклонен: получен отказ от информационной системы получателя в приеме платежа |
payout.billing.timeout | Таймаут запроса: не получен ответ от информационной системы получателя |
Ошибки уровня финансовых и законодательных рисков
Значение | Описание |
---|---|
payout.fraud.violated | Платеж запрещен: нарушены правила финансового или фрод-мониторинга |
payout.legislation.prohibited | Платеж запрещен: платеж запрещен согласно требованиям законодательства РФ |
Общие ошибки
Значение | Описание |
---|---|
payout.insufficient-funds | Недостаточно средств: недостаточно денежных средств на балансе партнера |
payout.internal.error | Внутренняя ошибка |
internal.error | Внутренняя ошибка |
Тестовые реквизиты
После подключения к тестовой среде и получения agentId, вы можете проводить тестовые платежи в "песочнице" - без взаимодействия с Банком, где у вас открыт счет. Вам доступны следующие варианты создания платежа:
- Платеж на любого провайдера без дополнительных параметров (кроме оговоренных далее) - приводит к успешному платежу.
- Платеж на любого провайдера с управлением состоянием через customFields:
- для статуса платежа FAILED (при создании):
"customFields.create_result": "<Любое значение != [success, in_progress]>"
, например"customFields.create_result": "failed"
, - для статуса платежа FAILED (при проведении):
"customFields.execute_result": "<Любое значение != [success, in_progress]>"
, например"customFields.execute_result": "failed"
, - для статуса платежа IN_PROGRESS (при проведении):
"customFields.execute_result": "in_progress"
,
- для статуса платежа FAILED (при создании):
- Платеж на предустановленные реквизиты для получения соответствующего статуса:
Провайдер | Статус платежа | Стадия платежа | Реквизит | Значение |
---|---|---|---|---|
bank-card-russia bank-card-russia-fio bank-card-russia-gph |
COMPLETED | Проведение | pan |
2201380000000009 |
bank-card-russia bank-card-russia-fio bank-card-russia-gph |
FAILED | Создание | pan |
4444440000000004 |
bank-card-russia bank-card-russia-fio bank-card-russia-gph |
FAILED | Проведение | pan |
5555550000000002 |
bank-card-russia bank-card-russia-fio bank-card-russia-gph |
IN_PROGRESS | Проведение | pan |
2201380000000017 |
sbp-b2c | COMPLETED | Проведение | bankId |
sbp_bank_id_success |
sbp-b2c | FAILED | Создание | bankId |
sbp_bank_id_create_failed |
sbp-b2c | FAILED | Проведение | bankId |
sbp_bank_id_execute_failed |
sbp-b2c | IN_PROGRESS | Проведение | bankId |
sbp_bank_id_execute_in_progress |
bank-card-token | COMPLETED | Проведение | account |
token_success |
bank-card-token | FAILED | Создание | account |
token_create_failed |
bank-card-token | FAILED | Проведение | account |
token_execute_failed |
bank-card-token | IN_PROGRESS | Проведение | account |
token_execute_in_progress |
Для тестирования полной цепочки платежа через Банк, где у вас открыт счет, обратитесь к вашему менеджеру поддержки - после уточнения деталей и настройки, вам выдадут новый agentId.
Модели данных
Описание моделей данных, применяемых в API.
Модель Balance
{
"balance": {
"currency": "RUB",
"value": "1000000.00"
},
"overdraft": {
"currency": "RUB",
"value": "500000.00"
},
"available": {
"currency": "RUB",
"value": "1500000.00"
}
}
Информация о балансе счета.
Параметр | ✓\× | Тип | Описание |
---|---|---|---|
balance | × | Money | Текущий баланс |
overdraft | × | Money | Разрешенное превышение баланса |
available | ✓ | Money | Общий доступный лимит |
Модель Money
{
"currency": "RUB",
"value": "1000000.00"
}
Информация о сумме с указанием валюты.
Параметр | ✓\× | Тип | Описание |
---|---|---|---|
currency | ✓ | Currency | Код валюты |
value | ✓ | string | Сумма в формате числа c разделителем . (точка) и двумя цифрами после |
Модель Currency
Перечисление доступных кодов валют согласно спецификации ISO 4217 (буквенный код Alpha-3).
Значение | Описание |
---|---|
RUB | Российский рубль |
Модель Provider
{
"code" : "bank-card-russia",
"name" : "Выплаты на карты банков РФ"
}
Краткая информация о провайдере.
Параметр | ✓\× | Тип | Описание |
---|---|---|---|
code | ✓ | ProviderCode | Уникальный идентификатор провайдера |
name | ✓ | string | Наименование провайдера |
Модель ProviderInfo
{
"name": "Выплаты на банковские карты",
"legalName": "",
"amountLimits": {
"RUB": {
"min": "1.00",
"max": "600000.00"
}
},
"parameters": [
{
"extKey": "pan",
"required": true,
"description": "Немаскированный PAN карты",
"validationPattern": "7\\d{10}"
}
],
"inn": "3111453720",
"contactDetails": {
"address": "адрес",
"phoneNumber": "8-800-111-22-33"
}
}
Расширенная информация о провайдере.
Параметр | ✓\× | Тип | Описание |
---|---|---|---|
name | ✓ | string | Наименование провайдера |
legalName | ✓ | string | Юридическое наименование провайдера |
amountLimits | ✓ | map[Currency, Limit] | Набор разрешенных сумм для каждой из доступных валют |
parameters | ✓ | set of Parameter | Используемые при вызове платежных методов параметры |
inn | × | string | ИНН провайдера |
contactDetails | × | Contact | Контактные данные провайдера |
Модель Parameter
{
"extKey": "account",
"required": true,
"description": "QW user's account",
"validationPattern": "7\\d{10}"
}
Описание параметра платежа для провайдера.
Параметр | ✓\× | Тип | Описание |
---|---|---|---|
extKey | ✓ | string | Код параметра |
required | ✓ | boolean | Признак обязательности |
description | ✓ | string | Описание параметра |
validationPattern | × | string | Шаблон заполнения |
Модель Contact
{
"address": "Russia, 117648, Moscow, md. Chertanovo Severnoe, 1A, bldg. 1",
"phoneNumber": "8-800-707-77-59"
}
Контактные данные контрагента.
Параметр | ✓\× | Тип | Описание |
---|---|---|---|
address | × | string | Почтовый адрес |
phoneNumber | × | string | Телефонный номер |
Модель CurrencyLimit
{
"currency": "RUB",
"min": "1.00",
"max": "600000.00"
}
Ограничения на сумму платежа с указанием валюты.
Параметр | ✓\× | Тип | Описание |
---|---|---|---|
currency | ✓ | Currency | Код валюты |
min | ✓ | string | Минимальная разрешенная сумма (включительно) |
max | ✓ | string | Максимально разрешенная сумма (включительно) |
Модель Limit
{
"min": "1.00",
"max": "600000.00"
}
Ограничения на сумму платежа без указания валюты.
Параметр | ✓\× | Тип | Описание |
---|---|---|---|
min | ✓ | string | Минимальная разрешенная сумма (включительно) |
max | ✓ | string | Максимально разрешенная сумма (включительно) |
Модель PaymentPayload
{
"amount": {
"value": "2.00",
"currency": "RUB"
},
"recipientDetails": {
"providerCode": "bank-card-russia",
"fields": {
"pan": "1234564543654321"
}
},
"webhookUrl": "https://acme.inc/webhook",
"customFields": {
"user": "Wile E. Coyote"
}
}
Параметры создаваемого платежа
Параметр | ✓\× | Тип | Описание |
---|---|---|---|
amount | ✓ | Money | Сумма платежа |
recipientDetails | ✓ | RecipientDetails | Параметры получателя платежа |
webhookUrl | × | string | URL адрес для уведомлений |
customFields | × | map[string, string] | Дополнительные параметры для сопровождения платежа |
Модель RecipientDetails
{
"providerCode": "bank-card-russia",
"fields": {
"pan": "1234564543654321"
}
}
Параметры получателя платежа (направления выплаты).
Параметр | ✓\× | Тип | Описание |
---|---|---|---|
providerCode | ✓ | Provider.code | Уникальный идентификатор провайдера |
fields | ✓ | map[Parameter.extKey, string] | Набор параметров получателя платежа |
Модель ProviderCode
Перечисление возможных кодов провайдеров.
Значение | Описание |
---|---|
bank-card-russia | Выплаты на карты РФ |
bank-card-russia-fio | Выплаты на карты РФ с обязательным указанием ФИО получателя |
bank-card-russia-gph | Выплаты на карты РФ по договору ГПХ |
bank-card-token | Выплаты на карты РФ по токену |
sbp-b2c | Выплаты по СБП |
Модель ProviderFields
Информация о параметрах платежа в разрезе провайдера.
Выплаты на банковские карты РФ "providerCode": "bank-card-russia"
{
"providerCode": "bank-card-russia",
"fields": {
"pan": "4111111111111111"
}
}
Параметр | ✓\× | Тип | Описание |
---|---|---|---|
pan | ✓ | string | Номер карты получателя |
cardholder_name | × | string | Имя получателя |
cardholder_lastname | × | string | Фамилия получателя |
description | × | string | Описание оказанной услуги |
Выплаты на банковские карты РФ с обязательным указанием ФИО получателя "providerCode": "bank-card-russia-fio"
{
"providerCode": "bank-card-russia-fio",
"fields": {
"pan": "4111111111111111",
"lastName": "Иванов",
"firstName": "Иван"
}
}
Параметр | ✓\× | Тип | Описание |
---|---|---|---|
pan | ✓ | string | Номер карты получателя |
lastName | ✓ | string | Фамилия получателя |
firstName | ✓ | string | Имя получателя |
middleName | × | string | Отчество получателя |
description | × | string | Описание оказанной услуги |
Выплаты на банковские карты РФ по договору ГПХ "providerCode": "bank-card-russia-gph"
{
"providerCode": "bank-card-russia-gph",
"fields": {
"pan": "2201380000000009",
"lastName": "Иванов",
"firstName": "Иван",
"purpose": "Выплата по договору ГПХ №2 от 01.01.2025, за оказанные услуги, за период 02.2025"
}
}
Параметр | ✓\× | Тип | Описание |
---|---|---|---|
pan | ✓ | string | Номер карты получателя |
lastName | ✓ | string | Фамилия получателя |
firstName | ✓ | string | Имя получателя |
middleName | × | string | Отчество получателя |
purpose | ✓ | string | Описание оказанной услуги |
Выплаты по СБП "providerCode": "sbp-b2c"
{
"providerCode": "sbp-b2c",
"fields": {
"account": "79098087755",
"bankId": "100000000001"
}
}
Параметр | ✓\× | Тип | Описание |
---|---|---|---|
account | ✓ | string | Номер телефона получателя в международном формате без знака + |
bankId | ✓ | string | Идентификатор банка получателя в СБП |
description | × | string | Описание оказанной услуги |
Выплаты на карты РФ по токену "providerCode": "bank-card-token"
{
"providerCode": "bank-card-token",
"fields": {
"account": "17b985ce-5677-49f8-b88f-5ac2ef2cbc52"
}
}
Параметр | ✓\× | Тип | Описание |
---|---|---|---|
account | ✓ | string | Токен карты получателя |
cardholder_name | × | string | Имя получателя |
cardholder_lastname | × | string | Фамилия получателя |
description | × | string | Описание оказанной услуги |
Модель BillingDetails
{
"transactionId": "20221101000019",
"rrn": "A123456",
"accountNumber": "4950001122",
"accountInfo": "Ivanov I.P.",
"receiptUrl": "https://billing.inc/receipt/6f5ec8cc-69ed-4fe5-aa2c-28850fc87ab2"
}
Дополнительная информация со стороны получателя платежа.
Параметр | ✓\× | Тип | Описание |
---|---|---|---|
transactionId | × | string | Идентификатор платежа на стороне получателя |
rrn | × | string | Код акцептования платежа на стороне получателя |
accountNumber | × | string | Номер счета для подтверждения платежа |
accountInfo | × | string | Дополнительная информация для подтверждения платежа |
receiptUrl | × | string | Ссылка на документ с информацией о платеже |
Модель Payment
{
"paymentId": "0123456789",
"creationDateTime": "2023-01-17T15:05:51+03:00",
"expirationDateTime": "2023-01-17T15:35:51+03:00",
"status": {
"value": "READY",
"changedDateTime": "2023-01-17T15:05:51+03:00"
},
"amount": {
"currency": "RUB",
"value": "2.00"
},
"recipientDetails": {
"providerCode": "bank-card-russia",
"fields": {
"pan": "1234564543654321"
}
},
"commission": {
"currency": "RUB",
"value": "0.04"
},
"webhookUrl": "https://acme.inc/webhook",
"customFields": {
"user": "Wile E. Coyote"
},
"billingDetails": {
"transactionId": "20221101000019",
"rrn": "A123456",
"accountNumber": "4950001122",
"accountInfo": "Ivanov I.P.",
"receiptUrl": "https://billing.inc/receipt/6f5ec8cc-69ed-4fe5-aa2c-28850fc87ab2"
}
}
Детальная информация о платеже с актуальным статусом.
Параметр | ✓\× | Тип | Описание |
---|---|---|---|
paymentId | ✓ | string | Уникальный идентификатор платежа |
creationDateTime | ✓ | dateTime | Дата создания платежа в формате YYYY-MM-DDThh:mm:ssTZD |
expirationDateTime | ✓ | dateTime | Дата окончания жизни платежа в формате YYYY-MM-DDThh:mm:ssTZD |
status | ✓ | Status | Статус платежа |
amount | ✓ | Money | Сумма платежа |
recipientDetails | ✓ | RecipientDetails | Параметры получателя платежа |
commission | ✓ | Money | Рассчитанная сумма комиссии для платежа |
webhookUrl | × | string | URL адрес для уведомлений |
customFields | × | map[string, string] | Дополнительные параметры для сопровождения платежа |
billingDetails | × | BillingDetails | Дополнительная информация со стороны получателя |
Модель Status
{
"value": "READY",
"changedDateTime": "2023-01-17T15:05:51+03:00"
}
Подробная информация о статусе платежа.
Параметр | ✓\× | Тип | Описание |
---|---|---|---|
value | ✓ | StatusCode | Статус платежа |
changedDateTime | ✓ | dateTime | Дата изменения статуса платежа в формате YYYY-MM-DDThh:mm:ssTZD |
errorCode | × | StatusErrorCode | Код ошибки |
errorMessage | × | string | Описание ошибки |
Модель StatusCode
Перечисление возможных статусов платежей.
Значение | Описание |
---|---|
CREATED | Платеж создан, но не готов к проведению |
READY | Платеж создан и готов к проведению |
EXPIRED | Срок жизни платежа истек |
IN_PROGRESS | Платеж в процессе обработки |
FAILED | Платеж неуспешен |
COMPLETED | Платеж успешно завершен |
Модель StatusErrorCode
Перечисление возможных кодов ошибок.
Значение | Описание |
---|---|
INTERNAL_ERROR | Внутренняя ошибка |
INSUFFICIENT_FUNDS | Не проведен из-за недостатка денежных средств |
BILLING_DECLINED | Платеж отклонен биллингом получателя |
FRAUD_SUSPECTED | Отклонен из-за подозрения Фрод-мониторинга |
LIMIT_ERROR | Отклонен из-за превышения лимитов |
EXPIRED | Платеж просрочен |
Модель Webhook
{
"agentId": "acme",
"paymentId": "c0d85b0b-a528-9c66-4a15-cb7a12eda9d6",
"status": {
"value": "FAILED",
"changedDateTime": "2023-01-18T13:00:28Z",
"errorCode": "INTERNAL_ERROR",
"errorMessage": "Some reason"
},
"amount": {
"value": "200.00",
"currency": "RUB"
},
"billingDetails": {
"transactionId": "20221101000019",
"rrn": "A123456",
"accountNumber": "4950001122",
"accountInfo": "Ivanov I.P.",
"receiptUrl": "https://billing.inc/receipt/6f5ec8cc-69ed-4fe5-aa2c-28850fc87ab2"
}
}
Уведомление об изменении статуса платежа для партнера.
Параметр | ✓\× | Тип | Описание |
---|---|---|---|
agentId | ✓ | string | Уникальный идентификатор агента |
paymentId | ✓ | string | Уникальный идентификатор платежа |
status | ✓ | Status | Статус платежа |
amount | ✓ | Money | Сумма платежа |
billingDetails | × | BillingDetails | Дополнительная информация со стороны получателя |