Для приёма заказов берите динамический QR: он выпускается под конкретную покупку, уже содержит сумму и живёт ограниченное время. Статический код — картинка с реквизитами, где сумму покупатель вбивает руками, и именно из-за этого он рушит вашу сверку.
Разберём разницу по деталям, а заодно — сколько живёт код, каким его печатать, где он уместен офлайн и почему камера иногда отказывается его видеть.
Динамический и статический: в чём реальная разница
| Признак | Динамический | Статический |
|---|---|---|
| Сумма | Зашита в код | Вводит плательщик |
| Привязка к заказу | Есть, через ваш идентификатор | Нет |
| Срок жизни | Минуты, задаётся при создании | Бессрочно |
| Где уместен | Онлайн-заказ, счёт, касса | Чаевые, донат, разовый сбор |
| Сверка | Автоматическая | Руками по выписке |
Динамический код выпускается на лету: вы делаете POST /api/v1/payments с суммой «2490.00» и своим order_id, в ответ приходит payment_id, pay_url и expires_at. Страница оплаты сама рисует QR по этому токену, вам не нужно генерировать картинку у себя.
Почему статический код рушит учёт
Одна картинка на всех платежей означает одно: у поступления нет имени. В выписке вы видите время и сумму, но не знаете, за какой заказ. Пока продаж пять в неделю, это терпимо. На тридцати в день начинается ад.
- Двое купили один товар в одну минуту — какой из них оплатил, а какой ещё нет?
- Клиент ошибся на сотню и перевёл 2390 вместо 2490 — заказ считать оплаченным?
- Человек написал «за курс» вместо номера — искать его по имени в списке из сорока строк.
- Нужен возврат — сначала докажите, что это тот самый перевод.
Школа рисования продавала три курса по одному коду в шапке профиля. Через месяц накопилось 11 спорных переводов: люди платили не ту сумму или без комментария. Разбор занял два вечера. После перехода на код под заказ спорные случаи свелись к одному в месяц — с неверной суммой, который система просто не подтвердила.
Статический код нормально работает там, где нет товара: чаевые мастеру, донат стримеру, сбор на подарок. Как только появляется «что купили» — берите динамический.
Сколько должен жить код
Срок берётся из expires_at и обычно составляет от 15 до 60 минут. Слишком короткий раздражает: человек отвлёкся на звонок и вернулся к мёртвому коду. Слишком длинный опасен по-другому — покупатель платит по вчерашнему скриншоту, а цена с тех пор изменилась.
Практика простая: онлайн-корзина — 20–30 минут, счёт по почте — до конца дня, касса и живая очередь — 5–10 минут. И в любом случае покажите на экране таймер и кнопку «Обновить код»: пересоздать платёж дешевле, чем разбирать просроченный перевод. Когда время вышло, вам придёт payment.expired — освободите резерв товара по этому событию.
Печать: размер, контраст и поле вокруг
Код читается камерой, а не человеком, поэтому дизайнерские вольности здесь стоят денег. Минимальные требования, которые стоит проверить перед тиражом.
- Размер. На настольной табличке — от 4 см по стороне, на плакате в двух метрах от зрителя — от 15 см. На экране — от 240 пикселей.
- Контраст. Тёмный код на светлом фоне. Белое на чёрном большинство камер читает хуже, а серое на бежевом не читает вовсе.
- Поле. Оставьте пустую рамку шириной примерно в четыре модуля кода. Текст и логотипы вплотную мешают распознаванию.
- Матовая бумага. Глянец и ламинация ловят блики от ламп, под ними код превращается в белое пятно.
- Никакого фона. Фотография или градиент под кодом убивают распознавание сильнее, чем плохой свет.
Логотип по центру допустим, если он закрывает не больше 20% площади и код напечатан с запасом по избыточности. Перед печатью тиража проверьте макет на трёх телефонах: старом Android, свежем iPhone и чужом устройстве с треснувшим стеклом.
Код на кассе, в кафе и на выставке
Офлайн у каждого места свои требования. На кассе продавец выпускает код под чек и разворачивает экран планшета к покупателю: сумма уже внутри, руками её никто не вводит, очередь не стоит. В кафе код кладут на стол, но сумму официант всё равно выставляет под конкретный счёт — иначе гости платят «примерно».
На выставке или конференции ситуация другая: интернет плохой, людей много, товар типовой. Здесь удобно заранее подготовить несколько кодов под фиксированные позиции — «мерч 1500», «книга 900» — и держать их на планшете отдельными экранами. Плюс запасной вариант: платёжная ссылка в мессенджере, если у гостя не работает камера.
Камера не читает: что проверить за минуту
Сначала исключите очевидное: яркость экрана на максимум, снять защитную плёнку с камеры, протереть объектив, отойти на 15–20 см. Дальше по списку.
- Код просрочен — на странице висит старая картинка, обновите её.
- Экран блёклый или включён ночной режим — жёлтый фильтр съедает контраст.
- Камера снимает через стекло витрины — появляются блики и двойное отражение.
- Стандартная камера телефона не умеет платёжные коды — открывайте сканер внутри приложения банка.
- Картинку прислали скриншотом в мессенджере — сжатие размывает мелкие модули, отправьте ссылку.
Если ничего не помогло, не воюйте с камерой на глазах у покупателя: отправьте ссылку на оплату в чат или продиктуйте короткий адрес. Про выбор между кодом, ссылкой и картой полезно почитать в разборе СБП или оплата картой, а собрать это в рабочую схему помогает решение с платёжными ссылками.
И главное про подтверждение: отсканированный код и открытое приложение банка ещё не означают деньги на счёте. Товар отдавайте после события payment.paid на вашем сервере, с проверенной подписью — на кассе это буквально строка «Оплачено» на планшете продавца, а не слова покупателя «я отправил».