> Источник: https://apipay.kz/lovable-integration · apipay.kz
> ApiPay — независимый сервис приёма платежей поверх вашего Kaspi Pay. Не официальная интеграция Kaspi и не партнёр Kaspi.

# Интеграция ApiPay с Lovable — приём платежей Kaspi Pay

**TL;DR.** Приложение на Lovable принимает оплату Kaspi через серверную функцию Supabase: она выставляет счёт по номеру телефона и принимает вебхук об оплате. Готовый промпт для Lovable лежит на странице — его копируют и вставляют, писать код руками не нужно.

## Почему через Supabase, а не из браузера

API-ключ ApiPay нельзя держать в коде страницы: он даёт право выставлять счета от имени вашей организации. Поэтому запросы идут из Supabase Edge Function, где ключ лежит в секретах, а Lovable-приложение вызывает уже свою функцию.

Из этого же следует, что статический сайт без серверной части оплату принять не сможет: вебхуку об оплате некуда приходить. Варианты — минимальная серверная функция, опрос `GET /invoices/{id}` из серверной прослойки или автоматизация без кода через n8n (https://apipay.kz/n8n-integration).

## Порядок подключения

1. **Подключите Supabase** к проекту Lovable.
2. **Получите API-ключ** в кабинете ApiPay: Настройки → «Подключение». Положите его в секреты Supabase, не в код приложения.
3. **Вставьте готовый промпт** в Lovable — он есть на странице целиком. Промпт описывает Edge Function: создание счёта и обработчик вебхука.
4. **Настройте вебхук**: адрес обработчика впишите в кабинете (Настройки → «Подключение»), там же сгенерируйте секрет подписи. Секрет показывается один раз.

## Что проверить в обработчике вебхука

- Функция должна принимать запрос **без токена Supabase**: у Edge Function проверка JWT включена по умолчанию, и уведомление от ApiPay получит `401`, не дойдя до кода. Для обработчика её отключают (`verify_jwt = false` в `config.toml` либо деплой с `--no-verify-jwt`), а подлинность запроса подтверждает подпись — см. следующий пункт.
- Подпись сверяется по **сырому телу** запроса, а не по повторно собранному JSON. Пересборка тела ломает HMAC при верном секрете — это самая частая причина «подпись не сходится».
- Отвечать нужно быстро любым `2xx`; тяжёлые шаги выполняйте после ответа, иначе доставка уйдёт в повторы.
- Дедуплицируйте события. Статус счёта ставит Kaspi, и последовательности вроде `cancelled → paid` законны: не закрывайте заказ по локальному таймауту.
- В рабочем режиме отбрасывайте события с `is_sandbox: true` в корне тела: отвечайте `2xx` и не исполняйте. Событие по песочному объекту, отправленное до перевода организации в рабочий режим, может прийти уже после него.
- Если обработчик подряд не принимает уведомления, отправка по этому ключу встаёт на паузу, а затем отключается до ручного включения. Состояние видно в кабинете на карточке ключа; пропущенные переходы восстанавливают опросом `GET /invoices/{id}`.

## Ссылки

- Документация API: https://apipay.kz/docs
- Инструкция для ИИ-помощника: https://apipay.kz/for-ai
- Каталог ошибок: https://apipay.kz/errors
- Локальная проверка вебхуков: https://apipay.kz/local-testing
- Другие интеграции: https://apipay.kz/n8n-integration · https://apipay.kz/moysklad · https://apipay.kz/kaspi-pay-1c
