Тестовые ключи, карты и сценарии
В тестовом режиме проходят все сценарии — успех, отказ, 3-D Secure, возвраты и вебхуки, — а деньги не списываются.
curl -X POST https://api.nordpay.pro/v1/sandbox/keys \
-H "Content-Type: application/json" \
-d '{}'{
"secret_key": "sk_test_51c8…f2a9",
"webhook_secret": "a3f9…7c1e",
"merchant_id": "mch_test_7Hq2",
"expires_at": "2026-11-09T12:00:00Z"
}Тестовые ключи
- Временный ключ песочницы —
POST /v1/sandbox/keysбез авторизации. Создаёт отдельный тестовый магазин на 24 часа и возвращаетsecret_keyиwebhook_secret. Не больше 10 ключей в час с одного IP-адреса. - Постоянный тестовый ключ — в кабинете, раздел «Вебхуки и API-ключи», режим «Тест». Платежи по нему видны в кабинете.
{
"error": {
"type": "rate_limit_error",
"code": "rate_limited",
"message": "Слишком много ключей с одного адреса, попробуйте позже",
"request_id": "req_0d6f3a29b1"
}
}Тестовые карты
Вводите на странице оплаты тестового платежа. Срок действия — любой в будущем, CVC — любые три цифры.
| Номер | Карта | Результат |
|---|---|---|
4242 4242 4242 4242 | Успешная оплата | |
5555 5555 5555 4444 | Успешная оплата | |
2200 0000 0000 0004 | Успешная оплата | |
2200 0000 0000 0012 | Запрос 3-D Secure, затем успех | |
4000 0000 0000 0002 | Отказ: payment_declined | |
4000 0000 0000 9995 | Отказ: insufficient_funds |
Для карты 2200 0000 0000 0012 откроется тестовое окно 3-D Secure: введите любой код из 4–6 цифр.
{
"id": "pay_2Kq8sD1fVxJ7mN4p",
"object": "payment",
"status": "failed",
"method": "card",
"card": {
"brand": "visa",
"last4": "9995"
},
"failure": {
"code": "insufficient_funds",
"message": "Недостаточно средств"
}
}СБП и USDT в тесте
В тестовом режиме QR-код СБП и адрес кошелька — учебные: переводить по ним реальные деньги не нужно. На странице оплаты тестового платежа есть кнопки «Оплатить успешно» и «Отклонить» — они задают исход и запускают вебхуки так же, как настоящая оплата.
В песочнице работают все пять сетей USDT. Адрес выдаётся в формате выбранной сети, а после «оплаты» подтверждения приходят по одному через SSE и вебхуки — так можно проверить, как ваш интерфейс показывает прогресс. Ссылка explorer_url в тесте ведёт на настоящий обозреватель сети, но учебной транзакции там нет.
| Сеть | Зачисление | Пример адреса |
|---|---|---|
TRON TRC20trc20 | 19 подтверждений около минуты | TJHF5yEb46hbaNgdv2uy4PAtumFZG9RiLv |
TON Jettonton | 1 подтверждение несколько секунд | UQBaLWowuu0AfLvpXwr6Mjk6JJ1VaKLD5hKD32DDzC9eRtyn |
BNB Smart Chain BEP20bep20 | 15 подтверждений около минуты | 0xae0ad59ac51c481c06b20874f1274d73f4c40df5 |
Ethereum ERC20erc20 | 12 подтверждений 3–5 минут | 0x409e9f502a590bcbfdfbbfad834bdf8c7aaed63b |
Solana SPLsol | 32 подтверждения до 30 секунд | 3XWcTLJ6gK75MdfwH8LCXugXS5Mc3gmMJPziMz3vwCNa |
curl -X POST https://api.nordpay.pro/v1/payments \
-H "Authorization: Bearer $NORDPAY_SECRET_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"amount": 250000,
"currency": "RUB",
"method": "crypto",
"crypto_network": "bep20",
"description": "Тест USDT BEP20"
}'{
"id": "pay_2Kq8sD1fVxJ7mN4p",
"method": "crypto",
"status": "pending",
"crypto_network": "bep20",
"crypto": {
"asset": "USDT",
"network": "bep20",
"chain": "BNB Smart Chain",
"standard": "BEP20",
"address": "0xae0ad59ac51c481c06b20874f1274d73f4c40df5",
"amount_crypto": "51.70",
"rate": "96.52",
"confirmations": 0,
"confirmations_required": 15,
"tx_hash": null,
"explorer_url": null,
"expires_at": "2026-11-08T13:00:00Z"
},
"livemode": false
}Симуляция исхода
Для автотестов исход платежа удобно задавать запросом: outcome — succeeded или failed. Работает только с ключами sk_test_.
После симуляции на ваши адреса уходят те же события, что и при настоящей оплате: payment.succeeded или payment.failed.
curl -X POST https://api.nordpay.pro/v1/sandbox/payments/pay_2Kq8sD1fVxJ7mN4p/simulate \
-H "Authorization: Bearer $NORDPAY_SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{
"outcome": "succeeded"
}'{
"id": "pay_2Kq8sD1fVxJ7mN4p",
"object": "payment",
"status": "succeeded",
"paid_at": "2026-11-08T12:03:41Z",
"livemode": false
}