Интеграция по API с использованием фискализации
Введение
Платёжный шлюз позволяет принимать оплату с передачей со стороны магазина Корзины товаров, относящихся к одному заказу. Корзина предоставляет собой детализацию заказа по товарным позициям, по которым производится оплата в рамках одного заказа. В запросе на оплату также передаются данные, необходимые для печати кассового чека.
Для получения кассового чека Платежный шлюз взаимодействует с ОФД (см. Онлайн-кассы).
Требования к запросам API
Требования к формированию запросов регистрации заказа с Корзиной
В запросах на регистрацию заказа (с предавторизацией или без) Корзина товаров передаётся в параметре <orderBundle>.
- Все товарные позиции Корзины должны быть выражены в одной и той же валюте (если валюта позиции указывается) и должны совпадать с валютой заказа.
- Сумма всех товарных позиций Корзины должна быть равна сумме заказа.
- По каждой товарной позиции выполняется проверка переданного значения
<quantity>. Если значение слишком большое или слишком маленькое, запрос завершается ошибкой. - Все параметры Корзины валидируются на соответствие требуемому формату (длине).
В случае невыполнения хотя бы одного из указанных выше условий заказ считается неправильно сформированным и Платежный шлюз возвращает ошибку.
Пример запроса регистрации заказа с Корзиной
curl --request POST \
--url https://vtb.rbsuat.com/payment/rest/register.do \
--header 'content-type: application/x-www-form-urlencoded' \
--data amount=123456 \
--data userName=test_user \
--data password=test_user_password \
--data amount=200000 \
--data 'returnUrl=https://mybestmerchantreturnurl.com' \
--data 'orderBundle={
"orderCreationDate": "2025-07-29T11:11:33",
"cartItems": {
"items": [
{
"positionId": 0,
"name": 1,
"quantity": {
"value": 1,
"measure": "0"
},
"itemCode": "5861-0-0",
"itemPrice": 50000,
"itemAmount": 50000,
"tax": {
"taxType": 14,
"taxSum": 0
}
},
{
"positionId": 1,
"name": "Delivery",
"quantity": {
"value": 1,
"measure": "0"
},
"itemCode": "delivery",
"itemPrice": 50000,
"itemAmount": 50000,
"itemAttributes": {
"attributes": [
{
"name": "paymentMethod",
"value": 1
},
{
"name": "paymentObject",
"value": "4"
}
]
},
"tax": {
"taxType": 15,
"taxSum": 0
}
},
{
"positionId": 3,
"name": 1,
"quantity": {
"value": 1,
"measure": "0"
},
"itemCode": "5861-0-0",
"itemPrice": 50000,
"itemAmount": 50000,
"tax": {
"taxType": 6,
"taxSum": 0
}
},
{
"positionId": 4,
"name": 1,
"quantity": {
"value": 1,
"measure": "0"
},
"itemCode": "5861-0-0",
"itemPrice": 50000,
"itemAmount": 50000,
"tax": {
"taxType": 7,
"taxSum": 0
}
}
]
},
"customerDetails": {
"email": "demo@example.com"
}
}'Требования к формированию запросов завершения заказа с Корзиной
При завершении заказов Корзина передаётся в элементе <depositItems>.
- В случае завершения на полную предавторизованную сумму передача Корзины необязательна.
- Сумма завершения в Корзине не должна превышать предавторизованную денежную сумму заказа.
- При завершении заказа на сумму отличную от суммы предавторизации (кроме передачи значения «0») обязательно должна передаваться Корзина товаров.
- Все товарные позиции Корзины должны быть выражены в одной и той же валюте (если валюта позиций указывается) и должны совпадать с валютой оригинального заказа.
- В Корзине запрещены для передачи новые товарные позиции, отсутствующие в оригинальном заказе. Происходит проверка наличия указанного товара в Корзине запроса на завершение в изначальном заказе. Необходимо совпадение элементов
<positionId>,<name>,<itemCode>. Если хотя бы одно из значений не совпадает, считается, что данная товарная позиция отсутствует в Корзине заказа на регистрацию. - Значение элемента
<quantity>в Корзине запроса на завершение не должно превышать значение аналогичного параметра в Корзине заказа на регистрацию. - Значение элемента
<itemAmount>блока<items>не должно превышать значение аналогичного параметра в оригинальном заказе. - По каждой товарной позиции производится проверка переданного значения
<quantity>. В случае если значение слишком большое или слишком маленькое, то запрос завершается ошибкой. - Все параметры Корзины валидируются на соответствие требуемому формату (длине).
В случае невыполнения хотя бы одного из указанных выше условий, запрос завершения заказа считается неправильно сформированным и Платежный шлюз возвращает ошибку.
Пример запроса завершения заказа с Корзиной
curl --request POST \
--url https://vtb.rbsuat.com/payment/rest/deposit.do \
--header 'content-type: application/x-www-form-urlencoded' \
--data userName=test_user \
--data password=test_user_password \
--data amount=4441 \
--data currency=643\
--data orderId=01492437-d2fb-77fa-8db7-9e2900a7d8c0 \
--data 'depositItems={
"items": [
{
"itemAmount": 3330,
"itemCode": "NM-15",
"itemCurrency": "643",
"itemDetails": {
"itemDetailsParams": [
{
"name": "brand",
"value": "Noname"
},
{
"name": "diameter",
"value": "12mm"
}
]
},
"itemPrice": 3330,
"name": "Universal Mirror Enduro",
"positionId": "2",
"quantity": {
"measure": "0",
"value": 1
},
"tax": {
"taxSum": 111,
"taxType": 1
}
},
{
"itemAmount": 1111,
"itemCode": "G-16",
"itemCurrency": 643,
"itemDetails": {
"itemDetailsParams": [
{
"name": "brand",
"value": "Noname"
}
]
},
"itemPrice": 1111,
"name": "Warm Grips",
"positionId": "3",
"quantity": {
"measure": "0",
"value": 1
},
"tax": {
"taxSum": 111,
"taxType": 1
}
}
]
}'Требования к формированию запросов возврата заказа с Корзиной
В запросе на возврат Корзина указывается в блоке <refundItems>.
- В случае полного возврата заказа передача Корзины товаров необязательна. При возврате заказа на сумму отличную от суммы списания (кроме передачи значения «0») обязательно должна передаваться Корзина товаров.
- В случае проведения нескольких возвратов по заказам с Корзиной, все они должны осуществляться только по алгоритму возврата с Корзиной.
- Сумма возврата в Корзине не должна превышать подтвержденную денежную сумму оригинального заказа.
- Все товарные позиции Корзины должны быть выражены в одной и той же валюте (если валюта позиций указывается), совпадающей с валютой оригинального заказа.
- В Корзине запрещены для передачи товарные позиции, отсутствующие в оригинальном заказе. Происходит проверка наличия указанного товара в Корзине запроса на возврат в изначальном заказе. Необходимо совпадение элементов
<positionId>,<name>,<itemCode>. Если хотя бы одно из значений не совпадает, считается, что данная товарная позиция отсутствует в оригинальном заказе. - Значение элемента
<quantity>в Корзине запроса на возврат не должно превышать значение аналогичного параметра в Корзине заказа на регистрацию. - Значение элемента
<itemAmount>блока<items>не должно превышать значение аналогичного параметра в оригинальном заказе. - Все параметры Корзины валидируются на соответствие требуемому формату (длине).
В случае невыполнения хотя бы одного из указанных выше условий, запрос возврата заказа считается неправильно сформированным и Платежный шлюз возвращает ошибку.
Пример запроса возврата с Корзиной
curl --request POST \
--url https://vtb.rbsuat.com/payment/rest/refund.do \
--header 'content-type: application/x-www-form-urlencoded' \
--data userName=test_user \
--data password=test_user_password \
--data currency=643\
--data orderId=01491d0b-c848-7dd6-a20d-e96900a7d8c0 \
--data amount=9000 \
--data 'refundItems={
"items": [
{
"itemAmount": 6000,
"itemCode": "NM-15",
"itemCurrency": "643",
"itemDetails": {
"itemDetailsParams": [
{
"name": "brand",
"value": "Noname"
},
{
"name": "diameter",
"value": "12mm"
}
]
},
"itemPrice": 6000,
"name": "Universal Mirror Enduro",
"positionId": "2",
"quantity": {
"measure": "0",
"value": 1
},
"tax": {
"taxSum": 111,
"taxType": 1
}
},
{
"itemAmount": 3000,
"itemCode": "G-16",
"itemCurrency": 643,
"itemDetails": {
"itemDetailsParams": [
{
"name": "brand",
"value": "Noname"
}
]
},
"itemPrice": 3000,
"name": "Warm Grips",
"positionId": "3",
"quantity": {
"measure": "0",
"value": 1
},
"tax": {
"taxSum": 111,
"taxType": 1
}
}
]
}'Чеки закрытия
С 1 июля 2019 года владельцы онлайн-касс должны формировать чеки для зачёта и возврата предоплаты. Платёжный шлюз позволяет зарегистрировать второй чек (чек закрытия) без создания нового заказа с помощью запроса closeOfdReceipt.
Подробнее о регистрации второго чека читайте здесь.
Схемы взаимодействия при использовании различных видов оплаты
Одностадийная оплата
чека расхода OFD->>PG:Результат формирования
чека расхода OS->>PG: Расширенный запрос состояния заказа PG-->>OS: Информация о заказе opt Нужна повторная регистрация чека OS->>PG: Запрос закрытия чека PG-> OFD: Запрос закрытия чека PG-->>OS: Ответ на запрос закрытия чека end
- Мерчант инициирует оплату заказа (см. список используемых запросов API).
- Платежный шлюз выполняет оплату.
- Платежный шлюз отвечает на запрос.
- Платежный шлюз отправляет в ОФД запрос на формирование чека расхода.
- ОФД возвращает результат формирования чека расхода.
- Мерчант отправляет в Платежный шлюз расширенный запрос состояния заказа getOrderStatusExtended.do.
- Платежный шлюз присылает информацию о заказе.
- (Необязательно) Мерчант отправляет в Платежный шлюз запрос закрытия чека closeOfdReceipt.
- Платежный шлюз обменивается данными с ОФД.
- Платежный шлюз направляет Мерчанту подтверждение получения информации (ответ на запрос закрытия).
Двухстадийная оплата
чека расхода OFD->>PG:Результат формирования
чека расхода OS->>PG: Расширенный запрос состояния заказа PG-->>OS: Информация о заказе opt Нужна повторная регистрация чека OS->>PG: Запрос закрытия чека PG-> OFD: Обмен данными PG-->>OS: Ответ на запрос закрытия чека end
- Мерчант инициирует завершение заказа (см. список используемых запросов API).
- Платежный шлюз выполняет завершение заказа.
- Платежный шлюз отвечает на запрос.
- Платежный шлюз отправляет в ОФД запрос на формирование чека расхода.
- ОФД возвращает результат формирования чека расхода.
- Мерчант отправляет в Платежный шлюз расширенный запрос состояния заказа getOrderStatusExtended.do.
- Платежный шлюз присылает информацию о заказе.
- (Необязательно) Мерчант отправляет в Платежный шлюз запрос закрытия чека closeOfdReceipt.
- Платежный шлюз обменивается данными с ОФД.
- Платежный шлюз направляет Мерчанту подтверждение получения информации (ответ на запрос закрытия).
Запросы, используемые при одностадийной оплате
- Запрос регистрации заказа register.do
- Платёж Mir Pay из мобильного приложения/со страницы Мерчанта /mir/payment.do
- Платёж Mir Pay с расшифровкой данных на стороне Мерчанта mir/paymentDirect.do
- Запрос отмены оплаты заказа reverse.do
- Запрос полного или частичного возврата средств оплаты заказа refund.do
- Запрос сведений о кассовом чеке getReceiptStatus.do
- Расширенный запрос состояния заказа getOrderStatusExtended.do
- Запрос закрытия ОФД чека closeOfdReceipt.do
Запросы, используемые при двухстадийной оплате
- Запрос регистрации заказа с предавторизацией registerPreAuth.do
- Платёж Mir Pay из мобильного приложения/со страницы Мерчанта /mir/payment.do
- Платёж Mir Pay с расшифровкой данных на стороне Мерчанта mir/paymentDirect.do
- Запрос завершения на полную или частичную сумму предавторизации deposit.do
- Запрос отмены оплаты заказа reverse.do
- Запрос полного или частичного возврата средств оплаты заказа refund.do
- Запрос сведений о кассовом чеке getReceiptStatus.do
- Расширенный запрос состояния заказа getOrderStatusExtended.do
- Запрос закрытия ОФД чека closeOfdReceipt.do
- Запрос возврата средств без привязки к товарной позиции processRawSumRefund.do
- Запрос возврата средств по свободной товарной позиции processRawPositionRefund.do