📚 Документация LunaPay API

Простая интеграция приёма платежей и массовых выплат для вашего сайта или приложения.

🚀 Что можно делать с LunaPay:

  • Принимать платежи — клиенты оплачивают заказы картой, криптовалютой или через платёжные системы
  • Массовые выплаты — автоматическая отправка денег (зарплаты, выплаты партнерам)
  • Webhook уведомления — мгновенное получение информации о статусе платежей

⚠️ Перед началом работы:

  • Зарегистрируйтесь на lunapay.store
  • Создайте Мерчант-аккаунт в разделе "Мерчант API"
  • Сохраните API Key и Secret Key в надёжном месте

💡 Быстрый старт за 3 шага:

  1. Отправьте запрос на создание платежа с вашим API Key
  2. Перенаправьте клиента на полученную paymentUrl
  3. Получите уведомление на ваш webhookUrl когда клиент оплатит

💳 Мерчант API — Приём платежей

Шаг 1: Получите API ключи

Перейдите в Мерчант API и создайте аккаунт. Вы получите:

  • API Key — для создания платежей
  • Secret Key — для проверки подписи webhook

Шаг 2: Создание платежа

POST https://lunapay.store/api/payment/create

Заголовки запроса:

Заголовок Значение Описание
Content-Type application/json Обязательно
X-API-Key Ваш API Key Обязательно

Параметры запроса (JSON):

Параметр Тип Обязательно Описание
amount number Да Сумма платежа (минимум 1)
orderId string Да Уникальный ID заказа в вашей системе
description string Нет Описание платежа
currency string Нет RUB, USD, EUR, TON, BTC, USDT (по умолчанию RUB)
metadata object Нет Дополнительные данные (вернутся в webhook)

Пример на PHP:

PHP — Создание платежа
<?php
$apiKey = 'ваш_api_key';

$data = [
    'amount' => 1000,
    'orderId' => 'ORDER_123',
    'description' => 'Оплата заказа #123',
    'currency' => 'RUB'
];

$ch = curl_init('https://lunapay.store/api/payment/create');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => json_encode($data),
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/json',
        'X-API-Key: ' . $apiKey
    ]
]);

$response = curl_exec($ch);
$result = json_decode($response, true);

if ($result['success']) {
    header('Location: ' . $result['payment']['paymentUrl']);
    exit;
}
?>

Пример ответа:

JSON
{
  "success": true,
  "payment": {
    "paymentId": "PAY_abc123",
    "orderId": "ORDER_123",
    "amount": 1000,
    "currency": "RUB",
    "status": "pending",
    "paymentUrl": "https://lunapay.store/pay/PAY_abc123",
    "expiresAt": "2025-12-11T10:00:00.000Z"
  }
}

Проверка статуса платежа

GET https://lunapay.store/api/payment/status/{paymentId}

Возможные статусы:

Статус Описание
pending Ожидает оплаты
completed ✅ Успешно оплачен
failed ❌ Ошибка оплаты
expired ⏰ Истёк срок (24 часа)

💸 API массовых выплат

Автоматизируйте выплаты на кошельки LunaPay: зарплаты, комиссии, возвраты, переводы между пользователями системы.

💡 Переводы на кошельки LunaPay:

  • Мгновенный перевод — средства зачисляются моментально
  • Без комиссии — переводы между пользователями LunaPay бесплатны
  • Поддержка всех валют — RUB, USD, EUR, TON, BTC, USDT и другие
  • Два формата получателя — email или wallet ID (формат U12345678)

Выплата на кошелёк LunaPay

Переводите средства другим пользователям LunaPay мгновенно и без комиссии. Получатель указывается по email или wallet ID (например: U12345678).

POST https://lunapay.store/api/payouts/create

Заголовки запроса:

Заголовок Значение Описание
Content-Type application/json Обязательно
X-API-Key Ваш Payout API Key Обязательно

Параметры:

Параметр Тип Обязательно Описание
recipient string Да Email или wallet ID получателя (например: user@example.com или U12345678)
amount number Да Сумма выплаты (минимум зависит от валюты)
currency string Нет RUB, USD, EUR, TON, BTC, USDT и другие (по умолчанию: RUB)
description string Нет Описание выплаты (опционально)
metadata object Нет Дополнительные данные (опционально)

Примеры выплат в разных валютах:

PHP — Выплаты на кошелёк LunaPay
<?php
$apiKey = 'ваш_payout_api_key';

// Выплата в рублях по email
$data = [
    'recipient' => 'user@example.com',
    'amount' => 500,
    'currency' => 'RUB',
    'description' => 'Зарплата за декабрь'
];

// Выплата в USDT по wallet ID
$data = [
    'recipient' => 'U12345678',
    'amount' => 100,
    'currency' => 'USDT',
    'description' => 'Реферальная выплата'
];

// Выплата в долларах
$data = [
    'recipient' => 'U87654321',
    'amount' => 50,
    'currency' => 'USD',
    'description' => 'Комиссия'
];

// Выплата в TON
$data = [
    'recipient' => 'partner@example.com',
    'amount' => 10,
    'currency' => 'TON',
    'description' => 'Партнерская выплата'
];

// Выплата в евро
$data = [
    'recipient' => 'U99999999',
    'amount' => 75,
    'currency' => 'EUR',
    'description' => 'Возврат средств'
];

$ch = curl_init('https://lunapay.store/api/payouts/create');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => json_encode($data),
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/json',
        'X-API-Key: ' . $apiKey
    ]
]);

$response = curl_exec($ch);
$result = json_decode($response, true);

if ($result['success']) {
    echo 'Выплата создана!';
    echo 'ID выплаты: ' . $result['payout']['payoutId'];
}
?>

Пример ответа:

JSON — Успешный ответ
{
  "success": true,
  "payout": {
    "payoutId": "PO_1702377600000_A1B2C3D4",
    "recipient": "U12345678",
    "amount": 500,
    "currency": "RUB",
    "status": "completed",
    "createdAt": "2024-12-10T12:00:00.000Z"
  }
}

📋 Форматы получателя:

  • Email: user@example.com — выплата на пользователя по email
  • Wallet ID: U12345678 — выплата по номеру кошелька (формат U + 8 цифр)

Оба формата работают одинаково. Wallet ID можно найти в личном кабинете пользователя.

⚠️ Минимальные суммы выплат:

  • RUB: 1 ₽
  • USD, EUR: 0.01
  • TON, USDT: 0.01
  • BTC: 0.00000001

Массовые выплаты (Batch)

Создайте до 100 выплат одним запросом. Можно комбинировать разные валюты и получателей (email и wallet ID).

POST https://lunapay.store/api/payouts/batch

Пример на PHP:

PHP — Массовые выплаты
<?php
$apiKey = 'ваш_payout_api_key';

$data = [
    'payouts' => [
        [
            'recipient' => 'user1@example.com',
            'amount' => 1000,
            'currency' => 'RUB',
            'description' => 'Зарплата'
        ],
        [
            'recipient' => 'U12345678',
            'amount' => 50,
            'currency' => 'USDT',
            'description' => 'Бонус'
        ],
        [
            'recipient' => 'U87654321',
            'amount' => 100,
            'currency' => 'USD',
            'description' => 'Комиссия'
        ],
        [
            'recipient' => 'partner@example.com',
            'amount' => 25,
            'currency' => 'EUR',
            'description' => 'Возврат'
        ]
    ]
];

$ch = curl_init('https://lunapay.store/api/payouts/batch');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => json_encode($data),
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/json',
        'X-API-Key: ' . $apiKey
    ]
]);

$response = curl_exec($ch);
$result = json_decode($response, true);

if ($result['success']) {
    echo 'Успешно: ' . $result['successful'] . ' из ' . $result['total'];
}
?>

🔔 Webhooks

Webhook — это POST-запрос от LunaPay на ваш сервер при изменении статуса платежа.

⚠️ Требования:

  • Доступен из интернета
  • Обязательно HTTPS
  • Отвечает за 10 секунд
  • Возвращает статус 200 OK

Проверка подписи

Заголовок X-Signature содержит HMAC-SHA256 подпись.

PHP — Обработчик webhook
<?php
$secretKey = 'ваш_secret_key';
$body = file_get_contents('php://input');
$signature = $_SERVER['HTTP_X_SIGNATURE'] ?? '';

// Проверка подписи
$expected = hash_hmac('sha256', $body, $secretKey);
if (!hash_equals($expected, $signature)) {
    http_response_code(401);
    die(json_encode(['error' => 'Invalid signature']));
}

$data = json_decode($body, true);

if ($data['status'] === 'completed') {
    // Обработка успешного платежа
    // UPDATE orders SET status='paid' WHERE order_id=...
}

http_response_code(200);
echo json_encode(['success' => true]);
?>

💻 Полные примеры на PHP

Полная интеграция

payment.php
<?php
// Создание платежа
$apiKey = 'ваш_api_key';
$orderId = 'ORDER_' . time();

$data = json_encode([
    'amount' => 1500,
    'orderId' => $orderId,
    'description' => 'Оплата товара',
    'metadata' => ['userId' => $_SESSION['user_id']]
]);

$ch = curl_init('https://lunapay.store/api/payment/create');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => $data,
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/json',
        'X-API-Key: ' . $apiKey
    ]
]);

$response = curl_exec($ch);
$result = json_decode($response, true);

if ($result['success']) {
    header('Location: ' . $result['payment']['paymentUrl']);
    exit;
}
?>
webhook.php
<?php
require_once 'config.php';
$secretKey = 'ваш_secret_key';

$body = file_get_contents('php://input');
$signature = $_SERVER['HTTP_X_SIGNATURE'] ?? '';

$expected = hash_hmac('sha256', $body, $secretKey);
if (!hash_equals($expected, $signature)) {
    http_response_code(401);
    die();
}

$data = json_decode($body, true);

// Проверка идемпотентности
$stmt = $pdo->prepare("SELECT id FROM payments WHERE payment_id = ?");
$stmt->execute([$data['paymentId']]);
if ($stmt->fetch()) {
    http_response_code(200);
    die(json_encode(['success' => true]));
}

if ($data['status'] === 'completed') {
    // Обновляем заказ
    $pdo->prepare("UPDATE orders SET status='paid' WHERE order_id=?")
        ->execute([$data['orderId']]);
    
    // Сохраняем платёж
    $pdo->prepare("INSERT INTO payments (payment_id, order_id, amount) VALUES (?,?,?)")
        ->execute([$data['paymentId'], $data['orderId'], $data['amount']]);
}

http_response_code(200);
echo json_encode(['success' => true]);
?>

⚠️ Коды ошибок

Код Значение
400 Неверные параметры
401 Неверный API Key
404 Платёж не найден
500 Ошибка сервера

Типичные ошибки

Платёж с таким orderId уже существует

Используйте уникальный orderId

Неверный API Key

Проверьте ключ в настройках

💬 Поддержка

Контакты:

❓ FAQ

Как быстро зачисляются средства?

Мгновенно после подтверждения платежа.

Что делать если webhook не приходит?

  • Проверьте доступность URL
  • Используйте HTTPS
  • Отвечайте 200 OK