LunaPay
Всё для интеграции в одном месте
Как получить ключи, создать платёж и проверить webhooks — без разрозненных страниц.
Обзор API
LunaPay — REST API для приёма платежей через единый слой провайдеров. Вся документация для разработчиков — на этой странице.
Base URL
https://t-ncid.ru/api/v1
Auth
JWT · X-Api-Key · Idempotency-Key
Платежи
POST /payments
Webhooks
HMAC · timestamp · retry
Ошибки
{ code, message, request_id }
Быстрый старт
- 1
Регистрация
Зарегистрируйте мерчанта (POST /auth/register) или через веб. После одобрения администратором статус станет ACTIVE.
- 2
API-ключ
В кабинете: Магазины → создайте магазин (API-ключ lpy_… выдаётся сразу). Полный ключ показывается один раз; дальше — перегенерация на странице магазина. Тестовый/боевой режим и способы оплаты (altyn_vale, sbp, crypto) настраиваются в карточке магазина.
- 3
Первый платёж
POST /payments с Idempotency-Key, затем редирект покупателя на checkout_url. Метод можно не передавать — покупатель выберет на checkout; либо задать payment_method / ?method= в URL.
- 4
Уведомления
Подключите webhook-endpoint и проверяйте подпись HMAC. Для надёжности используйте polling статуса.
Аутентификация и ключи
Для серверных интеграций используйте API-ключ. JWT подходит для сессий кабинета.
Merchant API key
Заголовок X-Api-Key: lpy_…
User JWT
Authorization: Bearer <access> после /auth/login
Idempotency-Key
Обязателен при создании платежа — уникален на бизнес-операцию
Тестовый или боевой режим и список методов включаются в карточке магазина. Ключ один (lpy_…) — без отдельных test/live ключей. Админ может закрыть метод для всего мерчанта.
Создание платежа
Создайте платёж, получите checkout_url и перенаправьте покупателя на hosted checkout. Доступные method_id: altyn_vale, sbp, crypto (если включены в магазине).
- POST /payments с amount, currency, order_id, return_url; payment_method опционален (altyn_vale | sbp | crypto)
- Передайте Idempotency-Key в заголовке и X-Api-Key магазина
- Редирект на checkout_url; можно добавить ?method=sbp (или ?provider= для crypto)
- Дождитесь payment.paid (webhook) или опросите статус
Ответ содержит id платежа и checkout_url. Cascade провайдеров стартует после выбора метода на checkout (или сразу, если метод уже задан и не crypto).
Примеры
curl -X POST 'https://t-ncid.ru/api/v1/payments' \
-H 'X-Api-Key: lpy_…' \
-H 'Idempotency-Key: $(uuidgen)' \
-H 'Content-Type: application/json' \
-d '{
"amount": 1500.00,
"currency": "RUB",
"payment_method": "sbp",
"order_id": "ord_123",
"return_url": "https://shop.example/done"
}'Webhooks
Платформа доставляет события на ваш endpoint с HMAC-подписью и защитой от replay.
- Создайте endpoint в кабинете и сохраните секрет whsec_… (показывается один раз)
- Сравните X-Tncid-Signature = t=<ts>,v1=<hmac> по строке ${timestamp}.${rawBody}
- Отклоняйте запрос, если |now − ts| > 300 секунд
- Обрабатывайте идемпотентно по payload.id или (payment_id, type)
Проверка подписи
HMAC-SHA256 от сырого тела запроса с секретом endpoint. При несовпадении отвечайте 401.
# X-Tncid-Signature: t=<unix>,v1=<hex>
# signed payload = "{t}.{rawBody}"
expected = HMAC_SHA256(whsec, f"{t}.{raw_body}")События
payment.createdpayment.processingpayment.awaiting_paymentpayment.paidpayment.failedpayment.cancelledpayment.expiredpayment.refundedПовторы: 1м, 5м, 15м, 1ч, 6ч → DEAD. Дубликаты не вызывают повторный переход статуса.
Polling как запасной путь
GET /payments/:id/status — не полагайтесь только на webhooks. Используйте polling для сверки и восстановления после сбоев доставки.
GET /api/v1/payments/:id/statusФормат ошибок
Все ошибки API возвращают единый JSON. Сохраняйте request_id для поддержки.
{
"code": "VALIDATION_ERROR",
"message": "amount must be positive",
"request_id": "req_01H…"
}Дальше в кабинете
Нужна помощь с интеграцией? Зарегистрируйтесь и откройте кабинет.