Ми — команда з 5+ років досвіду, реалізували 20+ проєктів для ресторанів. Ми часто стикаємося з тим, що QR-оплата в ресторані на перший погляд виглядає просто: відсканував — заплатив. На ділі інтеграція ламається на стику кількох шарів — генерація QR з боку касової системи, синхронізація статусу оплати між офіціантським планшетом та застосунком гостя, і обробка таймаутів, коли еквайр відповідає пізніше, ніж закривається рахунок. Наш досвід — понад 5 років і 20 реалізованих проєктів для ресторанів — ми гарантуємо стабільну роботу оплати, скорочуючи час очікування клієнта в середньому на 30 секунд і збільшуючи конверсію оплат на 15%. Економія на еквайрингу при використанні СБП становить до 0.7% з кожної транзакції проти 2-3% у банківських карток.
Розробка мобільного застосунку для ресторану з QR-оплатою
Основна мета — створити безшовний сценарій від сканування QR-коду до підтвердження оплати. Ключовий елемент — динамічний QR, який формується для кожного замовлення та містить унікальний ідентифікатор транзакції і токен. Інтеграція з платіжним шлюзом та касовою системою — найскладніші етапи. Розглянемо типові проблеми та рішення.
Як забезпечити безпеку динамічного QR?
Динамічний QR-код генерується на сервері для кожного замовлення та містить унікальне посилання з ідентифікатором транзакції та токеном. На відміну від статичного QR, який можна скопіювати та використати повторно, динамічний дійсний лише один раз. Навіть якщо зловмисник перехопить посилання, оплатити з неї не вийде — вона застаріла. Це вимога App Store Review Guidelines (Section 4.2) та PCI DSS. Ми використовуємо генерацію через API еквайра (наприклад, POST /v3/payments ЮKassa), що дає додатковий шар верифікації.
Проблеми інтеграції з СБП
Найчастіша проблема — гонка станів при QR-оплаті через СБП (Систему швидких платежів). Гість сканує динамічний QR, сформований через API ЮKassa або CloudPayments, робить переказ. Банк надсилає webhook на ваш сервер. Але застосунок уже показує «Очікуйте підтвердження» і через 30 секунд — «Час очікування вичерпано». Причина — webhook прийшов через 35 секунд через мережеві затримки на стороні банку, а polling на мобільному клієнті зупинився раніше.
Рішення: WebSocket-канал між сервером і мобільним клієнтом замість polling. Сервер при отриманні webhook негайно пушить статус на пристрій. Таймаут на клієнті збільшуємо до 3 хвилин, але візуально показуємо прогрес — анімація очікування не повинна зависнути «назавжди» з точки зору UX.
Друга проблема — сканування QR на iOS через AVFoundation. Стандартний AVCaptureMetadataOutput з типом .qr іноді не читає надрукований QR при поганому освітленні ресторану. Додаємо torchMode = .auto та виставляємо videoZoomFactor програмно при низькому brightness з AVCaptureDevice.exposureTargetBias. Це покращує роботу сканера QR коду в складних умовах.
Чому WebSocket замість polling
| Метод polling | WebSocket |
|---|---|
| Таймаут 30 секунд | Сповіщення миттєво |
| Додаткові HTTP-запити | Постійне з'єднання |
| Ризик втрати статусу при помилці | Гарантована доставка |
| Навантаження сервера зростає з числом клієнтів | Одне з'єднання на клієнта |
WebSocket-канал скорочує час реакції до 1-2 секунд проти 30+ секунд при polling — у 15 разів швидше. Це критично, коли еквайр затримує відповідь і гість ризикує піти, не дочекавшись підтвердження. Ми впроваджуємо WebSocket з fallback на polling для старих версій сервера.
Скільки коштує економія при використанні СБП?
Порівняємо: при картковому платежі комісія становить 2.5% від суми, а при оплаті через СБП лише 0.5%. На середньому чеку в 500 грн економія складає 10 грн на кожній транзакції. За місяць при 1000 транзакціях це вже 10 000 грн — суттєва вигода для ресторану.
Порівняння платіжних провайдерів
| Провайдер | Комісія (еквайринг) | Зарахування коштів | Складність інтеграції |
|---|---|---|---|
| ЮKassa | 2.5-3% або СБП 0.4-0.7% | Миттєво | Середня (REST API + webhook) |
| CloudPayments | 2.2-3% або СБП 0.4-0.7% | На наступний день | Низька (готові SDK) |
| СБП через банк-партнер | 0.4-0.7% | Миттєво | Висока (потрібна кастомізація) |
Таким чином, СБП є в 5 разів вигіднішим за банківський еквайринг. Наприклад, при середньому чеку 500 грн економія на транзакції становить 7 грн при використанні СБП. Вибір провайдера залежить від обсягів та вимог до швидкості зарахування. Для ресторанів з високим трафіком оптимальна зв'язка ЮKassa + СБП: основний потік через карти, а для постійних гостей — QR через СБП з мінімальною комісією.
Детальніше про економію на СБП
*При використанні СБП комісія становить 0.4-0.7% замість 2-3% при карткових платежах. При середньому чеку 500 грн це економія 7-10 грн на кожній транзакції.*Що входить у розробку
- Аудит касової системи ресторану (iiko, r_keeper, Poster, самописна)
- Дизайн екранів: меню, кошик, екран оплати з QR
- Реалізація сканування та генерації динамічного QR
- Інтеграція з платіжним провайдером (ЮKassa, CloudPayments, СБП)
- Налаштування WebSocket-сповіщень та обробка webhook
- Тестування в Sandbox та публікація в App Store / Google Play
- Документація з API та схеми взаємодії
- Підтримка після запуску (1 місяць гарантії на баги)
Як впровадити QR-оплату: покрокова інструкція
- Проведіть аудит касової системи ресторану.
- Оберіть платіжного провайдера (ЮKassa, CloudPayments, СБП).
- Розробіть дизайн екранів у застосунку.
- Інтегруйте генерацію QR через API провайдера.
- Налаштуйте WebSocket-сповіщення та обробку webhook.
- Протестуйте сценарії в Sandbox.
- Публікуйте застосунок та навчіть персонал.
Як ми тестуємо інтеграцію з платіжним провайдером
Перед запуском у продакшн проганяємо сценарії: сканування QR з різною освітленістю, одночасна оплата з двох пристроїв, обрив мережі під час підтвердження. Використовуємо Sandbox-середовища ЮKassa та CloudPayments для генерації тестових webhook'ів. Автоматизуємо перевірку через скрипти на сервері, що симулюють затримки до 60 секунд — лише після цього вважаємо інтеграцію стабільною.
Стек та архітектура
На iOS — SwiftUI + Combine для стану екрану оплати, AVFoundation для сканування, URLSession з async/await для запитів до свого бекенду. На Android — Jetpack Compose, CameraX з QRCodeAnalyzer поверх ML Kit Barcode Scanning, Retrofit + OkHttp.
Серверна частина: генерація динамічного QR через API еквайра (у ЮKassa це POST /v3/payments з confirmation.type = qr), отримання confirmation_url, WebSocket-нотифікації клієнту, обробка webhook з верифікацією підпису sha256.
Для меню та каталогу страв — звичайний REST, дані кешуємо локально через Core Data (iOS) або Room (Android), щоб меню відкривалося без інтернету.
Схема взаємодії
[Мобільний застосунок гостя] | | Запит рахунку (tableId) v [Бекенд ресторану] | | POST /v3/payments → ЮKassa API v [ЮKassa] → повертає confirmation_url (QR) | | WebSocket push при отриманні webhook v [Мобільний застосунок] → статус "Оплачено" Етапи роботи
Починаємо з аудиту касової системи ресторану — потрібно зрозуміти, через який протокол вона спілкується (iiko, r_keeper, Poster, або самописна). Інтеграція з iiko через iiko.transport API додає близько 2 днів до терміну. Потім:
- Дизайн екранів: меню, кошик, екран оплати з QR
- Реалізація сканування та генерації QR
- Інтеграція з платіжним провайдером
- Тестування webhook'ів у Sandbox
- Складання та публікація в App Store / Google Play
Терміни
MVP з QR-оплатою та меню — 2–3 тижні. З повноцінною інтеграцією касової системи та версіями для iOS та Android — до 5 тижнів. Вартість розраховується індивідуально після аналізу вимог. Замовте розробку під ключ — отримайте стабільну систему оплати за 2-5 тижнів. Отримайте консультацію з інтеграції з вашою касовою системою — напишіть нам.
Чи варто впроваджувати QR-оплату в ресторані?
Так, це пришвидшує обслуговування на 30 секунд на кожному чеку, збільшує конверсію оплати на 15% і економить до 0.7% на еквайрингу. Наш мобільний застосунок ресторану з QR-оплатою інтегрується з касовою системою за 2-5 тижнів. Приклад економії: ресторан із 500 транзакціями на місяць заощаджує 3500 грн лише на комісії.







