Перейти к основному содержимому

Проверка интеграции

Тестового режима и тестового магазина у AvantPay нет. Все платежи настоящие, поле test всегда false.

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

Все запросы и уведомления видны в личном кабинете: Ещё → Разработчикам → Логи запросов. Там же видно, что ответил ваш сервер на уведомление.

1. Ключи​

curl "https://api.avantpay.io/v3/payments?limit=1" \
-u "$AVANTPAY_SHOP_ID:$AVANTPAY_SECRET_KEY"

Ответ 200 — ключи верные. Ответ 401 — неверный ID магазина или ключ.

2. Платёж без оплаты​

Проверяет создание платежа, приём уведомления payment.canceled и запрос платежа. Денег не нужно.

  1. Создайте платёж через свою интеграцию. Или командами ниже: первая строка создаёт ключ идемпотентности (работает в Linux и macOS).

    KEY=$(uuidgen)

    curl https://api.avantpay.io/v3/payments \
    -X POST \
    -u "$AVANTPAY_SHOP_ID:$AVANTPAY_SECRET_KEY" \
    -H "Idempotence-Key: $KEY" \
    -H "Content-Type: application/json" \
    -d '{
    "amount": {
    "value": "100.00",
    "currency": "RUB"
    },
    "capture": true,
    "confirmation": {
    "type": "redirect",
    "return_url": "https://example.com/orders/test"
    },
    "description": "Проверка интеграции",
    "metadata": {
    "email": "[email protected]",
    "order_id": "test"
    }
    }'
  2. Откройте confirmation.confirmation_url и убедитесь, что страница оплаты открывается. Не платите.

  3. Дождитесь уведомления payment.canceled. Срок оплаты — 20 минут после создания, он в expires_at. Платёж отменяется не в ту же секунду после expires_at: сначала AvantPay проверяет, не прошла ли оплата. Обычно canceled приходит в течение 10 минут после expires_at, в редких случаях — до 2 часов.

  4. Проверьте:

    • ваш сервер получил уведомление, проверил подпись и ответил 200;
    • запрос GET /v3/payments/{payment_id} вернул "status": "canceled";
    • заказ не выполнен.

3. Повтор запроса​

Отправьте тот же запрос на создание платежа ещё раз — с тем же Idempotence-Key и тем же телом. Если создавали платёж командами выше, повторите только команду curl, без строки с KEY. В ответе должен быть тот же id. Значит, повтор после таймаута не создаст второй платёж.

4. Повтор уведомления​

Временно сделайте так, чтобы ваш сервер ответил на уведомление кодом 500. Примерно через минуту AvantPay пришлёт его ещё раз. Убедитесь, что повторное уведомление не выполняет заказ второй раз.

5. Настоящий платёж​

  1. Узнайте минимальную сумму в личном кабинете: Ещё → Способы оплаты.
  2. Создайте платёж на эту сумму и оплатите его сами — СБП или картой.
  3. Проверьте:
    • пришло уведомление payment.succeeded, ваш сервер ответил 200;
    • запрос GET /v3/payments/{payment_id} вернул "status": "succeeded";
    • заказ выполнен один раз, сумма платежа сверена с суммой заказа;
    • покупатель вернулся на return_url и увидел правильный результат.
  4. Верните деньги в личном кабинете: найдите платёж в разделе платежей и оформите возврат.

Если что-то не работает​

Что видноЧто проверить
401 invalid_credentialsID магазина и ключ. Не перевыпускали ли ключ. Запросы должны идти на https://api.avantpay.io/v3.
403 forbiddenВключено ли у ключа право «Платежи». Если нет — напишите в поддержку.
400 invalid_requestПоле из parameter. Описание — в description. Таблица ошибок — в справочнике: Создать платёж.
400, "parameter": "metadata.email"В запросе нет email покупателя или адрес неверный. Покупатель из Telegram — <id или username>@telegram.org.
400, "parameter": "capture"В запросе нет "capture": true.
400 not_supportedВ запросе поле, которого нет в API, например receipt. Уберите его.
404 на любой запросАдрес. Правильно: https://api.avantpay.io/v3/payments.
Уведомления не приходятАдрес и события в Ещё → Разработчикам → HTTP-уведомления. Адрес — https://, порт 443 или 8443, сертификат действующий. Запись об отправке — в Логах запросов. Платежи, созданные до того, как указан адрес, уведомлений не получат: проверьте их запросом GET /v3/payments/{payment_id}.
Сервер отклоняет уведомленияПодпись считается по строке <Signature-Timestamp>.<тело>, тело — как оно пришло, до разбора JSON. Часы сервера идут верно (допуск — 5 минут).

В письме в поддержку ([email protected]) укажите id платежа, id ошибки из ответа и значение заголовка X-Request-Id.