Песочница
Тестовый ключ: те же адреса и ответы без денег, сбои по заказу, машина времени.
Проверить интеграцию целиком можно без настоящих денег. В кабинете, раздел «Песочница», выпустите тестовый ключ: он начинается с sb_ и ходит на те же адреса /api/v1/vpn/*. Ответы такие же, как в бою, с заголовком X-Sandbox: true, а данные свои: настоящие деньги не списываются, запросы к поставщику не идут, боевые подписки тестовому ключу не видны, тестовые боевому тоже. Цены и тарифы настоящие, поэтому суммы совпадут с боем.
Тестовый депозит до $1 000. Пополняется кнопкой в кабинете или POST /deposit с провайдером sandbox: такой счёт оплачивается сам через 10 секунд и присылает deposit.credited. Нехватку денег проверяйте честно: потратьте депозит, и покупка ответит 402 insufficient_balance.
Все операции работают как в бою: покупка на срок и «Навсегда», пробный период, продление, апгрейд, трафик, докупки, заморозка, ссылка, устройства (выдуманные), GET /operations, повтор с тем же custom_id. Ссылка подписки открывается, но к VPN не подключает.
Имитация сбоев. Заголовок X-Sandbox-Simulate на любом платном запросе:
upstream_unavailable: 503 сRetry-After, деньги не списаны, повтор с тем жеcustom_idвыполнится;lost_response: операция прошла, а ответ 503; повтор с тем жеcustom_idвернёт результат сidempotent_replay: true. Главная проверка, что ваш клиент не покупает второй раз;slow: ответ через 8 секунд, проверка ваших таймаутов;in_progress: 409operation_in_progress.
Машина времени. POST /sandbox/subscriptions/{id}/advance с телом {"hours": 700} сдвигает срок подписки и шлёт те же события, что в бою: subscription.expires_in_72h, _48h, _24h и subscription.expired. В ответе список отправленных событий. Работает только с тестовым ключом.
Вебхук свой: отдельный адрес и секрет в кабинете, подпись X-Signature-V2 та же, в теле sandbox: true, в заголовках X-Sandbox: true и User-Agent: vpnfranchise-webhooks-sandbox/1. Ответ ждём 3 секунды. Повторов три (через 1, 5 и 15 минут), лента GET /events и журнал GET /webhook/deliveries тоже свои. Боевой приёмник пусть проверяет подпись боевым секретом: тестовое событие она не пройдёт.
Пределы. Не больше 600 изменяющих запросов в час (дальше 429 rate_limited), до 1 000 подписок. События и операции хранятся неделю: повтор с тем же custom_id позже выполнится заново. Тестовые данные, к которым не обращались 30 дней, стираются целиком. Стереть их сразу можно кнопкой в кабинете: ключ и адрес вебхука останутся.
Прежде чем идти в бой, прогоните в песочнице: покупку, повтор после lost_response, отказ upstream_unavailable с ожиданием Retry-After, 402 при пустом депозите, приём вебхука с проверкой подписи, окончание срока через машину времени. Потом замените ключ на боевой.