FlipPay API
Принимайте платежи (СБП, карты, криптовалюта, международные) через единый REST API. Плательщик оплачивает на нашей брендированной странице — вам нужно лишь создать платёж и обработать уведомление о статусе.
Введение
- • Все запросы — JSON по протоколу HTTPS.
- • Суммы — в рублях, строкой с двумя знаками:
"1000.50". Отдаём тоже строкой, чтобы не терять копейку на float. - • Поле
metadata— произвольный JSON (напр.tg_id): вернём его как есть в статусе и в каждом вебхуке. - • Базовый URL:
https://flippay.pro
Авторизация
В каждый запрос добавьте два заголовка. Ключи доступны в кабинете: Настройки → Интеграция и API. Секретный ключ показывается один раз; перевыпуск отключает старый.
| Заголовок | Значение |
|---|---|
X-Api-Key | публичный ключ, pk_… |
X-Api-Secret | секретный ключ, sk_… |
X-Api-Key: pk_2f9c1ab34de5f6a7b8c9d0e1 X-Api-Secret: sk_8a7b6c5d4e3f2a1b0c9d8e7f6a5b4c3d2e1f0a9b Content-Type: application/json
X-Api-Secret в браузере, мобильном приложении или коде Telegram-бота на стороне клиента — секрет должен оставаться на сервере.
Быстрый старт
- Получите API-ключи в кабинете (Настройки → Интеграция и API).
- Создайте платёж запросом
POST /api/v1/payments. - Перенаправьте плательщика на
pay_urlиз ответа. - Получите уведомление о статусе на ваш Callback URL (или опрашивайте статус).
- Проверьте подпись
X-Signatureи выдайте товар/услугу.
Создать платёж
POST https://flippay.pro/api/v1/paymentsСоздаёт платёж и возвращает ссылку на нашу страницу оплаты. Идемпотентность: повторный запрос с тем же order_id вернёт существующий платёж, дубль не создаётся.
Параметры
| Поле | Тип | Описание |
|---|---|---|
order_id * | string | Ваш ID заказа (уникальный). До 128 символов. |
amount * | string | Сумма в рублях (> 0), максимум 2 знака после точки. Напр. "1500.00". |
payment_method * | integer | Метод оплаты (см. Методы): 2, 3, 11, 12, 13. |
description * | string | Назначение платежа, напр. «Заказ №12345». |
currency | string | Валюта, по умолчанию RUB. |
success_url | string | Куда вернуть плательщика после успешной оплаты (кнопка + авто-редирект на нашей странице). |
fail_url | string | Куда вернуть при отмене/ошибке/истечении срока. |
metadata | object | Произвольный JSON (до 4 КБ), напр. {"tg_id": 123}. Вернём как есть в статусе и в вебхуке — удобно вместо похода в свою БД. |
Запрос
# создание платежа на 1500 ₽ по СБП curl -X POST https://flippay.pro/api/v1/payments \ -H "X-Api-Key: pk_2f9c1ab34de5f6a7b8c9d0e1" \ -H "X-Api-Secret: sk_8a7b6c5d4e3f2a1b0c9d8e7f6a5b4c3d2e1f0a9b" \ -H "Content-Type: application/json" \ -d '{ "order_id": "ORDER-12345", "amount": "1500.00", "payment_method": 2, "description": "Заказ №12345", "success_url": "https://shop.ru/orders/12345/ok", "fail_url": "https://shop.ru/orders/12345/fail", "metadata": { "tg_id": 123456789 } }'
Ответ 200 OK
{
"order_id": "ORDER-12345",
"status": "pending",
"amount": "1500.00",
"currency": "RUB",
"pay_url": "https://flippay.pro/pay/m12_a1b2c3d4e5f6",
"metadata": { "tg_id": 123456789 }
}pay_url — он оплатит на нашей странице (СБП-QR, выбор банка, крипто-реквизиты и т.д.). Ссылка действует ограниченное время (обычно ~20 минут); после истечения создайте платёж заново с новым order_id.
Статус платежа
GET https://flippay.pro/api/v1/payments/{order_id}Резервный способ узнать статус, если не используете webhook (или для сверки).
curl https://flippay.pro/api/v1/payments/ORDER-12345 \ -H "X-Api-Key: pk_…" -H "X-Api-Secret: sk_…"
{
"order_id": "ORDER-12345",
"status": "success",
"amount": "1500.00",
"currency": "RUB",
"pay_url": "https://flippay.pro/pay/m12_a1b2c3d4e5f6",
"metadata": { "tg_id": 123456789 }
}Webhook (уведомления)
Укажите Callback URL в кабинете (Настройки → Уведомления). При смене статуса платежа мы отправим POST на ваш адрес с JSON-телом и заголовком X-Signature.
- • Только HTTPS, публичный домен, валидный SSL.
- • Отвечайте
200 OKв течение 60 секунд. - • Ретраи: до 7 попыток с экспоненциальным бэкоффом (1м → 5м → 30м → 2ч → 6ч → 12ч).
- • Отправляется при переходе платежа в
success,failedилиrefunded(статусpendingвебхуком не шлётся). - • Из-за ретраев одно и то же уведомление может прийти несколько раз — обрабатывайте идемпотентно (например, по паре
order_id+status). - • Всегда сверяйте сумму и статус с вашим заказом; доверяйте только запросам с верной подписью.
Тело запроса
{
"event": "payment.updated",
"order_id": "ORDER-12345",
"status": "success",
"amount": "1500.00",
"currency": "RUB",
"metadata": { "tg_id": 123456789 }
}Проверка подписи
Заголовок X-Signature = HMAC-SHA256 от сырого тела запроса (hex), ключ — ваш webhook_secret из кабинета: Настройки → Уведомления. Сравнивайте константно (constant-time). Если подпись не совпала — игнорируйте запрос.
import hmac, hashlib def verify(raw_body: bytes, signature: str, secret: str) -> bool: expected = hmac.new(secret.encode(), raw_body, hashlib.sha256).hexdigest() return hmac.compare_digest(expected, signature) # FastAPI / Flask: берите ИМЕННО сырое тело запроса (request body bytes)
Методы оплаты
Значение поля payment_method при создании платежа. Доступные вам методы настраивает менеджер.
| ID | Метод |
|---|---|
2 | СБП (QR-код) |
3 | ЕРИП |
11 | Карточный эквайринг |
12 | Международный эквайринг |
13 | Криптовалюта |
Статусы платежа
| Статус | Значение |
|---|---|
| pending | Создан, ожидает оплаты. |
| success | Оплачен и подтверждён. |
| failed | Отклонён или истёк срок. |
| refunded | Возврат / чарджбэк. |
Коды ошибок
При ошибке возвращается соответствующий HTTP-код и тело JSON с полем detail:
{ "detail": "invalid credentials" }| Код | Когда |
|---|---|
400 | Метод оплаты не подключён вашей кассе (обратитесь к менеджеру). |
401 | Неверные или отсутствующие X-Api-Key / X-Api-Secret. |
403 | Касса отключена. |
404 | Платёж с таким order_id не найден (для GET статуса). |
422 | Ошибка валидации тела запроса (отсутствует поле, неверный тип, amount ≤ 0 или больше 2 знаков после точки, metadata > 4 КБ). |
Тестирование
- • Отдельной песочницы (sandbox) нет — интеграция тестируется на боевых ключах.
- • Проверяйте сценарий на минимальных суммах, затем переходите к реальным.
- • Для приёма вебхуков нужен публичный HTTPS-endpoint; на этапе разработки удобно поднять туннель (ngrok / cloudflared) и указать его как Callback URL.
- • Если вебхук не дошёл — статус всегда можно получить запросом GET статуса.