NASIK Pay API

Прием платежей через ваш сайт

Клиент создает счет через API, покупатель сразу попадает в ЮKassa (без промежуточной страницы VPN), комиссия считается на вашей стороне, а бизнес получает подписанный webhook о результате.

1

Выдаете API-ключ

Для каждого бизнеса задается ключ, webhook URL и ваша комиссия.

2

Клиент создает счет

API возвращает платежную ссылку на страницу NASIK Pay.

3

Вы отправляете webhook

После успешной оплаты клиент получает событие payment.succeeded.

Для владельца сервиса

Клиентов, ключи, webhook и комиссии создавайте в админке: /admin/gateway. После создания админка сразу даст готовый текст инструкции для бизнеса. Владелец бизнеса потом заходит в /merchant по своему API key, а тестовое подключение доступно на /test.

От клиента нужны только название бизнеса, webhook URL, success URL и fail URL. API key и webhook secret генерирует NASIK Pay, комиссию задаете вы.

Важно по деньгам

Карты не хранятся на сайте. Оплата проводится через подключенный эквайринг на вашей стороне. Для приема денег за другой бизнес нужны договоры, чеки/фискализация и корректная агентская схема.

Техническая схема готовит API-шлюз и учет комиссии, но юридическую модель нужно закрепить до запуска.

Как вставить оплату на сайт клиента

Этот код должен быть на сервере клиента. API key нельзя вставлять в браузерный JavaScript. После создания счета покупатель сразу перенаправляется в ЮKassa (без промежуточной страницы VPN).

<?php
$apiKey = 'YOUR_API_KEY';
$payload = [
    'order_id' => 'order-' . time(),
    'amount' => 1500,
    'currency' => 'RUB',
    'description' => 'Заказ на сайте',
    'customer' => [
        'email' => 'buyer@example.com',
    ],
    'receipt' => [
        'customer' => [
            'email' => 'buyer@example.com',
        ],
        'items' => [[
            'description' => 'Заказ на сайте',
            'quantity' => '1.00',
            'amount' => [
                'value' => '1500.00',
                'currency' => 'RUB',
            ],
            'vat_code' => 1,
            'payment_subject' => 'service',
            'payment_mode' => 'full_prepayment',
        ]],
    ],
    'success_url' => 'https://client.ru/pay/success',
    'fail_url' => 'https://client.ru/pay/fail',
];

$ch = curl_init('https://nasik24.ru/api/v1/payments');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/json',
        'X-Api-Key: ' . $apiKey,
    ],
    CURLOPT_POSTFIELDS => json_encode($payload, JSON_UNESCAPED_UNICODE),
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);

header('Location: ' . $response['payment']['payment_url']);
exit;

Что отдаете клиенту

API keyключ из админки, передается в заголовке X-Api-Key
Webhook secretсекрет для проверки подписи X-Nasik-Signature
Endpointhttps://nasik24.ru/api/v1/payments
Кабинетhttps://nasik24.ru/merchant, вход по API key клиента
Webhook клиентаURL на сайте клиента, куда NASIK Pay отправит payment.succeeded после успешной оплаты
Webhook ЮKassaв вашей ЮKassa укажите https://nasik24.ru/api/v1/yookassa/webhook, чтобы NASIK Pay получал успешные оплаты автоматически
Способ оплатывыбирается в админке клиента: все способы, только СБП или только банковские карты
Чекидля фискального чека передавайте customer и receipt.items в запросе создания счета
Результатклиент берет payment.payment_url (ссылка сразу на ЮKassa) и отправляет туда покупателя

Создать счет

curl -X POST https://nasik24.ru/api/v1/payments \
  -H "X-Api-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"order_id": "order-1001", "amount": 1500, "currency": "RUB", "description": "Заказ #1001", "customer": {"email": "buyer@example.com"}, "receipt": {"customer": {"email": "buyer@example.com"}, "items": [{"description": "Заказ #1001", "quantity": "1.00", "amount": {"value": "1500.00", "currency": "RUB"}, "vat_code": 1, "payment_subject": "service", "payment_mode": "full_prepayment"}]}, "success_url": "https://client.ru/success", "fail_url": "https://client.ru/fail", "webhook_url": "https://client.ru/webhooks/nasik-pay", "metadata": {"user_id": 42}}'

Ответ API

{
  "ok": true,
  "payment": {
    "id": "pay_xxxxx",
    "order_id": "order-1001",
    "status": "pending",
    "amount": 1500.00,
    "commission": {"percent": 5, "fixed": 0, "amount": 75.00, "included": false, "mode": "added"},
    "total_amount": 1575.00,
    "payment_method": {"type": "sbp", "label": "Только СБП"},
    "payment_url": "https://yoomoney.ru/checkout/payments/v2/contract?orderId=...",
    "confirmation_url": "https://yoomoney.ru/checkout/payments/v2/contract?orderId=..."
  }
}

Webhook клиента

После успешной оплаты NASIK Pay отправляет POST на webhook URL клиента. Если в payload пришло event=payment.succeeded и подпись X-Nasik-Signature совпала, сайт клиента отмечает заказ оплаченным и отвечает HTTP 200.

$payload = file_get_contents('php://input');
$signature = $_SERVER['HTTP_X_NASIK_SIGNATURE'] ?? '';
$expected = hash_hmac('sha256', $payload, 'YOUR_WEBHOOK_SECRET');
if (!hash_equals($expected, $signature)) {
    http_response_code(401);
    exit('bad signature');
}
$event = json_decode($payload, true);

if (($event['event'] ?? '') === 'payment.succeeded') {
    $orderId = $event['order_id'];
    $paymentId = $event['payment_id'];
    // Здесь отметьте заказ оплаченным в вашей базе.
}

http_response_code(200);
echo 'ok';

Endpoint'ы

POST/api/v1/paymentsсоздать счет
GET/api/v1/payments/{id}получить статус
POST/api/v1/payments/{id}/syncсинхронизировать с эквайрингом
POST/api/v1/yookassa/webhookwebhook ЮKassa для NASIK Pay
GET/platim/pay/{id}страница оплаты