Расщепление платежей
Функциональность Расщепление e-commerce платежей дает возможность разделить сумму платежа, поступившего на транзитный счет в рамках интернет-эквайринга на несколько частей. Затем части платежа зачисляются на текущие счета или платежные карты бенефициаров. Ниже приведено описание функциональности и API запросов мерчанта.
Описание
Регистрация Мерчанта-партнера
- Mерчант-агрегатор (далее МА) отправляет запрос на регистрацию мерчанта-партнера (далее МП) с указанием данных о клиенте, контракта и счета в Банк.
- Банк осуществляет проверки.
- Банк создает данные о Клиенте, счете и контракте МП с присвоением ему регистрационного номера.
- Банк отправляет ответ на запрос регистрации МП МА с указанием регистрационных номеров МП.
- Банк осуществляет проверку наличия клиента МП в разрезе МА, сформировавшего запрос. Если данные присутствуют, то Банк отправляет ответ на запрос регистрации МП МА с указанием кода ошибки -346100500 -
PARTNER_ALREADY_REGISTERED
. - Если не удается получить ответ на запрос создания клиента, контракта, постоянного платежного поручения (далее ППП) в течение указанного времени ожидания ответа, продолжается повторная отправка запроса. Если по истечении заданного количества попыток не был получен успешный ответ, то Банк удаляет созданные данные и отправляет ответ на запрос регистрации МП МА с указанием кода ошибки -246100500 -
EXTERNAL_COMMUNICATION_ERROR
.
Редактирование данных о МП
- Mерчант-агрегатор (далее МА) отправляет запрос на регистрацию мерчанта-партнера (далее МП) с указанием идентификатора клиента и изменяемыми данными в Прокси Банк.
- Банк осуществляет проверки.
- Банк осуществляет обработку запроса.
- Банк возвращает ответ на запрос редактирования клиента, контракта, ППП.
- Банк обновляет соответствующие данные о МП, контракте, счете.
- Банк отправляет ответ на запрос регистрации МП МА.
- Если в результате проверки данные о МП не найдутся, то Банк отправляет ответ на запрос регистрации МП МА с указанием кода ошибки -346100501 -
PARTNER_DOESNT_EXIST
. - Если в результате проверки уникальности изменяемых данных - хотя бы одни из изменяемых данных совпадают существующими, то Банк отправляет ответ на запрос регистрации МП МА с указанием кода ошибки -446100501 -
SAME_DATA
.
Проведение оплаты
- МП формирует заказ.
- МА выполняет запрос регистрации заказа с предавторизацией registerPreAuth.do.
- Банк регистрирует заказ и возвращает
orderId
. - МП перенаправляется на платежную страницу и отправляет заполненные данные.
- Банк выполняет проверки и осуществляет оплату.
- МП перенаправляется в магазин, на финишную страницу.
- МА производит запрос deposit.do и getOrderStatusExtended.do.
- Банк возвращает МА
paymentAmount
/feeAmount
,authRefNum
.
Передача инструкций по расщеплению
- МА отправляет запрос передачи инструкций на расщепление splitInstruction.do в Банк с указанием идентификатора заказа, RRN операции (поле
referenceNumber
), а также данных по расщеплению. - Банк выполняет необходимые проверки (отсутствие дублей инструкций, корректность данных и т.д.). В данном случае под дублями подразумеваются только инструкции в статусе PENDING (создана) и SUCCESS (обработана).
- Банк отправляет расширенный запрос получения статуса заказа getOrderStatusExtension.do - получает успешный ответ.
- По RRN заказа Банк определяет направление инструкций по расщеплению, полученных от МА, - инструкции относятся к возврату платежа (полному или частичному).
- Банк проверяет состояние заказа - состояние заказа "4 - По транзакции была проведена операция возврата".
- Банк проверяет наличие инструкций по расщеплению по прямым операциям (тип операции - "purchase") по тем МП, которые были переданы в запросе передачи инструкций на расщепление от МА, - инструкции найдены.
- Банк проверяет наличие инструкций по расщеплению с отрицательной суммой к расщеплению (sign="-") - инструкций с отрицательными суммами не найдено.
- Банк проверяет соответствие суммы возврата (refundedAmount), указанной в ответе на расширенный запрос получения статуса заказа, общей сумме расщепления, указанной во всех инструкциях запроса передачи инструкций на расщепление от МА, - сумма соответствует.
-
Банк сохраняет инструкции на расщепление в БД, указывая следующие данные:
Поле Описание splitId
Идентификатор инструкции в системе МА. Указывается по данным запроса передачи инструкции на расщепление от МА regNumber
Регистрационный номер МП. Указывается по данным запроса передачи инструкции на расщепление от МА status
Статус инструкции на расщепление - PENDING
(создана)amount
Сумма расщепления. Указывается по данным запроса передачи инструкции на расщепление от МА type
Тип расщепления - refund
(возвраты)id
Уникальный идентификатор инструкции Банк обновляет статус инструкции на расщепление на
SUCCESS
(обработана).Банк возвращает успешный ответ на запрос регистрации инструкции на расщепление splitInstruction.do.
- Если в результате проверки сохраненных дублей инструкций на расщепление найдены дубли, то Банк возвращает ответ с указанием кода ошибки
400 Bad Request
. - Если Банк получает неуспешный ответ на расширенный запрос получения статуса заказа "заказ не найден", то Банк возвращает ответ с указанием кода ошибки
400 Bad Request
. - Если Банк получает неуспешный ответ на расширенный запрос получения статуса заказа - "RRN не найден",то Банк возвращает ответ с указанием кода ошибки
400 Bad Request
. - Если состояние заказа отличается от "4 - По транзакции была проведена операция возврата", то Банк возвращает ответ с указанием кода ошибки
-346100503 ORDER_IN_WRONG_STATE
. - Если инструкции по расщеплению по прямым операциям (тип операции - "1") не найдены, то Банк возвращает ответ с указанием кода ошибки
400 Bad Request
. - Если найдены инструкции с отрицательными суммами, то Банк возвращает ответ с указанием кода ошибки
TBD NEGATIVE_SUM
. - Если при возврате сумма возврата
refundedAmount
не соответсвует указанной во всех инструкциях запроса передачи инструкций на расщепление, то Банк возвращает ответ с указанием кода ошибки400 Bad Request
. - Если по истечении заданного количества попыток или времени на создание инструкции по расщеплению не был получен успешный ответ, то Банк обновляет статус инструкции на расщепление на ERROR (ошибка) и возвращает ответ с указанием кода ошибки
400 Bad Request
.
Альтернативный сценарий
Если Банк определяет направление инструкций как относящиеся к прямому платежу, то Банк проверяет состояние заказа - состояние заказа "2 - Проведена полная авторизация суммы заказа". Затем шаги 7-11 выглядят так:
7а. Банк проверяет соответствие указанной в ответе на расширенный запрос получения статуса заказа суммы списания (depositedAmount
) за вычетом размера комиссии, полученного в ответе на авторизационный запрос общей сумме расщепления с учетом знака расщепления, указанной во всех инструкциях запроса передачи инструкций на расщепление от МА, - сумма соответствует.
8а. Банк сохраняет инструкции на расщепление в БД, указывая следующие данные:
Поле | Описание |
---|---|
splitid |
Идентификатор инструкции в системе МА. Указывается по данным запроса передачи инструкции на расщепление от МА |
regNumber |
Регистрационный номер МП. Указывается по данным запроса передачи инструкции на расщепление от МА |
amount |
Сумма расщепления. Указывается по данным запроса передачи инструкции на расщепление от МА |
type |
Тип расщепления - refund (возвраты) |
status |
Статус инструкции на расщепление - PENDING (создана) |
9а. Банк обновляет статус инструкции на расщепление на SUCCESS
(обработана).
10а. Банк возвращает успешный ответ на запрос регистрации инструкции на расщепление splitInstruction.do.
API запросы
Для авторизации обращения к системе Банка в любом запросе со стороны магазина должны быть приведены имя и пароль магазина, полученные при регистрации магазина в системе. Взаимодействия реализуются как HTTP обращения методом POST на определенные URL. Body запроса должен содержать json
-объект. Результат обработки запроса возвращается в виде JSON объекта. Например: {"errorCode":"12","errorMessage":"Empty amount"}
.
Все текстовые поля должны иметь кодировку Юникод (UTF-8). Если в ответе на запрос errorCode
(Код ошибки) = 0, это означает, что запрос был обработан платежным шлюзом без системных ошибок. При этом errorCode
не отображает статус заказа.
Регистрация мерчанта-партнера
Запрос merchantPartner.do
позволяет мерчанту-агрегатору создавать и редактировать сведения о мерчанте-партнере.
Параметры запроса
Обязательность при type=add | Обязательность при type=edit | Название | Тип | Описание |
---|---|---|---|---|
Обязательно | Обязательно | userName |
String [1..100] | Логин учетной записи API продавца. |
Обязательно | Обязательно | password |
String [1..200] | Пароль учетной записи API продавца. |
Обязательно | Обязательно | merchants |
Array | Массив данных по Мерчантам-партнерам. |
Обязательно | Обязательно | type |
String [1..4] | Тип действия с Мерчантом-партнером:
В случае type=edit указываются только те поля, которые должны быть отредактированы. При передачи неизменяемых параметров будет возвращена ошибка. В случае type=edit передавать незаполненные поля запрещено. |
Необязательно | Обязательно | regNumber |
String [1..11] | Регистрационный номер Мерчант-партнера. Указывается, только если type=edit. |
Обязательно | Необязательно | unp |
String [1..11] | Учетный номер плательщика (УНП) Юридических лиц и Индивидуальных предпринимателей (9 цифр). Обязательно, если type=add. Формат: первые 2 символа - буквы или цифры 0-9, с 3 по 9 символы - цифры 0-9. |
Обязательно | Необязательно | shortName |
String [1..255] | URL страницы МП на платформе (или наименование интернет-ресурса для приложений) в формате |
Обязательно | Необязательно | companyName |
String [1..255] |
|
Обязательно | Необязательно | companyTradeName |
String [1..255] |
|
Обязательно | Необязательно | order |
Object | Блок сведений о постоянном платежном поручении. Обязательно, если type=add. |
Обязательно | Необязательно | targetNumber |
String [1..28] | Номер счета. Обязательно, если type=add. Допустимо указание только цифр и символов латиницы. В случае, если type=edit и текущий счет зарегистрирован в Альфа Банк Беларусь, то новый счет также должен быть зарегистрирован в Альфа Банк Беларусь (в targetNumber с 5 по 8 символы указано значение ALFA). |
Необязательно | Необязательно | bic |
String [1..8] | Банковский идентификационный код. Обязательно только в случае, если type=add и счет зарегистрирован не в АББ (в targetNumber с 5 по 8 символы значение отличается от ALFA). |
Необязательно | Необязательно | currency |
Integer [3] | Валюта счета. Обязательно только в случае, если type=add и счет зарегистрирован в АББ (в targetNumber с 5 по 8 символы указано значение ALFA). В этом случае указывается одно из следующих значений:
В случае, если счет зарегистрирован не в АББ, то не указывается, либо указывается значение BYN. В случае, если type=edit, то не указывается. В случае изменения валюты у МП, необходимо зарегистрировать нового МП. |
Параметры ответа
Обязательность | Название | Тип | Описание |
---|---|---|---|
Обязательно | status |
String [1..20] | Статус обработки запроса. Доступны следующие значения:
COMPLETE_WITH_ERRRORS возвращается, если хотя бы один из Мерчантов-партнеров не был зарегистрирован. |
Обязательно | merchants |
Array | Массив данных по Мерчантам-партнерам. |
Обязательно | regNumber |
String [1..11] | Регистрационный номер Мерчант-партнера. Указывается, только если type=edit. |
Обязательно | unp |
String [1..11] | Учетный номер плательщика (УНП) Юридических лиц и Индивидуальных предпринимателей (9 цифр). Обязательно, если type=add. Формат: первые 2 символа - буквы или цифры 0-9, с 3 по 9 символы - цифры 0-9. |
Обязательно | status |
String [1..6] | Статус регистрации Мерчанта-партнера. Доступны следующие значения:
|
Необязательно | error |
String | Сообщение об ошибке (если в ответе вернулась ошибка) на языке, переданном в запросе. |
Обязательно | errorCode |
Integer [1..3] | Код ошибки. Доступны следующие значения:
|
Необязательно | errorDesc |
String [1..99] | Описание ошибки. |
Примеры
Пример запроса - регистрация МП
curl --request POST \
--url https://abby.rbsuat.com/payment/rest/split-abb/partner/merchantPartner.do \
--header 'content-type: application/json;charset=UTF-8' \
--data userName=username \
--data password=password \
--data merchants={"type": "add", "unp": "623458985", "shortName": "merchant.ru", "companyName": "Company Name", "companyTradeName": "Company TradeName"}'
--data order={"targetNumber": "723456789", "bic": "PJCBBY2X", "currency": "BYN"}'
Пример запроса - изменение МП
curl --request POST \
--url https://abby.rbsuat.com/payment/rest/split-abb/partner/merchantPartner.do \
--header 'content-type: application/json;charset=UTF-8' \
--data userName=username \
--data password=password \
--data merchants={"type": "edit", "regNumber": "SPLIT000087", "companyName": "Companyname"}'
Пример успешного ответа
{ "status": "COMPLETE",
"merchants":[{
"regNumber":"SPLIT000087",
"unp":"623458985",
"status":"SUCCESS",
"error":null
}
]
}
Пример неуспешного ответа - попытка повторной регистрации МП
{
"status": "COMPLETE_WITH_ERRORS",
"merchants":[{
"regNumber":null,
"unp":"623458985",
"status":"FAIL",
"error":{"errorCode":-346100500,"errorDesc":"Partner already registered"}
}
]
}
Пример неуспешного ответа - неуспешная авторизация
{
"errorDesc":"Authentication failed"
}
Пример неуспешного ответа - неуспешная валидация
{
"errorDesc":"Validation failed for param [$.merchants[0].unp] with message: must be not blank"
}
Передача инструкции по расщеплению
Запрос splitInstruction.do
позволяет мерчанту-агрегатору отправлять инструкции на расщепление платежей по мерчант-партнеру.
Параметры запроса
Обязательность | Название | Тип | Описание |
---|---|---|---|
Обязательно | userName |
String [1..100] | Логин учетной записи API продавца. |
Обязательно | password |
String [1..200] | Пароль учетной записи API продавца. |
Обязательно | orderId |
String [1..36] | Номер заказа в платежном шлюзе. Уникален в пределах платежного шлюза. |
Обязательно | referenceNumber |
String [12] | Уникальный идентификационный номер, который присваивается операции по ее завершению. |
Обязательно | instructions |
Array | Массив данных по инструкциям по расщеплению в рамках указанного заказа. Допускается указание от 1 до 50 инструкций. |
Необязательно | splitid |
String [1..30] | Идентификатор инструкции в системе МА. Используется для удобства отслеживания статуса инструкции по расщеплению. |
Обязательно | regNumber |
String [1..11] | Регистрационный номер Мерчант-партнера, полученный в ответе на запрос регистрации МП - merchantPartner.do . |
Обязательно | amount |
Integer [0..12] | Сумма расщепления в минимальных единицах валюты (например, в копейках), указанной при регистрации заказа. |
Необязательно | sign |
String [1..20] | Знак суммы расщепления. Доступны следующие значения:
|
Параметры ответа
Обязательность | Название | Тип | Описание |
---|---|---|---|
Обязательно | status |
String [1..20] | Статус обработки запроса. Доступны следующие значения:
COMPLETE_WITH_ERRRORS возвращается, если хотя бы один из Мерчантов-партнеров не был зарегистрирован. |
Обязательно | instructions |
Array | Массив данных по инструкциям по расщеплению в рамках указанного заказа. Допускается указание от 1 до 50 инструкций. |
Необязательно | splitid |
String [1..30] | Идентификатор инструкции в системе МА. Используется для удобства отслеживания статуса инструкции по расщеплению. |
Обязательно | regNumber |
String [1..11] | Регистрационный номер Мерчант-партнера, полученный в ответе на запрос регистрации МП - merchantPartner.do . |
Обязательно | amount |
Integer [0..12] | Сумма расщепления в минимальных единицах валюты (например, в копейках), указанной при регистрации заказа. |
Необязательно | sign |
String [1..20] | Знак суммы расщепления. Доступны следующие значения:
|
Обязательно | status |
String [1..6] | Статус передачи инструкции по расщеплению. Доступны следующие значения:
|
Необязательно | error |
String | Сообщение об ошибке (если в ответе вернулась ошибка) на языке, переданном в запросе. |
Обязательно | errorCode |
Integer [1..3] | Код ошибки. Доступны следующие значения:
|
Необязательно | errorDesc |
String [1..99] | Описание ошибки. |
Примеры
Пример запроса
curl --request POST \
--url https://abby.rbsuat.com/payment/rest/split-abb/split/splitInstruction.do \
--header 'content-type: application/json;charset=UTF-8' \
--data userName=username \
--data password=password \
--data orderId=5e97e3fd-1d20-4b4b-a542-f5995f5e8208 \
--data referenceNumber=123456789012 \
--data instructions={"splitId": "a2345lk3d", "regNumber": "SPLIT000087", "amount": "100", "sign": "+"}'
Пример успешного ответа
{
"status": "COMPLETE",
"instructions":[{
"splitId":"a2345lk3d",
"regNumber":"SPLIT000087",
"amount":"100",
"sign":"+",
"status":"SUCCESS",
"error":"null"
}
]
}
Пример неуспешного ответа - неуспешная авторизация
{
"errorDesc":"Authentication failed"
}
Пример неуспешного ответа - неуспешная валидация
{
"errorDesc":"Validation failed for param [$.merchants[0].unp] with message: must be not blank"
}