Как принимать оплату Payme и Click в мобильном приложении
Практика4 минРедакция Innovialabs
Коротко
Приложение только запускает оплату, а заказ подтверждает бэкенд после серверного колбэка от Payme или Click. Веб-чекаут — самый быстрый старт, SDK и токены карт дают более гладкий UX.
Короткий ответ
Приём Payme и Click в мобильном приложении всегда состоит из двух частей:
- Клиентская — приложение открывает платёжную страницу или экран SDK, где пользователь подтверждает оплату.
- Серверная — Payme или Click обращаются к вашему бэкенду, чтобы проверить заказ и сообщить результат. Источник правды — только этот колбэк.
Приложение никогда само не решает, оплачен ли заказ. Оно создаёт заказ на бэкенде, запускает оплату и затем спрашивает у бэкенда статус.
Три варианта интеграции
| Вариант | Как работает | Плюсы | Минусы |
|---|---|---|---|
| Веб-чекаут | Приложение открывает платёжную страницу провайдера с параметрами заказа | Быстрый запуск, без нативного кода | Пользователь ненадолго уходит из приложения |
| Мобильный SDK | Библиотека провайдера показывает нативный экран оплаты | Более гладкий UX, всё внутри приложения | Зависимость от обновлений SDK, больше тестов |
| Токенизация карт | Пользователь один раз сохраняет карту, дальше вы списываете по токену с бэкенда | Оплата в одно касание, подписки, повторные заказы | Нужен отдельный договор и аккуратная безопасность |
Для большинства первых релизов достаточно веб-чекаута. Токенизация оправдана для доставки, такси и любых сервисов с частыми повторными покупками.
Как устроена серверная часть
Оба провайдера отправляют запросы на ваш сервер, но протоколы разные:
- Payme использует Merchant API на JSON-RPC: методы
CheckPerformTransaction,CreateTransaction,PerformTransaction,CancelTransaction. Суммы передаются в тийинах (сумы × 100). - Click использует SHOP API с двумя шагами — Prepare и Complete — и подписью, которую нужно проверять в каждом запросе.
Минимальная ссылка на чекаут Payme собирается из параметров в base64:
const params = `m=${merchantId};ac.order_id=${orderId};a=${amountTiyin};c=${returnUrl}`;
const checkoutUrl = `https://checkout.paycom.uz/${Buffer.from(params).toString("base64")}`;
Правила, которые спасают от большинства инцидентов:
- Проверяйте каждый колбэк: заголовок авторизации у Payme, подпись у Click. Всё несовпадающее — отклоняйте.
- Сверяйте сумму и заказ с вашей базой, а не с тем, что прислало приложение.
- Делайте обработчики идемпотентными: один и тот же колбэк может прийти дважды. Храните ID транзакции провайдера и на повтор отдавайте сохранённый результат.
- Обрабатывайте отмены и возвраты, а не только успешные оплаты.
Возврат пользователя в приложение
После оплаты провайдер перенаправляет на переданный вами URL. Используйте Universal Link на iOS и App Link на Android, чтобы редирект сразу открывал приложение, а собственную URL-схему — как запасной вариант.
Дальше приложение должно:
- Показать состояние «проверяем оплату».
- Короткое время опрашивать бэкенд о статусе заказа или ждать push.
- Показать успех, ошибку или «ещё обрабатывается» с возможностью проверить позже.
Не считайте сам редирект доказательством оплаты: пользователи закрывают вкладки, теряют связь или возвращаются вообще без редиректа.
Правила сторов
Apple и Google разделяют товары по типу:
- Физические товары и услуги в реальном мире (еда, доставка, такси, билеты, офлайн-курсы) можно оплачивать через Payme, Click или любой внешний способ.
- Цифровой контент и функции внутри приложения (премиум-доступ, игровая валюта, подписка на контент), как правило, должны идти через In-App Purchase или Google Play Billing.
Если приложение продаёт цифровые товары через Payme или Click, ждите отказа на ревью. Прочитайте разделы об оплате в App Review Guidelines и политике Google Play Payments до того, как проектировать флоу.
Тестирование в песочнице
- Запросите тестовый доступ у обоих провайдеров: у Payme есть тестовая среда с тестовыми картами, Click выдаёт тестовые данные при подключении мерчанта.
- Прогоните полный цикл: создание, оплата, отмена, повторный колбэк, неверная сумма, просроченный заказ.
- Логируйте каждый входящий запрос и ваш ответ — это самый быстрый способ разбирать споры потом.
- Переключайтесь на боевые ключи только через конфигурацию, а не правкой кода перед релизом.
Частые ошибки
- Отмечать заказ оплаченным на клиенте после редиректа.
- Хранить ключи мерчанта внутри сборки приложения.
- Путать сумы и тийины в суммах Payme.
- Нет обработки оплаты, пришедшей после истечения срока заказа.