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

Онлайн-школа и платформа курсов

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

Коротко

В онлайн-школе всё сводится к одной цепочке: счёт → оплата → webhook → доступ. Ученик выбирает курс, вы создаёте счёт, он платит через Kaspi, вам приходит invoice.paid, и ваша платформа в тот же момент открывает курс. Для периодических платежей есть подписки — они выставляют счёт по расписанию, но деньги сами не списываются: каждую оплату ученик подтверждает в Kaspi лично.

Базовый сценарий: покупка доступа

POST /api/v1/invoices
{
  "amount": 39000,
  "kind": "qr",
  "description": "Курс «Основы Python», поток 2",
  "externalOrderId": "ENR-8842",
  "customer": { "name": "Айдана", "email": "aidana@example.kz" },
  "successUrl": "https://school.kz/enroll/8842/done",
  "failUrl": "https://school.kz/enroll/8842/retry",
  "metadata": { "user_id": "3311", "course_id": "py-basics", "cohort": "2" }
}

Когда ученик на сайте, удобнее kind: "qr": он сканирует QR со страницы телефоном или переходит по payUrl. Если же вы переписываетесь в WhatsApp или Instagram, лучше kind: "phone" — push придёт прямо в Kaspi, но учтите, что description там не длиннее 60 символов.

Открытие доступа по webhook

Это самая ответственная часть. Порядок такой:

  1. В кабинете, в разделе Интеграции, добавляете адрес webhook. В бою принимается только https и реальный домен: IP и адреса туннелей не подойдут.
  2. Секрет показывается один раз — сохраните его.
  3. Адрес должен быть открыт без авторизации. Редиректы на другой адрес не отслеживаются.
  4. Проверяете подпись: HMAC-SHA256(secret, timestamp + "." + rawBody), hex, с префиксом sha256=. Тело — в неизменном байтовом виде, до разбора JSON. timestamp старше 5 минут принимать не надо.
  5. По invoice.paid открываете курс, находя ученика по metadata.user_id и metadata.course_id.
  6. Отвечаете 2xx. Если не ответили — доставка повторится до 11 раз (с нарастанием от 10 секунд до часа).

Обработчик должен быть идемпотентным: храните пару (invoice.id, status) и игнорируйте повторы. Иначе одному ученику уйдёт одиннадцать писем «добро пожаловать».

Подробнее: Настройка вебхуков, Безопасность вебхуков, Вебхук не приходит.

Периодические платежи

Ежемесячная подписка, оплата обучения траншами, формат «курс + сопровождение» — всё это подписки.

Закрывать доступ решаете вы. Если подписка не оплачена, курс мы не закрываем — мы лишь выставили счёт и сообщили, что он не оплачен. Ваша платформа видит неоплаченный период и сама решает, закрыть доступ или оставить.

Подробнее: Бизнес по подписке.

Групповые тарифы и скидки

Скидки. Сумму считаете вы. Промокод, цена раннего бронирования, социальная скидка — всё это решается на вашей стороне, а в счёт уходит уже готовая сумма. Qut Pay скидки не считает, системы промокодов у нас нет.

Групповой тариф. Компания отправляет сотрудников на обучение или группа родителей записывается вместе — есть два пути:

ПутьКогда удобноКак
Один общий счётПлатит компанияОдин счёт на всю сумму, список в metadata
Отдельный счёт каждомуПлатит каждый самМассовое создание: POST /invoices/bulk, от 1 до 100 за запрос

При массовом создании каждый элемент проверяется отдельно: ошибка в одном не мешает остальным создаться. Разберите ответ поэлементно и переотправьте только упавшие.

Если у школы есть мобильное приложение

Здесь нужна осторожность. По правилам App Store и Google Play цифровые товары нельзя продавать через внешнюю оплату. Доступ к курсу, подписка, премиум внутри платформы — это цифровые товары. Реальный товар, доставка, офлайн-услуга и бронирование — можно.

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

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

Вариант без кода

Что учесть заранее

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

Курс откроется сразу после оплаты? Да, webhook invoice.paid обычно приходит в пределах 5 секунд, и платформа открывает доступ в тот же момент.

Ученик оплатил, а доступ не открылся. Что проверять? Сначала журнал webhook: доступен ли адрес, ответили ли вы 2xx, сошлась ли подпись. Порядок проверки: Вебхук не приходит.

Можно сделать промокоды? На стороне Qut Pay системы промокодов нет. Скидку считает ваша платформа и передаёт в счёт готовую сумму.

Если подписка не оплачена, вы закроете доступ к курсу? Нет. Мы выставляем счёт и сообщаем его статус, а закрывать доступ или нет — решает ваша платформа.

Можно принимать оплату прямо в приложении? Технически да, но через ваш сервер. При этом правила App Store и Google Play запрещают продавать цифровые товары через внешнюю оплату, поэтому для онлайн-курсов безопаснее выносить оплату в браузер: Приём оплаты в мобильном приложении.

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

Бизнес по подпискеПодписка — это выставление счёта по расписанию, деньги со счёта клиента сами не уходят. Лестница повторов, политика пропусков, pause/resume, напоминания и отчётность.API подписок — счета по расписаниюПодписка выставляет счета по расписанию, а каждую оплату подтверждает сам покупатель. Все поля создания, интервалы, лестница повторов, политика пропуска, методы pause/resume/run и поля состояния.Настройка вебхуковКак добавить адрес вебхука в кабинете, выбрать события и сохранить секрет, какие приходят заголовки и тело, как устроены 11 повторов, как читать журнал, протестировать адрес и что с редиректами.Приём оплаты в мобильном приложенииПравильный порядок: приложение → ваш сервер → Qut Pay → Kaspi. Почему API-ключ не должен попадать в APK и IPA, что происходит при открытии payUrl и правила App Store и Play Market.Продажи через Telegram-ботаБот → ваш сервер → счёт → пуш или ссылка покупателю → вебхук → выдача товара. Защита от вала неоплаченных счетов, несколько брендов в одном боте, примеры на Python и Node.

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

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