Сценарий 1. Оплата
Pay API
Поэтапное описание сценария оплаты
Сценарий оплаты товара или услуги ТСП из приложения «Кошелёк» посредством Koshelek Pay. Описание сценария разбито на 2 этапа, при этом необходимо учитывать непрерывность выполнения сценария.
Warning
В сценарии оплаты через Koshelek Pay сканирование карты лояльности выполняется строго 1 раз (одновременно для обработки карты в системе лояльности и для оплаты покупки).
1. Регистрация товаров, считывание карты лояльности и закрытие чека
Пояснение к диаграмме:
Номер шага | Описание |
---|---|
[01]-[03] | Пользователь выбирает карту лояльности ТСП в Кошельке. Кошелёк отображает данные карты лояльности: штрихкод, включающий в себя номер карты лояльности, код сессии предъявления карты и одноразовый пароль, сгенерированный по технологии «Кошелёк TOTP» (см. Модуль Koshelek TOTP). |
[04] | Кассир сканирует штрихкод карты лояльности. Касса считывает номер карты лояльности и осуществляет проверку доступности оплаты сервисом Koshelek Pay (в штрихкоде содержится cardSession ), а также проводит валидацию парольной части (см. Модуль Кошелёк TOTP), идентифицирует покупателя и производит расчет суммы к оплате. |
[05]-[10] | Касса формирует запрос списка доступных провайдеров платежей (см. Pay API) и получает от сервера Кошелька список провайдеров, а также значение флага koshelekPayIsDefault , указывающего, выбран ли у пользователя сервис Koshelek Pay в качестве способа оплаты по умолчанию. |
[11] | Если оплата сервисом Koshelek Pay не подключена в Кошельке пользователя, происходит переход к альтернативным методам оплаты: наличные или карта. Сценарий завершён. |
[12]-[14] | (опциональные шаги) Касса обращается к ЦОД ТСП для расчёта скидок и бонусов для разных способов оплаты (традиционных и для полученных провайдеров платежей). ЦОД ТСП выполняет расчёт и возвращает кассовому терминалу для каждого провайдера маркетинговое сообщение для показа пользователю в Кошельке. Кассовое ПО формирует итоговое значение суммы платежа и скидок в чеке для каждого способа оплаты — для способа оплаты через Кошелёк итоговая сумма и сумма скидок должна быть одинаковой для всех провайдеров платежей (отличаться могут маркетинговое сообщение и последующие бонусы от ТСП после оплаты через определенного провайдера платежей). |
Алгоритм получения списка доступных провайдеров платежей:
2. Оплата
Выполнение этого этапа определяется значением флага koshelekPayIsDefault
.
koshelekPayIsDefault
= true
:
Номер шага | Описание |
---|---|
[01]-[05] | ТСП автоматически выполняет запрос формирования счёта к оплате (см. Pay API). Счёт в виде суммы к оплате передаётся на экран Кошелька пользователя. |
[06] | Пользователь инициирует оплату на экране Кошелька. |
[07]-[11] | Сервер Кошелька выполняет оплату и передаёт ТСП и пользователю информацию о статусе операции. |
[12]-[14] | ТСП отправляет серверу Кошелька чек операции (см. Pay API). Чек отображается на экране Кошелька. Сценарий завершён. |
koshelekPayIsDefault
= false
и доступен хотя бы один провайдер платежей:
Номер шага | Описание |
---|---|
[15]-[22] | Кассир называет сумму покупки с учётом применения карты лояльности и предлагает пользователю оплату сервисом Koshelek Pay. Если пользователь согласен, то кассир инициирует запрос на формирование счёта к оплате (см. Pay API). Счёт в виде суммы к оплате передаётся на экран Кошелька. |
[23] | Пользователь инициирует оплату на экране Кошелька. |
[24]-[28] | Сервер Кошелька выполняет оплату и передаёт ТСП и пользователю информацию о статусе операции. |
[29]-[31] | ТСП отправляет серверу Кошелька чек операции (см. Pay API). Чек отображается на экране Кошелька. Сценарий завершён. |
Недоступен ни один из провайдеров платежей:
Номер шага | Описание |
---|---|
[32] | На кассе отображается причина недоступности провайдеров (см. параметр message для каждого провайдера). Сценарий завершён. |
Статусы платёжной транзакции
На диаграмме состояний приведены переходы между различными статусами транзакции в процессе оплаты через Pay API.
- Зелёным цветом отмечены успешные статусы.
- Красным отмечены неуспешные статусы.
- Серым отмечены промежуточные статусы.
Обработка частных случаев оформления покупки
1. Покупка нештучного товара
В случае покупки нештучного товара (например, весового) необходимо указать:
- в параметре
measure
— единицу измерения товара; - в параметре
quantity
— количество товара (допускается только целое число) в указанной единице измерения; - в параметре
price
— цена за единицу товара в перерасчёте на единицу измерения.
Пример
В торговом зале указана стоимость 1 кг бананов: 100 руб.
Случай 1: на кассе оформляется покупка 1 кг бананов.
Тогда в запросе необходимо указать:
- Единица измерения
measure
=GRAM
илиKILOGRAM
- Количество товара
quantity
=1
(еслиmeasure
=KILOGRAM
)1000
(еслиmeasure
=GRAM
)
- Цена за единицу товара
price
=10000
копеек (еслиmeasure
=KILOGRAM
)10
копеек (еслиmeasure
=GRAM
)
Случай 2: на кассе оформляется покупка 0,5 кг бананов.
Тогда в запросе необходимо указать:
- Единица измерения
measure
=GRAM
- Количество товара
quantity
=500
- Цена за единицу товара
price
=10
копеек заGRAM
2. Количество одинаковых позиций превышает 1
Если покупатель приобретает позицию в количестве > 1, то необходимо передавать в Кошелёк информацию о точном количестве одинаковых позиций.
Только в таком случае будет успешно обработан сценарий частичного возврата товара, т.к. на стороне провайдера Долями в случае возврата проходит проверка на соответствие количества товара в отношении конкретного article
. В случае, если в оплате будет указано количество = 1, частичный возврат оформить не получится.
Пример
На кассе оформляется покупка двух ручек с одинаковым article
= 12345
.
В этом случае доступно 2 способа корректной передачи информации о товарах:
Способ 1: передача в одном item
name
=ручка
quantity
=2
article
=12345
Способ 2: передача в двух item
Первый item
:
name
=ручка
quantity
=1
article
=12345
Второй item
:
name
=ручка
quantity
=1
article
=12345
3. Скидки, баллы, предоплата, смешанная оплата
Если часть суммы покупки оплачивается не Кошельком (используется предоплата / наличные / баллы или другой способ оплаты), то эту часть суммы необходимо указывать в поле discountAmount
.
Пример
Случай 1: предоплата
Покупатель оформляет услугу «ремонт автомобиля» (её стоимость: 10 000 руб.) При этом запчасти необходимо покупать и доставлять в сервис заранее. По условиям, необходимо оплатить аванс (2 000 руб.)
Покупатель оплатил аванс не Кошельком и пришёл закрывать чек в рамках единого заказа. Тогда в запросе необходимо указать:
discountAmount
=200000
копеек (экв. 2 000 руб.)totalAmount
=800000
копеек (экв. 8 000 руб.)
Случай 2: частичная оплата баллами
Покупатель сформировал чек на 1000 руб., из которых 300 руб. будет оплачивать баллами, а остальные 700 руб. — Кошельком. Тогда в запросе необходимо указать:
discountAmount
=30000
копеек (экв. 300 руб.)totalAmount
=70000
копеек (экв. 700 руб.)
Альтернативные сценарии оплаты
1. Пользователь решил добавить в чек (удалить из чека) продукт(ы) после отправки пречека серверу Кошелька
Действия ТСП:
- Пользователю необходимо НЕ подтверждать оплату на экране подтверждения оплаты в Кошельке (в случае подтверждения оплата может пройти быстро и кассир может не успеть запросить отмену).
- Необходимо выполнить отмену операции на кассе (см. Сценарий 2. Отмена оплаты).
- Необходимо направить серверу Кошелька измененный пречек с тем же идентификатором
cardSession
, но новымrequestId
.
2. Пользователь решил отказаться от покупки или от части покупки после подтверждения оплаты в Кошельке
Действия ТСП:
- Если ТСП еще не пришёл результат операции оплаты:
- Необходимо выполнить отмену операции на кассе (см. Сценарий 2. Отмена оплаты). Если ТСП успевает отменить операцию до передачи оплаты в банк, то списание средств не произойдет и слип-чек по операции не будет выдан.
- Если требуется изменение состава покупки, следует направить серверу Кошелька измененный пречек с тем же идентификатором
cardSession
(но новымrequestId
).
- Если результат операции оплаты уже получен (даже если он получен после отправки операции отмены, т.е. сервер Кошелька уже передал запрос на оплату в банк до прихода запроса на отмену):
- Если результат оплаты неудачный (оплата отклонена), для изменения состава покупки необходимо направить серверу Кошелька изменённый пречек с тем же идентификатором
cardSession
(но новымrequestId
). - Если оплата уже проведена и пользователь хочет отменить операцию, необходимо выполнить возврат средств (см. Сценарий 3. Возврат оплаты). Для проведения новой операции оплаты после завершения возврата потребуется повторное сканирование карты лояльности пользователя и получение нового
cardSession
.
- Если результат оплаты неудачный (оплата отклонена), для изменения состава покупки необходимо направить серверу Кошелька изменённый пречек с тем же идентификатором
3. Пользователь ошибочно отменил оплату в Кошельке
То есть: пользователь случайно (по ошибке) отменил оплату на экране подтверждения оплаты в Кошельке.
Действия ТСП:
- Необходимо повторно направить серверу Кошелька пречек с тем же идентификатором
cardSession
(но новымrequestId
).
4. Банк по какой-либо причине отклонил оплату
По платежу пришел статус rejected
— платёж отклонён.
Действия ТСП:
- Если платёж отклонён из-за недостаточности средств на счёте и пользователь исправил это:
- Необходимо повторно направить серверу Кошелька пречек с тем же идентификатором
cardSession
(но новымrequestId
).
- Необходимо повторно направить серверу Кошелька пречек с тем же идентификатором
- Если платёж отклонён по другим причинам (в том числе из-за технических проблем на стороне банка или СБП):
- Можно попробовать провести платёж ещё раз (см. случай с недостаточностью средств), или предложить пользователю использовать другой вариант оплаты. В случае повторного отклонения по техническим причинам — предложить пользователю использовать другой вариант оплаты.
5. На вызов запроса отправки пречека получена ошибка: «cardSession
не существует / не прошёл валидацию»
Действия ТСП:
- Необходимо ещё раз просканировать штрихкод карты для того, чтобы ТСП получил новый
cardSession
пользователя. - Необходимо направить серверу Кошелька изменённый пречек (запрос POST
/checkout
) с новыми идентификатором иcardSession
.
6. ТСП не получил ответ на запрос оплаты пречека (POST /checkout
) и не может выполнить запрос POST /status
(т.к. не получил transactionId
в ответе на POST /checkout
)
Действия ТСП:
- Допустимо отправить полностью идентичный повторный запрос на оплату пречека (запрос POST
/checkout
) с теми жеrequestId
иcardSession
(методы API являются идемпотентными).