Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Всем привет! Сегодня с вами Владислав Козуля, тимлид команды Розница, и я расскажу, как начать платить по QR и ни в чём себе не отказывать. Моя команда делает продукт Касса МойСклад, которым часто пользуются наши клиенты, у которых есть точки продаж. Речь пойдёт о том, как разработка инструментов для повседневной работы выглядит изнутри.
Что это вообще такое
Для начала немного контекста. Обычно, когда вы оплачиваете покупки на кассе, у вас есть выбор: платить наликом или картой. Технически между ними есть ещё один вариант — и тем, и тем, но он встречается гораздо реже. Или бонусной картой, а это вообще отдельная система. Короче, налик или карта.
Теперь к ним добавляется новый способ — оплата по QR. Вместо того, чтобы насыпать монет или пикнуть эпплпеем об терминал, можно отсканировать QR-код и оплатить покупку через приложение банка.
Тут возникает резонный вопрос: к чему заморачиваться с камерой на телефоне, если картой проще? Это выгодно магазину. Прикол в том, что для него комиссия с платежа (а магазин с каждой покупки платит комиссию банку) будет ниже. К тому же оплачивать по QR можно без терминала, то есть ещё и экономить на закупке оборудования. Поэтому продавец будет предлагать вам оплатить именно по QR.
Коды бывают двух видов: статические и динамические. Статический код можно распечатать один раз и забыть. Отсканировав код, покупатель должен сам выбрать сумму перевода, поэтому такая схема больше подходит для чаевых или донатов. Чтобы оплачивать покупки, гораздо удобнее использовать динамические коды, которые генерируются на стороне банка. Этот процесс можно автоматизировать через кассовое ПО, что мы и сделали.
У Сбербанка для этого есть своя система — Плати по QR, Тинькофф работает по Системе Быстрых Платежей (СБП). При этом они интегрированы друг другом, то есть покупатель разницы не заметит. Обе системы с нашей стороны завёрнуты в единый API, поэтому для клиента тоже нет разницы.
Разберём, как оплата по QR выглядит под капотом с точки зрения Кассы МойСклад.
Пользователь МоегоСклада выбирает в настройках банк, с которым у него есть договор оплаты по QR. Теперь на его кассе появится новый способ оплаты.
Кассир создаёт продажу — касса запрашивает у бэкэнда QR-код.
Бэкэнд идёт в API банка, который выбрал пользователь из первого пункта. Получает строку, в которой зашиты данные для формирования платежа.
Полученная строка прилетает на кассу и зашивается в QR-код, который можно отрисовать на UI или распечатать на чеке — очень удобно.
Дальше мы опрашиваем банк до тех пор, пока он не скажет, что платеж дошел или был отменён.
Можно печатать фискальный чек, ура!
Вроде, звучит просто, а значит — пора ожидать подводных камней.
Подводные камни
Помните, я упоминал, что обычно платят наличными или по карте? Когда проектировали базу, тоже так думали. Добавление нового типа оплаты означает добавление новых полей в базу (у нас PostgreSQL), причём в историю операций, одну из самых больших и популярных таблиц. На её основе формируются отчёты, одна из ключевых функций МоегоСклада. Это раз.
Второй важный момент — остановка сервиса для обновления производится только в том случае, когда по-другому просто нельзя. А значит, наше решение должно заехать наживую. Эта часть заслуживает отдельной статьи.
Кроме обычной оплаты также возможны такие экзотические операции, как: предоплата, возврат оплаты и возврат предоплаты. Все они должны корректно учитываться при работе с QR. Смешанную оплату QR + наличными или картой мы просто не стали делать, иначе бы окончательно запутались в стремительно усложняющейся логике.
МойСклад не занимается процессингом платежей, только их учётом. Кассир возвращает вам деньги в руки или на карту своими силами, без участия кассового ПО. С оплатой по QR становится немного сложнее: теперь за отмену транзакции и возврат платежа отвечает бэкэнд. Для этого мы сохраняем её айдишник после инициализации.
В API обе операции сидят на одном эндпоинте (скопировали у Тинькова). До проведения платежа транзакцию можно отменить, и при попытке оплаты покупатель увидит ошибку в приложении банка. Если оплата уже прошла, будет произведён возврат. В случае, когда на кассе что-то пошло не так, возврат всегда может сделать владелец магазина из своего личного кабинета в банке.
Касса МойСклад — это не веб-сайт, а десктопное приложение и пара мобильных клиентов под iOS и Android. Они легко могут работать и при отсутствии связи месяцами: для этого там поднимается локальная база, то есть по сути, свой маленький бэкенд. Соответственно, миграцию надо проводить и на сервере, и на клиенте. Сломать локальную базу — означает превратить кассу в кирпич или ещё хуже: потерять все данные. Поистине апокалиптический сценарий для техподдержки.
Про десктопное приложение можно ещё много рассказать, поэтому остановимся на проблемах, которые актуальны конкретно для этой задачи.
Фух.
Мы запустили СБП с Тиньковым 1 октября, а 1 декабря — интеграцию со Сбером, Плати по QR. Уже почти февраль, и мы видим с десяток ежедневных платежей. Клиенты пользуются, люди оплачивают свои покупки по QR. А значит, всё было не зря!
В следующем выпуске я подробно расскажу о том, как релиз с оплатой по QR заезжал на бэкенде. Следите за обновлениями!