Тестирование
Песочница повторяет боевой контур целиком — счета, страницу оплаты, статусы, возвраты и вебхуки, — но не двигает реальные деньги. Ключи sk_test_ доступны сразу после создания проекта, до модерации.
API v1 · обновлено 2026-09-12
Тестовые ключи
Каждому проекту выдаются две пары ключей: боевая (sk_live_…) и тестовая (sk_test_…). public_id и webhook_secret общие. Режим определяется ключом, которым авторизован запрос, — эндпоинты и формат ответов идентичны, отдельного хоста для песочницы нет.
Тестовая страница оплаты
Откройте url из ответа — это обычная страница оплаты с жёлтой пометкой «Тестовый режим». Вместо банка на ней три кнопки, каждая переводит счёт в нужный статус и запускает соответствующий вебхук:
| Кнопка | Статус счёта | Событие | Куда вернёт покупателя |
|---|---|---|---|
| Успех | paid | invoice.paid | successUrl |
| Отказ | failed | invoice.failed | failUrl |
| Истёк | expired | invoice.expired | failUrl |
Кнопки показываются только для счетов, созданных тестовым ключом. На боевых счетах их нет. Возврат по тестовому счёту (POST /invoices/{id}/refund) тоже работает и присылает refund.succeeded.
Вебхуки из песочницы
Уведомления уходят на тот же webhook_url проекта, с той же подписью на webhook_secret. Тестовое событие отличают два признака: заголовок X-Paydex-Test: 1 и поле "isTest": true в объекте счёта. По любому из них ваш код отделяет тест от боевых событий — например, не выдаёт реальный товар.
Для локальной разработки нужен публичный HTTPS-адрес: пробросьте порт через ngrok, cloudflared или аналог и укажите выданный адрес в настройках проекта. История доставок и ответы вашего сервера — в карточке платежа в кабинете, там же кнопка «Повторить».
Ограничения песочницы
- Баланс не меняется:
GET /balanceтестовым ключом возвращает нули, выводы недоступны. - Тестовые счета не попадают в отчёты по обороту и не тарифицируются; комиссия в ответах считается по реальной ставке, чтобы вы видели итоговые суммы.
- Тестовые и боевые счета хранятся раздельно:
GET /invoices/{id}боевым ключом не найдёт тестовый счёт и наоборот. - Ограничение частоты то же — 60 запросов в секунду; polling-лимит на
GET /invoices/{id}— тоже.
Что стоит прогнать
- Успешная оплата — заказ помечается оплаченным по вебхуку, а не по возврату покупателя.
- Повтор вебхука — нажмите «Повторить» в кабинете: второй
invoice.paidс тем жеX-Paydex-Delivery-Idне должен выдать товар ещё раз. - Отказ и истечение — покупателю предлагается оплатить заново (новый счёт с новым
orderId). - Неверная подпись — отправьте себе запрос с испорченным
X-Paydex-Signature: обработчик отвечает 401 и ничего не меняет. - Возврат — после
refund.succeededзаказ отменяется, доступ отзывается. - Идемпотентность создания — повторный
POST /invoicesс тем жеorderIdвозвращает тот жеid.
Переход в боевой режим
- Проект одобрен модерацией (см. требования к сайту).
- Ключ заменён на
sk_live_; код не менялся. - Ключи хранятся в переменных окружения; в репозитории их нет.
- Один реальный платёж на минимальную сумму прошёл и обработан.