Перейти к содержанию
Innovialabs

Как принимать оплату Payme и Click в мобильном приложении

Практика4 мин

Коротко

Приложение только запускает оплату, а заказ подтверждает бэкенд после серверного колбэка от 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-схему — как запасной вариант.

Дальше приложение должно:

  1. Показать состояние «проверяем оплату».
  2. Короткое время опрашивать бэкенд о статусе заказа или ждать push.
  3. Показать успех, ошибку или «ещё обрабатывается» с возможностью проверить позже.

Не считайте сам редирект доказательством оплаты: пользователи закрывают вкладки, теряют связь или возвращаются вообще без редиректа.

Правила сторов

Apple и Google разделяют товары по типу:

  • Физические товары и услуги в реальном мире (еда, доставка, такси, билеты, офлайн-курсы) можно оплачивать через Payme, Click или любой внешний способ.
  • Цифровой контент и функции внутри приложения (премиум-доступ, игровая валюта, подписка на контент), как правило, должны идти через In-App Purchase или Google Play Billing.

Если приложение продаёт цифровые товары через Payme или Click, ждите отказа на ревью. Прочитайте разделы об оплате в App Review Guidelines и политике Google Play Payments до того, как проектировать флоу.

Тестирование в песочнице

  • Запросите тестовый доступ у обоих провайдеров: у Payme есть тестовая среда с тестовыми картами, Click выдаёт тестовые данные при подключении мерчанта.
  • Прогоните полный цикл: создание, оплата, отмена, повторный колбэк, неверная сумма, просроченный заказ.
  • Логируйте каждый входящий запрос и ваш ответ — это самый быстрый способ разбирать споры потом.
  • Переключайтесь на боевые ключи только через конфигурацию, а не правкой кода перед релизом.

Частые ошибки

  • Отмечать заказ оплаченным на клиенте после редиректа.
  • Хранить ключи мерчанта внутри сборки приложения.
  • Путать сумы и тийины в суммах Payme.
  • Нет обработки оплаты, пришедшей после истечения срока заказа.

Частые вопросы

Не обязательно, но у многих пользователей в Узбекистане есть любимый кошелёк. Поддержка обоих обычно снижает отказы на оплате, а серверная логика может использовать общую модель заказа и платежа.

Поможем с этим

Если хотите не разбираться самим, а получить результат — этим мы занимаемся каждый день.

Обсудить проект

Читайте также

Есть идея или задача? Расскажите нам

Ответим в течение рабочего дня и предложим решение. Консультация бесплатная.