Qut Pay Сайт Кабинет База знаний Инструкции Документация API ҚАЗРУС
ГлавнаяБаза знаний → Для вашего бизнеса

Приём оплаты в мобильном приложении

Обновлено: 2026-09-14 · Версия в Markdown

Коротко

Мобильное приложение не обращается в Qut Pay напрямую. Порядок всегда из четырёх звеньев: приложение → ваш сервер → Qut Pay → Kaspi. Причина одна: API-ключ должен жить только на сервере, а не внутри APK или IPA — собранное приложение может распаковать кто угодно и достать ключ. Сервер создаёт счёт и возвращает приложению payUrl или deepLink, приложение его открывает, а после подтверждения оплаты на сервер приходит вебхук.

Как это работает

ШагКтоЧто делает
1ПриложениеПользователь жмёт «Оплатить», приложение идёт на ваш сервер
2Ваш серверПроверяет заказ и сам считает сумму
3Ваш серверPOST /api/v1/invoicesX-API-Key используется только здесь
4Ваш серверОтдаёт приложению только id и payUrl (или deepLink)
5ПриложениеОткрывает ссылку — запускается приложение Kaspi
6ПокупательПодтверждает оплату в Kaspi
7Qut PayОтправляет на ваш сервер invoice.paid
8Ваш серверЗакрывает заказ и сообщает приложению пушем или статусом

Не берите сумму из приложения. Запрос легко подменить и прислать 100 тенге. Сумму сервер должен посчитать сам, по содержимому заказа.

Про API-ключ

Это самая важная часть статьи.

Об устройстве сервиса в целом: Безопасно ли подключать и как всё устроено.

Какой метод API используется

На сервере:

POST https://api.qut.kz/api/v1/invoices
X-API-Key: qp_live_…
Idempotency-Key: app-order-8841

{
  "amount": 12900,
  "kind": "qr",
  "description": "Заказ №8841",
  "externalOrderId": "8841",
  "successUrl": "https://moe-app.kz/pay/ok?order=8841",
  "failUrl": "https://moe-app.kz/pay/fail?order=8841",
  "metadata": { "platform": "ios", "user_id": "u_512" }
}

Не отдавайте приложению весь ответ — достаточно id и payUrl (или deepLink).

Остальное: GET /api/v1/invoices/{id} — узнать статус, когда пользователь вернулся в приложение, POST /api/v1/invoices/{id}/cancel, POST /api/v1/invoices/{id}/refund.

Если номер покупателя известен (он зарегистрирован в приложении), подойдёт и kind: "phone": в Kaspi прилетит пуш. Тогда customer.phone в формате 7XXXXXXXXXX, сумма — целые тенге, описание — до 60 символов.

Что происходит при открытии payUrl

Когда приложение открывает payUrl, на телефоне запускается приложение Kaspi, и покупатель подтверждает оплату там. Вам нужны две вещи.

1. Проверяйте статус при возвращении. Поймайте момент возврата в приложение (applicationDidBecomeActive, onResume) и спросите у своего сервера статус заказа. Пользователь мог вернуться, ничего не оплатив, — «вернулся» само по себе не значит «оплатил».

2. Источник истины — вебхук. Переводите заказ в «оплачен» только на сервере и только по событию invoice.paid. Словам приложения верить нельзя: его поведение можно подменить.

Лучше держать оба механизма: вебхук — как основной, запрос из приложения — чтобы быстро обновить интерфейс.

successUrl и failUrl принимают только http(s). Удобно вести их на страницы вашего домена, а уже оттуда возвращать пользователя в приложение.

Правила App Store и Play Market

Это не техническое, а магазинное ограничение, но от него зависит, пройдёте ли вы модерацию.

Что продаётсяВнешняя оплата
Цифровой товар: подписка, премиум-доступ, игровая валюта, контент внутри приложенияНельзя — нужно использовать оплату самого магазина
Физический товар: одежда, еда, книги, покупка в магазинеМожно
Доставка, курьер, таксиМожно
Услуги: ремонт, консультация, обучение, салонМожно
Бронирование: столик, номер, билет, времяМожно

То есть Qut Pay уместен для реальных товаров и услуг, но не для цифрового контента внутри приложения. Правила магазинов меняются — перед публикацией сверьтесь с их актуальной редакцией.

На что обратить внимание

Вопросы и ответы

У меня нет сервера, только приложение. Как быть? Понадобится небольшой сервер: вся его работа — создавать счета и принимать вебхуки, это буквально пара эндпоинтов. Без сервера ключ неизбежно окажется внутри приложения, а так делать нельзя.

А если обфусцировать ключ? Не помогает. Обфускация не прячет ключ, а лишь усложняет поиск. Достаточно посмотреть трафик собранного приложения.

Нужно ли показывать картинку QR в приложении? Сканировать QR на том же телефоне неудобно. Лучше открывать Kaspi через payUrl или deepLink. QR пригодится для случая, когда платят с другого телефона.

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

У меня есть ещё веб-версия — можно один ключ на оба? Можно, но удобнее разные: если один утечёт, вы удалите только его, не трогая второй.

Связанные статьи

Приём Kaspi для интернет-магазинаПолная схема от корзины до статуса «оплачен»: счёт, страница оплаты, вебхук. Способы без кода для Tilda, WooCommerce и OpenCart, и путь через API для самописного сайта.Продажи через Telegram-ботаБот → ваш сервер → счёт → пуш или ссылка покупателю → вебхук → выдача товара. Защита от вала неоплаченных счетов, несколько брендов в одном боте, примеры на Python и Node.API отвечает 401 — ключ не принимается401 unauthorized означает, что в запросе нет действующего API-ключа. Причины, порядок проверки и рабочий пример curl. Чаще всего виноват заголовок или префикс Bearer.Вебхук не приходит — как найти причинуСчёт оплачен, а на ваш сервер уведомление не пришло. С чего начать диагностику, какая причина встречается чаще всего и как проверить её одним запросом.Безопасно ли подключать и как всё устроеноСервис работает через ограниченную роль «Кассир» в Kaspi Pay: выставить счёт, увидеть статус, вернуть по своим счетам. Доступа к деньгам нет. Что мы храним и как отключить в любой момент.

Остались вопросы? WhatsApp +77788813333 · kazprose@gmail.com
Написать можно и из кабинета: Поддержка.

Qut Pay — независимый сервис, не аффилирован с АО «Kaspi Bank». Kaspi и Kaspi Pay — товарные знаки их правообладателя.