Заметки из практики

Приём крипто на кассе

Приём крипто на кассе означает, что покупатель у вашей стойки платит цифровым активом — стейблкоином вроде USDC или монетой вроде BTC, — а вы, мерчант, получаете евро. Актив, который отправляет клиент, и деньги, которые получаете вы, — разные вещи, связанные котировкой, зафиксированной в момент оплаты. Ваша касса, ваша бухгалтерия и ваш банковский счёт ничего не узнают о том, что в сделке было крипто. Терминал показывает цену в евро, клиент сканирует код, и через несколько секунд продажа закрывается в евро — той же строкой, что и при оплате картой. Крипто на кассе — это способ оплаты, а не изменение в учёте, и сохранить это в таком виде — вся инженерная задача.

Об этом стоит сказать в первую очередь, потому что большая часть путаницы с крипто-платежами возникает из-за смешения двух вопросов, которые надо держать раздельно: как платит клиент и в какой валюте остаются деньги у мерчанта. Разведите их — и всё остальное из этого следует.

Какую задачу нужно решить на самом деле

Мерчанту нужна продажа, а не волатильность. Он не хочет заканчивать день с набором активов неопределённой стоимости, и ему не нужно, чтобы бухгалтер внезапно заговорил на двух валютах. Ему нужна цена, зафиксированная между оплатой и чеком, деньги в евро и сверка, которая выглядит как любой другой карточный день. Магазин, принимающий крипто «в лоб», ничего из этого не получает: он берёт актив, цена которого меняется, пока клиент ещё решает, складывает его в кошелёк и получает в учёте вторую валюту, которую кому-то теперь приходится оценивать и конвертировать вручную. Поэтому цель дизайна узкая и жёсткая: сделать крипто видимым ровно в одном месте — в момент платежа — и невидимым везде остальном.

Один тап: QR, зафиксированная котировка, строка в евро

Пройдёмся по сценарию на кассе. Кассир пробивает корзину на €24.00. Терминал показывает итог в евро и рисует QR-код с запросом: сумма, адрес назначения или инвойс и идентификатор короткоживущей котировки. Клиент сканирует его своим кошельком, видит, что именно собирается отправить, и подтверждает. Терминал следит за сетью, ждёт этого перевода и после подтверждения печатает чек в евро. Со стороны кассира ритм не отличается от карточного: итог, предъявление, подтверждение, чек. Никто за стойкой не вводит адрес и не читает баланс ни в чём, кроме евро.

Запрос внутри QR — вот что делает безопасным показ его телефону незнакомца. Сумма и адрес назначения передаются в коде, с контрольной суммой, поэтому клиент не может ошибиться адресом или суммой при ручном вводе — это тот же приём «идентификатор по построению», что и на стороне приёма платежей, только применённый на кассе. Код, который сканируется, — это код, который верен; свободного поля, где можно ошибиться, просто нет.

Расчёт в евро: бухгалтерия не узнаёт о крипто

Между активом, который отправляет клиент, и евро, которые остаются у мерчанта, стоит конвертация, и именно её место — весь фокус. Клиент отправляет USDC или BTC; платформа конвертирует и зачисляет средства на счёт мерчанта в EUR. В его учётной книге виден только кредит в евро и строка комиссии в евро — той же формы, что и при карточном расчёте, — потому что актив конвертируется на платформе, а не остаётся в кошельке, которым мерчанту теперь надо управлять. К концу дня учёт — в евро от начала до конца. Нет корзины монет, которую нужно переоценивать, нет второй валюты в счетах и нечего выводить в фиат в понедельник утром.

Задача клиента — платить тем, что у него есть. Задача мерчанта — вести учёт в одной валюте. Касса, которая рассчитывается по крипто в евро, — это просто машина, не дающая этим двум фактам встретиться.
— Protocore · Платёжная разработка

Курс фиксируется, а не догоняется

Волатильность — главный страх, а ответ на неё — зафиксированная котировка с обратным отсчётом. Когда терминал показывает цену в евро, он одновременно выставляет котировку, действующую в течение заданного окна — нескольких секунд. Клиент платит в этом окне по этой котировке, и евро, которые зачисляются мерчанту, — это евро с экрана, а не то, что сделал рынок, пока загружался кошелёк. Если окно истекает до подтверждения, терминал выставляет котировку заново: новый код, новый отсчёт, явная новая цена — никакого тихого дрейфа. Мерчант никогда не несёт риск движения между оплатой и подтверждением; этот риск лежит на том, кто выставил котировку, а не на владельце лавки, который просто хотел продать кофе.

Когда клиент медлит или терминал офлайн

Сети подвисают, а в магазинах пропадает связь, поэтому поведение офлайн должно быть скучным намеренно. Два случая. Если клиент медлит, котировка просто истекает и выставляется заново: платёж либо подтверждается в окне, либо не происходит, и нет полузавершённой продажи, которую придётся откатывать. Если же сам терминал ушёл офлайн, он всё ещё может показать запрос на известную сумму, но не может выставить новую котировку или подтвердить расчёт, поэтому держит продажу как ожидающую и сверяет её после восстановления связи, а не делает вид, что всё прошло. Главное правило: чек печатается по подтверждению, а не по надежде. Чек в евро означает, что евро учтены, а продажа, которую терминал не смог подтвердить, остаётся открытой и видимой в консоли оператора, а не тихо исчезает.

Где терминал встречается с gateway

Касса — это офлайн-лицо того же стека приёма платежей, что работает онлайн. Крипто-оплата на терминале и оплата по ссылке в checkout — по сути одно и то же событие: запрос, платёж, расчёт в евро, чек, — только на разных поверхностях. Поэтому мерчант сверяет офлайн-крипто и онлайн-заказы в одном месте, в евро, с теми же строками комиссий и теми же выгрузками, а не ведёт две книги, которые в конце месяца приходится сшивать. Терминал — по адресу /products/pos; онлайн-часть тех же рельсов — /products/gateway; а терминология — котировка, расчёт, эквайер, сверка — описана в /glossary.

Честная граница

Если никто у вашей кассы не хочет платить крипто, крипто-терминал решает проблему, которой у вас нет: принимайте карты и двигайтесь дальше. Он оправдывает себя там, где заметная часть ваших клиентов уже держит цифровые активы и предпочла бы тратить их, а не сначала выводить в фиат: определённые туристические направления, определённая онлайн-аудитория, определённые регионы, где стейблкоины — просто способ хранить деньги, которые можно тратить. В таких местах отказ от оплаты — это отказ от продажи. Описанная выше механика — QR, зафиксированная котировка, расчёт в евро, правило «сначала подтверждение, потом чек» — позволяет принять такую продажу, не принимая на себя ни волатильность, ни вторую валюту, ни бухгалтерский проект. Крипто остаётся заботой клиента; евро остаются вашими.

Есть система, которую нужно построить?

Расскажите о задаче. Мы вернёмся с архитектурой и планом.