Выдаете API-ключ
Для каждого бизнеса задается ключ, webhook URL и ваша комиссия.
Клиент создает счет через API, покупатель сразу попадает в ЮKassa (без промежуточной страницы VPN), комиссия считается на вашей стороне, а бизнес получает подписанный webhook о результате.
Для каждого бизнеса задается ключ, webhook URL и ваша комиссия.
API возвращает платежную ссылку на страницу NASIK Pay.
После успешной оплаты клиент получает событие payment.succeeded.
Клиентов, ключи, webhook и комиссии создавайте в админке: /admin/gateway. После создания админка сразу даст готовый текст инструкции для бизнеса. Владелец бизнеса потом заходит в /merchant по своему API key, а тестовое подключение доступно на /test.
Техническая схема готовит 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 |
| Endpoint | https://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}}'
{
"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=..."
}
}
После успешной оплаты 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';
| POST | /api/v1/payments | создать счет |
|---|---|---|
| GET | /api/v1/payments/{id} | получить статус |
| POST | /api/v1/payments/{id}/sync | синхронизировать с эквайрингом |
| POST | /api/v1/yookassa/webhook | webhook ЮKassa для NASIK Pay |
| GET | /platim/pay/{id} | страница оплаты |