Модули для CMS и понятный API
Магазин на популярной CMS подключается модулем без программиста. Для своего сайта или приложения — REST API с примерами на PHP, Python и Node.js и песочницей с тестовыми ключами.
Подключение к CMS за один вечер
Архив модуля и пошаговую инструкцию менеджер передаёт вместе с ключами. Обновления модулей — в кабинете.
WooCommerce
WordPressСпособ оплаты NordPay появляется в оформлении заказа WooCommerce. Покупатель выбирает СБП, карту или криптовалюту на странице оплаты, статус заказа меняется сам.
- Оплата заказа через СБП, карты и USDT
- Автоматическая смена статуса заказа по вебхуку
- Возврат полностью или частично из карточки заказа
- Тестовый режим отдельным переключателем
Установка
- 1
В админке WordPress откройте «Плагины → Добавить новый → Загрузить плагин» и установите архив модуля.
- 2
Перейдите в «WooCommerce → Настройки → Платежи → NordPay» и вставьте секретный ключ и секрет вебхука из кабинета.
- 3
Скопируйте адрес для уведомлений из настроек модуля в кабинет NordPay, раздел «Вебхуки и API-ключи».
- 4
Включите тестовый режим, оплатите заказ тестовой картой и проверьте статус. Затем замените ключ на боевой.
Ваш язык — наши примеры
Примеры работают на чистом HTTP без зависимостей. Обёртки для PHP, Python и Node.js передаём при подключении вместе с ключами.
Один запрос — и покупатель на странице оплаты
REST и JSON, ключи Bearer, суммы в копейках. Повторный запрос с тем же Idempotency-Key не создаст второй платёж — безопасно ретраить при обрывах сети.
- Тестовые и боевые ключи — sk_test_ и sk_live_, одинаковые методы и ответы
- Вебхуки с подписью HMAC-SHA256 и повторами до суток при недоступности
- USDT в пяти сетях — параметр crypto_network: trc20, ton, bep20, erc20, sol или выбор покупателя на странице оплаты
- Обёртки для PHP, Python и Node.js передаём при подключении, а примеры справа работают без зависимостей
const res = await fetch('https://api.nordpay.pro/v1/payments', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.NORDPAY_SECRET_KEY}`,
'Idempotency-Key': `order-${order.id}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
amount: 499000,
currency: 'RUB',
method: null,
description: `Заказ №${order.id}`,
order_id: String(order.id),
return_url: `https://shop.ru/orders/${order.id}`,
}),
});
const payment = await res.json();
redirect(payment.confirmation.url);Как покупатель платит
Выберите сценарий под ваш продукт — их можно сочетать на одном сайте.
Страница оплаты
Быстрый стартСоздаёте платёж на сервере и отправляете покупателя по confirmation.url. Все методы, 3-D Secure и QR СБП уже на странице — ничего не нужно верстать.
Ссылка на оплату
Без разработчикаБез кода: ссылку или QR создаёте в кабинете и отправляете клиенту в мессенджер или по почте. Подходит для услуг, предоплат, самозанятых и частных лиц без сайта.
QR СБП в своём интерфейсе
Для приложенийБерёте sbp.qr_payload из ответа API и рисуете QR прямо в приложении или на экране кассы. Статус приходит вебхуком и по SSE.
document.querySelector('#pay').addEventListener('click', async () => {
const res = await fetch('/api/orders/1042/pay', { method: 'POST' });
const { confirmation_url } = await res.json();
window.location.assign(confirmation_url);
});Платёж создаётся на вашем сервере секретным ключом, в браузер уходит только ссылка confirmation.url. Ключи никогда не попадают во фронтенд.
Узнайте об оплате раньше, чем покупатель вернётся на сайт
Каждое событие подписано: заголовок NordPay-Signature содержит время и HMAC-SHA256 от тела запроса. Если ваш сервер не ответил 2xx, повторим через 1 минуту, 5 и 30 минут, 2, 6 и 24 часа.
import crypto from 'node:crypto';
import express from 'express';
const app = express();
app.post('/webhooks/nordpay', express.raw({ type: 'application/json' }), (req, res) => {
const header = req.get('NordPay-Signature') || '';
const { t, v1 } = Object.fromEntries(header.split(',').map((p) => p.split('=')));
const expected = crypto
.createHmac('sha256', process.env.NORDPAY_WEBHOOK_SECRET)
.update(`${t}.${req.body}`)
.digest('hex');
const fresh = Math.abs(Date.now() / 1000 - Number(t)) < 300;
const valid = v1 && v1.length === expected.length && crypto.timingSafeEqual(Buffer.from(v1), Buffer.from(expected));
if (!fresh || !valid) return res.sendStatus(400);
const event = JSON.parse(req.body);
if (event.type === 'payment.succeeded') markOrderPaid(event.data.object.order_id);
res.sendStatus(200);
});Нужна помощь с интеграцией?
Подскажем, какой сценарий подойдёт, пришлём модуль для вашей CMS и проверим тестовые платежи вместе с вашим разработчиком.
- Подключение бесплатно, без абонентской платы
- Компании, ИП, самозанятые и частные лица
- Тестовый ключ — до подписания договора