# Тестирование

> Проверяйте состояния инвойсов и выводов с тестовыми ключами, подписанными вебхуками и методами симуляции без движения реальных средств.

Тестовый режим позволяет проверить интеграцию целиком: тот же API, моделирование транзакций и подписанные вебхуки, но без перевода средств в блокчейне.

## Тестовый и рабочий режим

| Параметр | Тестовый режим | Рабочий режим |
|----------|---------|------------|
| Base URL | `api.paymos.io/v1` | `api.paymos.io/v1` |
| API-ключи | `pk_test_` / `rk_test_` ID + `sk_test_` секреты | `pk_live_` / `rk_live_` ID + `sk_live_` секреты |
| Транзакции | Симулированные | Реальный блокчейн |
| Вебхуки | Отправляются | Отправляются |
| Средства | Без реальной стоимости | Реальные токены |

## Симуляция платежей

Тестовые платежи не подтверждаются автоматически — запускайте симуляцию явно:

:::endpoint
POST /v1/sandbox/invoices/:invoice_id/simulate-payment
:::

:::info
Тело: `{ "stage": "paid" }`, где `stage` — одно из `paid`, `overpaid`, `underpay`, `cancel`. Подпишите запрос как любой вызов `/v1`. Метод работает только для тестовых инвойсов; ключ рабочего режима получает `403 not_sandbox`. Жизненный цикл и события вебхука совпадают с реальным платежом в блокчейне, поэтому обработчик остаётся единым для обоих режимов.
:::

## Симуляция выводов

Тестовые выводы не отправляют транзакцию в сеть. Пометьте ожидающий тестовый вывод как завершённый, чтобы проверить процесс целиком:

:::endpoint
POST /v1/sandbox/withdrawals/:withdrawal_id/simulate-completion
:::

Тело запроса не требуется. Подпишите вызов ключом для вывода; метод работает только для тестовых операций. Он переводит вывод в `completed` и отправляет тот же вебхук `withdrawal.completed`, что и реальная транзакция, поэтому код сверки остаётся единым.

## Симуляция депозитов канала

Платёжные каналы в песочнице вычисляют адреса локально и не следят за блокчейном, поэтому депозиты создаются явно:

:::endpoint
POST /v1/sandbox/payment-channels/:payment_channel_id/simulate-deposit
:::

:::info
Тело: `{ "amount": "100", "currency": "USDT", "network": "TRC20", "stage": "confirmed" }` — `stage` принимает значения `confirming`, `reorged` или `confirmed`, по умолчанию `confirmed`. Подписывайте ключом `Payment` из песочницы; ключ рабочей среды отклоняется до того, как что-либо будет создано. Каждый вызов сначала отправляет `payment_channel.deposit.confirming`, затем терминальное событие запрошенной стадии, поэтому обработчик вебхуков одинаков в песочнице и в рабочей среде. Полный контракт — в [Симуляции депозита канала](/ru/docs/payment-channels/simulate-deposit.md).
:::

## Тестирование вебхуков локально

Откройте доступ к локальному серверу через туннель:

```bash
ngrok http 3000
```

Укажите URL вебхука в [**Дашборд → Разработчик → Вебхуки**](/developers/webhooks):

`https://abc123.ngrok.io/api/paymos-webhook`

## Песочница вебхуков

У документации в дашборде есть вкладка **Консоль**. Она работает только в тестовом режиме: создаёт тестовый инвойс через Merchant API, доводит его до выбранного исхода и отправляет полностью подписанное событие на ваш зарегистрированный URL. Проверку подписи так можно отладить, не отправляя ни одного реального перевода.

:::dash-numbered
- В тестовом режиме перейдите в **Дашборд → Разработчик → Документация**
- Откройте раздел [**Вебхуки → Тестирование**](/ru/docs/webhooks/testing.md), затем вкладку **Консоль**
- В поле **Тип события** выберите исход — точная оплата, переплата, недоплата или отмена, — укажите сумму и валюту и нажмите **Симулировать**
- Проверьте логи сервера на полученное событие и заголовок `X-Webhook-Signature`
:::

## Чек-лист перед запуском

:::dash-checklist
- Проверка подписи вебхуков работает
- Создание инвойсов возвращает корректные данные
- Платёжный процесс корректно перенаправляет
- Обработка ошибок покрывает ответы со статусом не 2xx (валидация 4xx, конфликты 409)
- Идемпотентность с `external_order_id` работает
- Идентификаторы ключей заменены с `pk_test_` / `rk_test_` на `pk_live_` / `rk_live_`, а секреты — с `sk_test_` на `sk_live_`
:::
