API кассы
- 1 Термины и определения
- 2 Использование API
- 3 Адреса интеграции
- 4 Идентификация заказа и сессии
- 5 Транспорт и протокол
- 6 Аутентификация
- 7 Коды ответа
- 8 Коды ошибок и их описание
- 8.1 Объект ошибки
- 9 Сценарии интеграции
- 10 Схема взаимодействия
- 10.1 QR-код
- 10.2 Selfie2Pay
- 11 Объект заказа (Order)
- 11.1 Объект Purchases
- 12 Создать заказ
- 12.1 Формат запроса
- 12.2 Формат ответа
- 13 Создать заказ (1С)
- 13.1 Формат запроса
- 13.2 Формат ответа
- 14 Получить заказ
- 14.1 Формат запроса
- 14.2 Формат ответа
- 15 Получить статус заказа
- 16 Обновить заказа
- 16.1 Формат запроса
- 16.2 Формат ответа
- 17 Закрыть заказ
- 17.1 Закрытие заказа (базовый)
- 17.1.1 Формат запроса
- 17.1.2 Формат ответа
- 17.2 Закрытие заказа (опциональный)
- 17.2.1 Формат запроса
- 17.2.2 Формат ответа
- 17.1 Закрытие заказа (базовый)
- 18 Получить все заказы
- 18.1 Формат запроса
- 18.2 Формат ответа
- 19 Возврат денег
- 19.1 Формат запроса
- 19.2 Формат ответа
- 20 Отмена оплаты
- 20.1 Формат запроса
- 20.2 Формат ответа
- 21 Отмена заказа
- 21.1 Формат запроса
- 21.2 Формат ответа
- 22 Сохранить настройки кассы
- 22.1 Формат запроса
- 22.2 Формат ответа
- 23 Получить настройки кассы
- 23.1 Формат запроса
- 23.2 Формат ответа
- 24 Полный список методов
Термины и определения
Касса - ПО у мерчанта.
Мерчант - предприятие, поставщик товаров и/или услуг, подключающее себе сервис оплаты SWiP.
Интегратор - сотрудник кассы/мерчанта/сторонний, который осуществляет соединение кассы мерчанта с системой SWiP и дальнейшую поддержку.
Биометрический терминал Selfie2Pay - устройство, через которое совершается бесконтактная оплата по биометрии лица.
Внешняя лояльность - программа лояльности, которую предоставляет мерчант/касса.
Двухстадийная оплата - операция по оплате, которая требует дополнительного подтверждения.
Холдирование - клиент вносит оплату и деньги замораживаются на его банковской карте. Пока деньги заморожены можно списать деньги или отменить платеж в течение установленного времени (срок отмены платежа может быть изменен в настройках).
Списание - замороженные деньги списываются после подтверждения.
Использование API
Cashbox API - программный интерфейс для работы с онлайн-платежами, выполненными с помощью сервиса SWiP. Позволяет совершать платежи и выполнять их отмену, осуществлять возвраты, получать выписку со всеми заказами, произведенными через платежную систему SWiP.
Адреса интеграции
Адрес интеграционной среды https://capi-test.smartwallet.ru.
Адрес продакшн среды https://capi3.smartwallet.ru.
Идентификация заказа и сессии
Идентификаторами заказа являются поля id
и merchantOrderId
.
| Идентификатор в системе SWiP. Касса не должна его ставить. Касса создает заказ, посылая объект заказа (Order). Обратно приходит так же объект Order c установленным полем id. Дальше это поле используется в запросах GET. |
---|---|
| Идентификатор заказа у мерчанта. |
Идентификатором сессии является поле sessionCode.
| Идентификатор сессии (текстовое значение зашифрованное в QR-коде). Если касса работает в режиме ресторана, то QR-код берется из ответа сервера на запрос создания заказа. |
---|
Транспорт и протокол
В качестве транспорта используется HTTPS протокол. Сообщения представлены в JSON формате.
Аутентификация
Аутентификация осуществляется по статическому токену, который надо передавать в заголовке HTTP-запросов.
Список заголовков, которые необходимо обязательно передавать в каждом API запросе:
Authorization | Bearer 8c6b8b64-6815-6084-0a3e-178401251b68 | Токен передает сотрудник SWiP после подключения мерчанта. |
X-Merchant-ID | ABCD | Значение передает сотрудник SWiP после подключения мерчанта. Сейчас используются четырехбуквенные коды, в дальнейшем значения могут расшириться. |
X-Store-ID | Shipilovo | Идентификатор торговой точки, который передает сотрудник SWiP после подключения мерчанта. Это значение берется из системы мерчанта: либо реальный идентификатор магазина, либо, если его невозможно получить из кассы, значение из настроек плагина SWiP.
|
X-Cash-ID | 1231 | Номер кассы в системе мерчанта. На стороне SWiP идентификатор не проверяется и не регистрируется. В дальнейшем используется для статистики по торговым точкам. |
Api-Version* | 3 | Версия API. |
* Данный документ действителен для версии API 2 и выше.
Коды ответа
200 | Успешный запрос. |
|
400 | Неправильный запрос из-за нарушения правил взаимодействия с API. | bad_request |
401 | Неудачная авторизация. | unauthorized |
403 | Доступ запрещен. | forbidden |
404 | Ресурс по указанному id не был найден в системе SWiP. | not_found |
405 | Используется запрещенный или неподдерживаемый метод. | method_not_allowed |
429 | Отправлено слишком много запросов за короткий промежуток времени. | too_many_request |
500 | Внутренняя ошибка сервера. | internal_server_error |
Коды ошибок и их описание
1 | INTERNAL SERVER ERROR |
2 | AUTHENTICATION ERROR |
4 | ACCESS DENIED |
5 | VALIDATION FAILED |
6 | ILLEGAL STATE |
7 | METHOD NOT SUPPORTED |
8 | DUPLICATE |
9 | NOT FOUND |
10 | UNSUPPORTED MESSAGE |
11 | ORDER FLOW VIOLATION |
12 | SMS CODE EXPIRED |
13 | OPERATION TIMED OUT |
14 | DOESNT MATCH |
15 | PAYMENTS BLOCKED |
16 | TOKEN EXPIRED |
17 | JWT TOKEN ERROR |
18 | CONCURRENT PAYMENT ERROR |
19 | BANK PAYMENT ERROR |
20 | PAYMENT CARD BLOCKED |
21 | ACCOUNTING ERROR |
22 | REQUEST LIMIT EXCEEDED |
23 | EXTERNAL SYSTEM ERROR |
24 | CASHBACK PAYMENT ERROR |
25 | OPERATION IN PROGRESS |
26 | CUSTOMER DUPLICATE PIN |
27 | REVERSE UNAVAILABLE |
28 | ORDER ALREADY EXISTS |
29 | ORDER ALREADY REFUNDED |
30 | ORDER ALREADY CONFIRMED |
31 | ORDER NOT PAID |
32 | EXCESS TOTAL AMOUNT |
Объект ошибки
Если возвращается HTTP-код 200, запрос выполнен успешно. Если HTTP-код 4xx или 5хх, значит произошла ошибка и вернется следующий объект:
1
2
3
4
5
6
7
8
9
10
11
{
"code": 0, // код внутренней ошибки SWiP
"description": "string", // описание ошибки
"fieldErrors": [ // массив объектов с детальным описанием
{
"field": "string", // поле, в котором произошла ошибка
"message": "string", // детали ошибки
"objectName": "string" // класс объекта, у которого произошла ошибка
}
]
}
Сценарии интеграции
Есть несколько сценариев интеграции Cashbox API. Они зависят от способа оплаты и настроек магазина.
Сеть розничных магазинов, фастфуд
Пример реализации:
Пользователь делает заказ на кассе.
Касса создает заказ, передает в заголовках API запросов параметры (подробнее в главе Аутентификация):
X-Merchant-ID - идентификатор мерчанта;
X-Store-ID - идентификатор торговой точки в системе мерчанта;
X-Cash-ID - номер кассы в системе мерчанта.Пользователь подтверждает оплату.
Касса закрывает заказ и печатает фискальный чек.
Вендинговый аппарат
Пример реализации:
Пользователь выбирает товар на вендинговом аппарате.
Вендинговый аппарат создает заказ, передает в заголовках API запросов параметры (подробнее в главе Аутентификация):
X-Merchant-ID - идентификатор мерчанта;
X-Store-ID - идентификатор торгового аппарата;
X-Cash-ID - IMEI модема или пустое значение.Пользователь подтверждает оплату и получает товар.
Касса самообслуживания
Если оплата осуществляется по QR-коду, то пример реализации, как у сети розничных магазинов, фастфудов.
Если оплата осуществляется по биометрии лица на встроенной камере RealSense, то дополнительно необходимо использовать SDK.
Схема взаимодействия
Для кассы нет разницы каким образом будет оплачен заказ - через биометрический терминал Selfie2Pay или с помощью QR-кода.
QR-код
Пунктиром обозначен метод, который будет использован, если интеграционная сторона предоставляет собственные (внешние) программы лояльности.
Selfie2Pay
Пунктиром обозначен метод, который будет использован, если интеграционная сторона предоставляет собственные (внешние) программы лояльности.
Объект заказа (Order)
Объект заказа (Order) содержит всю информацию о заказе, актуальную на текущий момент времени. Он формируется при создании заказа и приходит в ответ на некоторые запросы.
В объекте заказа могут приходить другие поля, которые касса сейчас не использует. Их необходимо игнорировать.
* поля, которые проставляются при создании заказа кассой.
| UUID | Идентификатор заказа в системе SWiP. |
| string | Идентификатор заказа в системе мерчанта. |
| integer | Версия API, по которой оплачен заказ. |
| string | Авторизационный код платежа. |
| double | Сумма кэшбэка. |
| double | Сумма, которую касса считает к закрытию заказа. Значение присутствует после закрытия заказа. |
| string | Идентификатор клиента оплатившего заказ. Значение присутствует после закрытия заказа. |
| string | Номер дисконтной карты клиента. |
| string | Текстовое описание последней ошибки при оплате заказа. |
| string | Номер кассы или группы касс на стороне мерчанта (ставить не нужно, берется из заголовков HTTP-запроса). |
| string | Имя кассира. |
| string | Идентификатор кассира. Применимо к кассам, которые проставляют этот параметр. |
| string | Описание сферы деятельности мерчанта. |
| double | Внешняя комиссия мерчанта. |
| double | Скидка, которую предоставляет мерчант. |
| string | Идентификатор мерчанта в системе SWiP. |
| string | Название мерчанта. |
| string | Номер заказа в системе мерчанта (обычно печатается в чеке). |
| string | Идентификатор изображения в профиле мерчанта. |
| string | Идентификатор торговой точки (ставить не нужно, берется из заголовков HTTP-запроса). |
| string | Номер заказа в банке-эквайере. |
| OrderStatus | Статус заказа. Возможные значения: OPEN, CLOSED, LOYALTY_CALCULATION. |
| double | Сумма, оплаченная клиентом через приложение. Значение присутствует после подтверждения оплаты банком. |
| string | Маскированый номер карты. |
| PaymentMethod | Способ оплаты. Возможные значения: CARD, CREDIT, CASH. |
| PaymentSystem | Платежная система. Возможные значения: MIR, AMEX, VISA, MASTERCARD, MAESTRO. |
| object | Список покупок. |
| double | Сумма возврата по заказу. |
| string | Уникальный идентификатор банковской транзакции, который назначается банком Эквайером при инициализации платежа. |
| long | Время продажи в системе мерчанта (в миллисекундах с 01.01.1970). Совпадение даты создания и даты, которая будет напечатана на чеке не обязательно. |
| string | QR-код. |
| string | Форматированный текст (80 символов в ширину) с банковской информацией о платеже. |
| double | Скидка (сумма баллов и дисконта), которую предоставляет SWiP. |
| string | Номер банковского терминала. |
| double | Сумма покупки с учетом скидки. |
| double | Сумма покупки без скидки. |
| double | Сумма, оплаченная клиентом через приложение, но не подтвержденная кассой (paid>=unconfirmed). |
Объект Purchases
| UUID | Идентификатор товара. |
| string | Артикул (идентификатор) товара в системе мерчанта. |
| string | Название товара. |
| double | Количество (штук, килограмм, литров). |
| double | Скидка, предоставляемая мерчантом. |
| double | Цена. |
| double | Стоимость (price * quantity). |
| Unit | Единицы измерения (LITERS, KILOGRAMS, PIECES). |
Пример объекта ORDER
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
{
"apiVersion": 3,
"authorizationCode": "string",
"cashback": 0.0,
"closeAmount": 0.0,
"customerId": null,
"discountCard": "string",
"error": "string",
"id": "1374289e-12fd-47e1-b111-0c6ae5568ff1",
"merchantCash": "88",
"merchantCashier": "Маслова Вера",
"merchantCashierId": "77527945-9a53-4849-a732-bd8736b39144",
"merchantCategory": "Электроника",
"merchantCommission": 0,
"merchantDiscount": 0,
"merchantId": "VZLT",
"merchantName": "shop",
"merchantOrderId": "1374289e-12fd-47e1-b111-0c6ae5568ff1",
"merchantOrderNumber": "11",
"merchantProfileImageId": "175bdc4f-9c3d-4465-89e0-a5bce381d381",
"merchantStore": "3",
"orderNumber": "28048058915136358726242016980679",
"orderStatus": "OPEN",
"paid": 0.0,
"pan": "string",
"paymentMethod": "CARD",
"paymentSystem": "MIR",
"purchases": [
{
"id": "b314fd4e-df92-427b-a2f9-1da10dcefb78",
"merchantDiscount": 0,
"name": "Sprite 0,33 л",
"productId": null,
"quantity": 0,
"unit": "string",
"price": 50.0,
"amount": 50.0,
}
],
"refunded": 0,
"rrn": "string",
"saleDate": 1540485815026,
"sessionCode": "https://swip.one/?qr=6794742",
"slip": "...very long text...",
"swipDiscount": 0,
"terminalNo": "string",
"total": 50.0,
"totalOriginal": 50.0,
"unconfirmed": 0.0
}
Создать заказ
Чтобы отправить заказ на оплату, необходимо создать объект заказа - Order. Он содержит всю необходимую информацию для проведения оплаты.
Если в этом есть необходимость, в объекте Purchases можно передавать всегда один товар, к примеру какую-то услугу или сервис.
Для касс, которые работают в режиме фастфуда или розничной торговли, заказ может находиться в статусе OPEN 10 минут. Для касс, работающих в режиме ресторана, - 10 часов.
Формат запроса
1
POST /orders
Для создания заказа необходимо отправить запрос с передачей следующих параметров:
| string, необязательный | Текстовое значение QR-кода. |
| string, обязательный | Уникальный идентификатор заказа у мерчанта. |
| string, необязательный | Номер заказа в системе мерчанта (обычно печатается в чеке). |
| string, обязательный | Имя кассира. |
| string, необязательный | Идентификатор кассира. Применимо к кассам, которые проставляют этот параметр. |
| long, обязательный | Время продажи в системе мерчанта (в миллисекундах с 01.01.1970). Совпадение даты создания и даты, которая будет напечатана на чеке не обязательно. |
| double, обязательный | Сумма покупки с учетом скидки. |
| double, обязательный | Сумма без скидки. |
| class, обязательный | Список покупок. |
| UUID, необязательный | Идентификатор товара. |
| string, необязательный | Артикул (идентификатор) товара в системе мерчанта. |
| string, обязательный | Название товара. |
| double, обязательный | Количество (штук, килограмм, литров). |
| double, необязательный | Скидка, предоставляемая мерчантом. |
| double, обязательный | Цена. |
| double, обязательный | Стоимость (price * quantity). |
| Unit, необязательный | Единицы измерения (LITERS, KILOGRAMS, PIECES). |
Пример тела запроса
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
"guests": 0, // количество гостей
"merchantCashier": "Маслова Вера", // имя кассира
"merchantCashierId": "77527945-9a53-4849-a732-bd8736b39144", // идентификатор кассира
"merchantOrderId": "1374289e-12fd-47e1-b111-0c6ae5568ff1", // уникальный идентификатор заказа у мерчанта
"merchantOrderNumber": "11", // номер заказа в системе мерчанта (обычно печатается в чеке)
"purchases": [
{
"id": "b314fd4e-df92-427b-a2f9-1da10dcefb78", // идентификатор товара
"merchantDiscount": 0, // скидка, предоставляемая мерчантом
"name": "Sprite 0,33 л", // наименование товара
"productId": null, // артикул товара в системе мерчанта
"quantity": 0, // количество (в выбранных единицах измерения)
"unit": "string", // единицы измерения (LITERS, KILOGRAMS, PIECES)
"price": 50.0, // цена товара
"amount": 50.0, // общая сумма (цена * количество)
}
],
"saleDate": 1540485815026, // время продажи в системе мерчанта (в миллисекундах с 01.01.1970)
"sessionCode": "https://swip.one/?qr=6794742", // текстовое значение QR-кода
"total": 50.0, // сумма с учетом скидки
"totalOriginal": 50.0 // сумма без учета скидки
}
Формат ответа
В ответ на запрос придет тот же заказ с проставленными полями: id - SWiP orderId, sessionCode.
Если sessionCode был отправлен пустым, то обратно вернется заполненное поле, его надо напечатать в пречеке или показать на экране (кассовом) покупателю.
Пример тела ответа
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
{
"apiVersion": 3, // версия API
"authorizationCode": "string", // авторизационный код платежа
"cashback": 0.0, // размер кэшбэка
"closeAmount": 0.0,
"customerId": null,
"discountCard": "string", // номер дисконтной карты клиента
"error": "string", // последняя ошибка при оплате заказа
"id": "1374289e-12fd-47e1-b111-0c6ae5568ff1", // идентификатор заказа в системе SWiP
"merchantCash": "88", // идентификатор кассы или группы касс
"merchantCashier": "Маслова Вера", // имя кассира
"merchantCashierId": "77527945-9a53-4849-a732-bd8736b39144", // идентификатор кассира
"merchantCategory": "Электроника", // категория мерчанта
"merchantCommission": 0, // внешняя комиссия мерчанта
"merchantDiscount": 0, // скидка, предоставляемая мерчантом
"merchantId": "VZLT", // идентификатор мерчанта
"merchantName": "shop", // название мерчанта
"merchantOrderId": "1374289e-12fd-47e1-b111-0c6ae5568ff1", // уникальный идентификатор заказа у мерчанта
"merchantOrderNumber": "11", // номер заказа в системе мерчанта (обычно печатается в чеке)
"merchantProfileImageId": "175bdc4f-9c3d-4465-89e0-a5bce381d381", // идентификатор изображения в профиле мерчанта
"merchantStore": "3", // идентификатор торговой точки
"orderNumber": "28048058915136358726242016980679", // номер заказа
"orderStatus": "OPEN", // статус заказа
"paid": 0.0,
"pan": "string", // маскированный номер карты
"paymentMethod": "CARD", // способ оплаты
"paymentSystem": "MIR", // платежная система
"purchases": [ // список покупок (товары в чеке)
{
"id": "b314fd4e-df92-427b-a2f9-1da10dcefb78", // идентификатор товара в системе SWiP
"merchantDiscount": 0, // скидка, предоставляемая мерчантом
"name": "Sprite 0,33 л", // наименование товара
"productId": null, // идентификатор товара в системе мерчанта
"quantity": 0, // количество (в выбранных единицах измерения)
"unit": "string", // единицы измерения (LITERS, KILOGRAMS, PIECES)
"price": 50.0, // цена товара
"amount": 50.0, // общая сумма (цена * количество)
}
],
"refunded": 0,
"rrn": "string", // уникальный идентификатор банковской транзакции
"saleDate": 1540485815026, // время продажи в системе мерчанта (в миллисекундах с 01.01.1970)
"sessionCode": "https://swip.one/?qr=6794742", // текстовое значение QR-кода
"slip": "...very long text...", // форматированный текст с банковской информацией о платеже
"swipDiscount": 0, // скидка (сумма баллов и дисконта), которую предоставляет SWiP
"terminalNo": "string", // номер банковского терминала
"total": 50.0, // сумма (с учетом скидки, если таковая есть у клиента)
"totalOriginal": 50.0, // сумма (без учета скидки)
"unconfirmed": 0.0 // сумма, оплаченная клиентом через приложение, но не подтвержденная кассой
}
Создать заказ (1С)
Чтобы отправить заказ на оплату, необходимо создать объект заказа - Order. Он содержит всю необходимую информацию для проведения оплаты.
Формат запроса
1
POST /1с-orders
Для создания заказа необходимо отправить запрос с передачей следующих параметров:
| string, обязательный | Текстовое значение QR-кода. | Строка длиной от 1 до 100 символов. |
| string, обязательный | Уникальный идентификатор заказа у мерчанта. | Формат UUID. |
| string, обязательный | Номер заказа в системе мерчанта. | Наличие только цифр. |
| string, обязательный | Имя кассира. | Строка длиной от 0 до 50 символов. |
| string, обязательный | Идентификатор кассира. | Строка длиной от 0 до 50 символов. |
| long, обязательный | Время продажи в системе мерчанта (в миллисекундах с 01.01.1970). | Ненулевое значение. |
| double, обязательный | Сумма покупки с учетом скидки. | Ненулевое значение. |
| double, обязательный | Сумма без скидки. | Ненулевое значение. |
| class, обязательный | Список покупок. | Ненулевое значение, в списке должен быть минимум 1 объект. |
Пример тела запроса
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{
"id": "string",
"merchantCashier": "string", // имя кассира
"merchantCashierId": "string", // идентификатор кассира
"merchantOrderId": "string", // уникальный идентификатор заказа у мерчанта
"merchantOrderNumber": "string", // номер заказа в системе мерчанта (обычно печатается в чеке)
"purchases": [
{
"amount": 0,
"discount": 0,
"id": "string",
"merchantDiscount": 0,
"name": "string",
"price": 0,
"productId": "string",
"quantity": 0,
"unit": "string",
}
],
"saleDate": "2019-07-16T08:09:42.276Z", // время продажи в системе мерчанта (в миллисекундах с 01.01.1970)
"sessionCode": "string", // текстовое значение QR-кода
"total": 0, // сумма с учетом скидки
"totalOriginal": 0 // сумма без скидки
}
Формат ответа
В ответ на запрос придет тот же заказ с проставленными полями: id - SWiP orderId, sessionCode. Если sessionCode был отправлен пустым, то обратно вернется заполненное поле, его надо напечатать в пречеке или показать на экране (кассовом) покупателю.
Пример тела ответа
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
{
"apiVersion": 3,
"authorizationCode": "string",
"cashback": 0.0,
"closeAmount": 0.0,
"customerId": null,
"discountCard": "string",
"error": "string",
"id": "1374289e-12fd-47e1-b111-0c6ae5568ff1",
"merchantCash": "88",
"merchantCashier": "Маслова Вера",
"merchantCashierId": "77527945-9a53-4849-a732-bd8736b39144",
"merchantCategory": "Электроника",
"merchantCommission": 0,
"merchantDiscount": 0,
"merchantId": "VZLT",
"merchantName": "shop",
"merchantOrderId": "1374289e-12fd-47e1-b111-0c6ae5568ff1",
"merchantOrderNumber": "11",
"merchantProfileImageId": "175bdc4f-9c3d-4465-89e0-a5bce381d381",
"merchantStore": "3",
"orderNumber": "28048058915136358726242016980679",
"orderStatus": "OPEN",
"paid": 0.0,
"pan": "string",
"paymentMethod": "CARD",
"paymentSystem": "MIR",
"purchases": [
{
"id": "b314fd4e-df92-427b-a2f9-1da10dcefb78",
"merchantDiscount": 0,
"name": "Sprite 0,33 л",
"productId": null,
"quantity": 0,
"unit": "string",
"price": 50.0,
"amount": 50.0,
}
],
"refunded": 0,
"rrn": "string",
"saleDate": 1540485815026,
"sessionCode": "https://swip.one/?qr=6794742",
"slip": "...very long text...",
"swipDiscount": 0,
"terminalNo": "string",
"total": 50.0,
"totalOriginal": 50.0,
"unconfirmed": 0.0
}
Получить заказ
Запрос позволяет получить информацию о текущем состоянии заказа по его уникальному идентификатору.
Формат запроса
1
GET /orders/{id}
Для получения текущего состояния заказа необходимо отправить запрос с передачей следующих параметров:
| string, обязательный | Уникальный идентификатор заказа в системе SWiP. |
Формат ответа
В ответ на запрос приходит объект заказа в актуальном статусе.
Пример тела ответа
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
{
"apiVersion": 3,
"authorizationCode": "string",
"cashback": 0.0,
"closeAmount": 0.0,
"customerId": null,
"discountCard": "string",
"error": "string",
"id": "1374289e-12fd-47e1-b111-0c6ae5568ff1",
"merchantCash": "88",
"merchantCashier": "Маслова Вера",
"merchantCashierId": "77527945-9a53-4849-a732-bd8736b39144",
"merchantCategory": "Электроника",
"merchantCommission": 0,
"merchantDiscount": 0,
"merchantId": "VZLT",
"merchantName": "shop",
"merchantOrderId": "1374289e-12fd-47e1-b111-0c6ae5568ff1",
"merchantOrderNumber": "11",
"merchantProfileImageId": "175bdc4f-9c3d-4465-89e0-a5bce381d381",
"merchantStore": "3",
"orderNumber": "28048058915136358726242016980679",
"orderStatus": "OPEN",
"paid": 0.0,
"pan": "string",
"paymentMethod": "CARD",
"paymentSystem": "MIR",
"purchases": [
{
"id": "b314fd4e-df92-427b-a2f9-1da10dcefb78",
"merchantDiscount": 0,
"name": "Sprite 0,33 л",
"productId": null,
"quantity": 0,
"unit": "string",
"price": 50.0,
"amount": 50.0,
}
],
"refunded": 0,
"rrn": "string",
"saleDate": 1540485815026,
"sessionCode": "https://swip.one/?qr=6794742",
"slip": "...very long text...",
"swipDiscount": 0,
"terminalNo": "string",
"total": 50.0,
"totalOriginal": 50.0,
"unconfirmed": 0.0
}
Получить статус заказа
Запрашивает статус оплаты на сервере SWiP.
Формат запроса
1
GET /orders/{id}/status
Для получения статуса заказа необходимо отправить запрос с передачей следующих параметров:
| string, обязательный | Уникальный идентификатор заказа в системе SWiP. |
Формат ответа
В ответ на запрос приходит набор параметров.
Пример тела ответа
1
2
3
4
5
6
7
8
{
"totalOriginal":210.0,
"total":210.0,
"paid":0.0,
"unconfirmed":0.0,
"refunded":0.0,
"status":"CLOSED"
}
Поле status
может принимать следующие значения:
OPEN | Заказ открыт. |
CLOSED | Заказ закрыт. |
LOYALTY_CALCULATION | По заказу проведен расчёт внешней лояльности. Необходимо выполнить обновление заказа. |
Варианты статусов заказа и порядок их изменений
Касса ожидает проведения оплаты 45 секунд. Если за это время не произойдет оплата, касса закрывает заказ с amount=0.
Заказ может иметь следующие статусы: OPEN, CLOSED, LOYALTY_CALCULATION.
Оплата определяется по полю paid
. Допустим, что проводится оплата на 100 рублей:
Создание заказа:
status=OPEN, totalOriginal=100, total=100, paid=0, unconfirmed=0
Проведение оплаты:
status=OPEN, totalOriginal=100, total=100, paid=100, unconfirmed=100
Закрытие заказа:
status=CLOSED, totalOriginal=100, total=100, paid=100, unconfirmed=0
Если закрыть заказ с amount=0, то происходит отмена оплаты: status=CLOSED, totalOriginal=100, total=100, paid=0, unconfirmed=0
Обновить заказа
Данный метод используется только, если поле status
имеет значение LOYALTY_CALCULATION
.
Обновляет сумму заказа после расчёта внешней лояльности.
Формат запроса
1
PUT /orders/{id}
Для обновления заказа необходимо отправить запрос с передачей следующих параметров:
| string, обязательный | Уникальный идентификатор заказа в системе SWiP. |
| double, обязательный | Скидка, которую предоставляет мерчант. |
| double, обязательный | Баллы для списания, которые предоставляет мерчант. |
| object, обязательный | Список покупок. |
| double, обязательный | Сумма покупки с учётом скидки. |
Пример тела запроса
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
"merchantDiscount": 0, // cкидка, которую предоставляет мерчант
"merchantPoints": 0, // баллы для списания, которые предоставляет мерчант
"points": { // расширенная версия баллов, для указания:
"added": 0, // полученных баллов;
"removed": 0, // списанных баллов;
"total": 0 // оставшихся баллов.
},
"purchases": [ // список покупок
{
"amount": 0,
"discount": 0,
"id": "string",
"merchantDiscount": 0,
"name": "string",
"price": 0,
"productId": "string",
"quantity": 0,
"unit": "string",
}
],
"total": 0 // сумма покупки со скидкой
}
Формат ответа
В ответ на запрос приходит объект заказа в актуальном статусе.
Пример тела ответа
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
{
"apiVersion": 3,
"authorizationCode": "string",
"cashback": 0.0,
"closeAmount": 0.0,
"customerId": null,
"discountCard": "string",
"error": "string",
"id": "1374289e-12fd-47e1-b111-0c6ae5568ff1",
"merchantCash": "88",
"merchantCashier": "Маслова Вера",
"merchantCashierId": "77527945-9a53-4849-a732-bd8736b39144",
"merchantCategory": "Электроника",
"merchantCommission": 0,
"merchantDiscount": 0,
"merchantId": "VZLT",
"merchantName": "shop",
"merchantOrderId": "1374289e-12fd-47e1-b111-0c6ae5568ff1",
"merchantOrderNumber": "11",
"merchantProfileImageId": "175bdc4f-9c3d-4465-89e0-a5bce381d381",
"merchantStore": "3",
"orderNumber": "28048058915136358726242016980679",
"orderStatus": "OPEN",
"paid": 0.0,
"pan": "string",
"paymentMethod": "CARD",
"paymentSystem": "MIR",
"purchases": [
{
"id": "b314fd4e-df92-427b-a2f9-1da10dcefb78",
"merchantDiscount": 0,
"name": "Sprite 0,33 л",
"productId": null,
"quantity": 0,
"unit": "string",
"price": 50.0,
"amount": 50.0,
}
],
"refunded": 0,
"rrn": "string",
"saleDate": 1540485815026,
"sessionCode": "https://swip.one/?qr=6794742",
"slip": "...very long text...",
"swipDiscount": 0,
"terminalNo": "string",
"total": 50.0,
"totalOriginal": 50.0,
"unconfirmed": 0.0
}
Закрыть заказ
Закрытие заказа (базовый)
Вызывает базовый метод закрытия заказа.
Метод закрытия заказа может быть вызван только один раз. В теле запроса необходимо обязательно передать сумму к закрытию. В случае ошибки в процессе закрытия или отсутствия суммы к закрытию, деньги за заказ будут возвращены.
Если этот метод не был вызван в течение 10 минут после поступления денежных средств на кассу, то деньги за заказ будут возвращены.
Формат запроса
1
POST /orders/{id}/actions/close
Для закрытия заказа необходимо отправить запрос с передачей следующих параметров:
| string, обязательный | Уникальный идентификатор заказа в системе SWiP. |
| double, обязательный | Сумма, которую касса передает к закрытию заказа. |
Пример тела запроса
1
2
3
{
"amount":50.0
}
Формат ответа
В ответ на запрос приходит объект заказа в актуальном статусе.
Пример тела ответа
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
{
"apiVersion": 3,
"authorizationCode": "string",
"cashback": 0.0,
"closeAmount": 0.0,
"customerId": null,
"discountCard": "string",
"error": "string",
"id": "1374289e-12fd-47e1-b111-0c6ae5568ff1",
"merchantCash": "88",
"merchantCashier": "Маслова Вера",
"merchantCashierId": "77527945-9a53-4849-a732-bd8736b39144",
"merchantCategory": "Электроника",
"merchantCommission": 0,
"merchantDiscount": 0,
"merchantId": "VZLT",
"merchantName": "shop",
"merchantOrderId": "1374289e-12fd-47e1-b111-0c6ae5568ff1",
"merchantOrderNumber": "11",
"merchantProfileImageId": "175bdc4f-9c3d-4465-89e0-a5bce381d381",
"merchantStore": "3",
"orderNumber": "28048058915136358726242016980679",
"orderStatus": "OPEN",
"paid": 0.0,
"pan": "string",
"paymentMethod": "CARD",
"paymentSystem": "MIR",
"purchases": [
{
"id": "b314fd4e-df92-427b-a2f9-1da10dcefb78",
"merchantDiscount": 0,
"name": "Sprite 0,33 л",
"productId": null,
"quantity": 0,
"unit": "string",
"price": 50.0,
"amount": 50.0,
}
],
"refunded": 0,
"rrn": "string",
"saleDate": 1540485815026,
"sessionCode": "https://swip.one/?qr=6794742",
"slip": "...very long text...",
"swipDiscount": 0,
"terminalNo": "string",
"total": 50.0,
"totalOriginal": 50.0,
"unconfirmed": 0.0
}
Закрытие заказа (опциональный)
Данный метод необходим, если система интеграционной стороны не имеет возможности передавать сумму к закрытию заказа.
Формат запроса
1
POST /orders/{id}/actions/confirm-and-close
Для подтверждения оплаты и закрытия заказа необходимо отправить запрос с передачей следующих параметров:
| string, обязательный | Уникальный идентификатор заказа в системе SWiP. |
Формат ответа
В ответ на запрос приходит объект заказа в актуальном статусе.
Пример тела ответа
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
{
"apiVersion": 3,
"authorizationCode": "string",
"cashback": 0.0,
"closeAmount": 0.0,
"customerId": null,
"discountCard": "string",
"error": "string",
"id": "1374289e-12fd-47e1-b111-0c6ae5568ff1",
"merchantCash": "88",
"merchantCashier": "Маслова Вера",
"merchantCashierId": "77527945-9a53-4849-a732-bd8736b39144",
"merchantCategory": "Электроника",
"merchantCommission": 0,
"merchantDiscount": 0,
"merchantId": "VZLT",
"merchantName": "shop",
"merchantOrderId": "1374289e-12fd-47e1-b111-0c6ae5568ff1",
"merchantOrderNumber": "11",
"merchantProfileImageId": "175bdc4f-9c3d-4465-89e0-a5bce381d381",
"merchantStore": "3",
"orderNumber": "28048058915136358726242016980679",
"orderStatus": "OPEN",
"paid": 0.0,
"pan": "string",
"paymentMethod": "CARD",
"paymentSystem": "MIR",
"purchases": [
{
"id": "b314fd4e-df92-427b-a2f9-1da10dcefb78",
"merchantDiscount": 0,
"name": "Sprite 0,33 л",
"productId": null,
"quantity": 0,
"unit": "string",
"price": 50.0,
"amount": 50.0,
}
],
"refunded": 0,
"rrn": "string",
"saleDate": 1540485815026,
"sessionCode": "https://swip.one/?qr=6794742",
"slip": "...very long text...",
"swipDiscount": 0,
"terminalNo": "string",
"total": 50.0,
"totalOriginal": 50.0,
"unconfirmed": 0.0
}
Получить все заказы
Запрашивает список заказов за указанный период. Необходим, если на кассе произошел сбой.
Данный метод возвращает заказы только в статусе CLOSED.
Формат запроса
1
GET /orders
Для получения списка заказов за указанный день необходимо отправить запрос с передачей следующих параметров:
| queryParam, long | Дата начала периода (в миллисекундах с 01.01.1970). |
| queryParam, long | Дата окончания периода (в миллисекундах с 01.01.1970). |
Если период не будет указан, то сервер вернет список заказов за текущий день.
Формат ответа
В ответ на запрос приходит список объектов заказа за текущий день.
Пример тела ответа
1
2
3
4
5
6
7
8
9
10
11
[
{
order 1
},
{
order 2
},
{
order N
}
]
Возврат денег
Создание возврата возможно только для заказов в статусе CLOSED.
Возвращает успешно завершенный платеж по уникальному идентификатору заказа. Можно возвращать оплату по заказу полностью или частично. Возможно сделать сколько угодно частичных возвратов, если их сумма не превышает размер платежа.
Формат запроса
1
POST /refunds
Для возврата денег необходимо отправить запрос с передачей следующих параметров:
| double, обязательный | Сумма возврата. |
| string, обязательный | Идентификатор заказа в системе мерчанта. |
Пример тела запроса
1
2
3
4
{
"amount":25.00,
"merchantOrderId":"d30ceaab-cc06-4f7c-bc58-2e86d336d7b3"
}
Формат ответа
В ответ на запрос приходит статус возврата.
1
2
3
4
5
6
{
"status": "SUCCESS", // or FAIL
"slip": "string", // текст с банковской информацией о платеже
"description": "Some description", // описание ошибки
"code": 0 // номер ошибки в системе SWIP
}
Отмена оплаты
Отменяет оплату для заказов в статусе CLOSED.
Данный метод выполняет горячую отмену платежа, по которому денежные средства были захолдированы и ещё не списаны. Денежные средства замораживаюся на 1 час. Если списание было проведено, вернется ошибка с кодом 27. В таком случае необходимо выполнить возврат.
Формат запроса
1
POST /reverses
Для отмены оплаты необходимо отправить запрос с передачей следующих параметров:
| double, необязательный | Сумма отмены оплаты. |
| string, обязательный | Идентификатор заказа в системе мерчанта. |
Пример тела запроса
1
2
3
4
{
"amount":25.00,
"merchantOrderId":"d30ceaab-cc06-4f7c-bc58-2e86d336d7b3"
}
Формат ответа
В ответ на запрос приходит статус отмены оплаты.
Пример тела ответа
1
2
3
4
5
6
{
"status": "SUCCESS", // or FAIL
"slip": "string", // текст с банковской информацией о платеже
"description": "Some description", // описание ошибки
"code": 0 // номер ошибки в системе SWIP
}
Отмена заказа
Данный метод необходим в случае тайм-аута на кассе или других причин, по которым надо выполнить отмену.
Отменяет заказ, находящийся в статусе OPEN (до проведения оплаты на кассе).
Формат запроса
1
POST /orders/{id}/actions/close
Для отмены заказа необходимо отправить запрос с передачей следующих параметров:
| string, обязательный | Уникальный идентификатор заказа в системе SWiP. |
| double, необязательный | Сумма, которую касса передает к отмене. |
Пример тела запроса
1
2
3
{
"amount":0.0
}
Тело запроса не является обязательным. При его отсутствии происходит отмена всего заказа.
Формат ответа
В ответ на запрос придет объект заказа в актуальном статусе.
Пример тела ответа
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
{
"apiVersion": 3,
"authorizationCode": "string",
"cashback": 0.0,
"closeAmount": 0.0,
"customerId": null,
"discountCard": "string",
"error": "string",
"id": "1374289e-12fd-47e1-b111-0c6ae5568ff1",
"merchantCash": "88",
"merchantCashier": "Маслова Вера",
"merchantCashierId": "77527945-9a53-4849-a732-bd8736b39144",
"merchantCategory": "Электроника",
"merchantCommission": 0,
"merchantDiscount": 0,
"merchantId": "VZLT",
"merchantName": "shop",
"merchantOrderId": "1374289e-12fd-47e1-b111-0c6ae5568ff1",
"merchantOrderNumber": "11",
"merchantProfileImageId": "175bdc4f-9c3d-4465-89e0-a5bce381d381",
"merchantStore": "3",
"orderNumber": "28048058915136358726242016980679",
"orderStatus": "OPEN",
"paid": 0.0,
"pan": "string",
"paymentMethod": "CARD",
"paymentSystem": "MIR",
"purchases": [
{
"id": "b314fd4e-df92-427b-a2f9-1da10dcefb78",
"merchantDiscount": 0,
"name": "Sprite 0,33 л",
"productId": null,
"quantity": 0,
"unit": "string",
"price": 50.0,
"amount": 50.0,
}
],
"refunded": 0,
"rrn": "string",
"saleDate": 1540485815026,
"sessionCode": "https://swip.one/?qr=6794742",
"slip": "...very long text...",
"swipDiscount": 0,
"terminalNo": "string",
"total": 50.0,
"totalOriginal": 50.0,
"unconfirmed": 0.0
}
Сохранить настройки кассы
Этот метод является опциональным и необходим, если невозможно сохранить настройки внутри кассы.
Сохраняет настройки кассы на сервере. На данный момент используется для сохранения QR-кода.
Формат запроса
1
PUT /merchant-settings/{settingName}
Для сохранения настроек кассы необходимо отправить запрос с передачей следующих параметров:
| string, обязательный | Название настройки (QR). |
| string, обязательный | Значение настройки (текстовое значение QR-кода). |
Пример тела запроса
1
2
3
4
{
"settingName": "string",
"settingValue": "string"
}
Формат ответа
В ответ на запрос приходит набор параметров с настройками кассы.
Пример тела ответа
1
2
3
4
5
6
7
{
"cashId": "string",
"merchantId": "string",
"settingName": "string",
"settingValue": "string",
"storeId": "string"
}
Получить настройки кассы
Этот метод является опциональным и необходим, если настройки кассы были сохранены на сервере.
Запрашивает на сервере значение прикрепленного к кассе QR-кода.
Формат запроса
1
GET /merchant-settings/{settingName}
Для получения настроек кассы необходимо отправить запрос с передачей следующих параметров:
| string, обязательный | Название настройки (QR). |
Формат ответа
В ответ на запрос приходит набор параметров с настройками кассы.
Пример тела ответа
1
2
3
4
5
6
7
{
"cashId": "string",
"merchantId": "string",
"settingName": "string",
"settingValue": "string",
"storeId": "string"
}
Полный список методов
POST |
|
|
| Чтобы отправить заказ на оплату, необходимо создать объект заказа - Order. Он содержит всю необходимую информацию для проведения оплаты. В ответ на запрос придет тот же заказ с проставленными полями: id - SWiP orderid, sessionCode. Если sessionCode был отправлен пустым, то обратно вернется заполненное поле, его надо напечатать в пречеке или показать на экране (кассовом) покупателю. | |
GET |
|
|
| Запрос позволяет получить информацию о текущем состоянии заказа по его уникальному идентификатору. | |
GET |
|
| 1
2
3
4
5
6
7
8
{
"totalOriginal":210.0,
"total":210.0,
"paid":0.0,
"unconfirmed":0.0,
"refunded":0.0,
"status":"CLOSED"
}
| Вызывает статус оплаты на сервере SWiP. | |
POST |
|
|
|
| Вызывает метод закрытия заказа. |
POST |
|
|
| Подтверждает и закрывает заказ. | |
GET |
|
| Запрашивает список заказов за текущий день | ||
POST |
|
|
|
| Отменяет неоплаченный заказ. |
POST |
| 1
2
3
4
{
"amount": 100.00,
"merchantOrderId": ""
} | 1
2
3
4
5
6
{
"status": "SUCCESS",
"slip": "",
"description": "",
"code": ""
} | Возвращает успешно завершенный платеж по уникальному идентификатору заказа. Создание возврата возможно только для заказов в статусе CLOSED. Можно возвращать оплату по заказу полностью или частично. | |
POST |
| 1
2
3
4
{
"amount": 100.00,
"merchantOrderId": ""
} | 1
2
3
4
5
6
{
"status": "SUCCESS",
"slip": "",
"description": "",
"code": ""
} | Отменяет оплату для заказов в статусе CLOSED. Если сделать отмену оплаты уже невозможно, то будет возвращаться ошибка с кодом 27. | |
PUT |
|
| 1
2
3
4
{
"settingName": "string",
"settingValue": "string"
} | 1
2
3
4
5
6
7
{
"cashId": "string",
"merchantId": "string",
"settingName": "string",
"settingValue": "string",
"storeId": "string"
} | Этот метод является опциональным и необходим, если невозможно сохранить настройки внутри кассы. Метод для сохранения настроек кассы на сервере. На данный момент используется для сохранения QR-кода. |
GET |
|
|
| 1
2
3
4
5
6
7
{
"cashId": "string",
"merchantId": "string",
"settingName": "string",
"settingValue": "string",
"storeId": "string"
} | Этот метод является опциональным и необходим, если настройки кассы были сохранены на сервере. Запрашивает на сервере значение прикрепленного к кассе QR-кода. |