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

Быстрый старт

Эта страница проводит через весь путь: от ключей до проверки оплаты. Примеры — на cURL, Python, Node.js и PHP: выберите язык в любом блоке кода, и он запомнится на всех страницах. Все поля и ошибки — в справочнике API.

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

Шаг 1. Получите ключи и включите уведомления​

  1. Войдите в личный кабинет.
  2. Откройте Ещё → Разработчикам → API-ключ (открыть сразу). На телефоне вместо «Ещё» — «Меню».
  3. Скопируйте ID магазина из блока «Авторизация запросов». Это число, например 33661. Там же — адрес API: https://api.avantpay.io/v3.
  4. Нажмите Создать ключ. Ключ показывается целиком только один раз. Скопируйте его и сохраните в настройках своего сервера.
  5. Проверьте блок «Права ключа»: право «Платежи» должно быть включено. Если оно выключено, напишите в поддержку: [email protected]. Включить его в личном кабинете нельзя.

Если раздела «Разработчикам» нет, попросите владельца магазина добавить вас в разделе «Пользователи» с ролью «Разработчик».

Сохраните ID магазина и ключ в переменные окружения. Все примеры ниже берут их оттуда:

export AVANTPAY_SHOP_ID="33661"
export AVANTPAY_SECRET_KEY="<секретный ключ>"

Проверьте ключи. Этот запрос возвращает последний платёж магазина и ничего не меняет:

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

Ответ с кодом 200 — ключи верные. У нового магазина список пустой:

{
"type": "list",
"items": []
}

Ответ с кодом 401 и "code": "invalid_credentials" — неверный ID магазина или ключ. Проверьте, что скопировали их без пробелов.

Сразу включите уведомления — до первого платежа. Адрес уведомлений задаётся только в личном кабинете и запоминается в платеже при создании: платежи, созданные без адреса, уведомлений не получат.

  1. Откройте в личном кабинете Ещё → Разработчикам → HTTP-уведомления (открыть сразу).
  2. Нажмите Изменить настройки. Укажите адрес своего сервера, например https://example.com/avantpay/webhook. Адрес должен начинаться с https://.
  3. Отметьте события «Платёж оплачен» (payment.succeeded) и «Платёж отменён» (payment.canceled). Сохраните.

Обработчик уведомлений можно написать позже, на шаге 4.

Шаг 2. Создайте платёж​

Email покупателя обязателен

Передайте его в metadata.email. Покупатель из Telegram — <id или username>@telegram.org, например [email protected].

Отправьте запрос POST /v3/payments:

curl https://api.avantpay.io/v3/payments \
-X POST \
-u "$AVANTPAY_SHOP_ID:$AVANTPAY_SECRET_KEY" \
-H "Idempotence-Key: 7f1c9a52-3d4b-4e8f-a1b2-c3d4e5f6a7b8" \
-H "Content-Type: application/json" \
-d '{
"amount": {
"value": "100.00",
"currency": "RUB"
},
"capture": true,
"confirmation": {
"type": "redirect",
"return_url": "https://example.com/orders/1"
},
"description": "Заказ №1",
"metadata": {
"email": "[email protected]",
"order_id": "1"
}
}'

Что в запросе:

ЧтоЧто передать
Idempotence-KeyКлюч идемпотентности: любая уникальная строка до 64 символов, лучше UUID. Создайте его до запроса и сохраните в заказе. Если ответ не пришёл, повторите запрос с тем же ключом — второй платёж не появится. Подробнее
amount.valueСумма строкой с двумя знаками после точки.
amount.currencyRUB.
metadata.emailОбязательно. Email покупателя, до 254 символов. Покупатель из Telegram — <id или username>@telegram.org.
captureУказывается true.
confirmation.typeredirect — покупатель перейдёт на страницу оплаты AvantPay.
confirmation.return_urlКуда вернуть покупателя после оплаты или отказа от неё. Укажите адрес страницы заказа: AvantPay не добавляет к нему параметры.
descriptionНеобязательно. Описание до 128 символов. Его видит покупатель на странице оплаты.
metadata.order_idНеобязательно. Ваш номер заказа. Вернётся в объекте платежа и в уведомлениях.

Способ оплаты здесь не передан: покупатель выберет СБП или карту на странице оплаты. Все поля запроса — в справочнике: Создать платёж.

Ответ — объект платежа со статусом pending:

{
"id": "2f9b6c1e-4d7a-4c3b-9e8f-1a2b3c4d5e6f",
"status": "pending",
"paid": false,
"amount": {
"value": "100.00",
"currency": "RUB"
},
"description": "Заказ №1",
"recipient": {
"account_id": "33661"
},
"created_at": "2026-10-18T10:15:30.123Z",
"expires_at": "2026-10-18T10:35:30.123Z",
"confirmation": {
"type": "redirect",
"confirmation_url": "https://avantpay.io/link/Aq91c7d",
"return_url": "https://example.com/orders/1"
},
"test": false,
"refundable": false,
"metadata": {
"email": "[email protected]",
"order_id": "1"
}
}

Сохраните id платежа в своём заказе. По нему вы проверите платёж, когда придёт уведомление.

Шаг 3. Отправьте покупателя на страницу оплаты​

Перенаправьте покупателя на адрес из confirmation.confirmation_url. Например, ответьте браузеру кодом HTTP 302 с этим адресом в заголовке Location или покажите кнопку «Оплатить» с этой ссылкой.

Покупатель должен заплатить до expires_at — это 20 минут после создания платежа. Потом платёж отменится.

После оплаты или отказа от неё AvantPay откроет у покупателя return_url — ровно тот адрес, что вы передали, без параметров. Поэтому указывайте в return_url адрес страницы заказа, например https://example.com/orders/1. На этой странице возьмите id платежа из заказа и запросите платёж (шаг 4). Возврат на return_url не означает, что платёж оплачен.

Шаг 4. Узнайте результат​

Используйте оба способа: уведомления и запрос платежа.

Уведомления​

Когда платёж оплатят или отменят, AvantPay отправит на адрес из шага 1 POST-запрос с JSON. Здесь покупатель оплатил картой:

{
"type": "notification",
"event": "payment.succeeded",
"object": {
"id": "2f9b6c1e-4d7a-4c3b-9e8f-1a2b3c4d5e6f",
"status": "succeeded",
"paid": true,
"amount": {
"value": "100.00",
"currency": "RUB"
},
"income_amount": {
"value": "97.50",
"currency": "RUB"
},
"description": "Заказ №1",
"recipient": {
"account_id": "33661",
"gateway_id": "6b1f3c0a-58e2-4f7d-9a41-0c2d7e5b8f93"
},
"payment_method": {
"type": "bank_card",
"id": "2f9b6c1e-4d7a-4c3b-9e8f-1a2b3c4d5e6f",
"saved": false,
"status": "inactive",
"title": "Банковская карта"
},
"captured_at": "2026-10-18T10:17:02.418Z",
"created_at": "2026-10-18T10:15:30.123Z",
"expires_at": "2026-10-18T10:35:30.123Z",
"confirmation": {
"type": "redirect",
"confirmation_url": "https://avantpay.io/link/Aq91c7d",
"return_url": "https://example.com/orders/1"
},
"test": false,
"refundable": false,
"metadata": {
"email": "[email protected]",
"order_id": "1"
}
}
}

Что сделать, когда пришло уведомление:

  1. Возьмите object.id.
  2. Запросите этот платёж через API (запрос ниже). Решение принимайте по ответу API, а не по телу уведомления. Ответ 404 — платежа нет у магазина: ответьте 200 и ничего не делайте.
  3. Если status равен succeeded и amount равен сумме заказа — отметьте заказ оплаченным атомарно (например, UPDATE … WHERE paid_payment_id IS NULL) и выполните его. Если заказ уже отмечен — ничего не делайте. Возврат покупателя на return_url приходит одновременно с уведомлением, поэтому без атомарности заказ выполнится дважды.
  4. Ответьте на уведомление кодом HTTP 200 не позже чем через 10 секунд. Если не ответить, AvantPay будет повторять уведомление.

Подробнее и готовые обработчики на Python, Node.js и PHP — на странице Уведомления.

Запрос платежа​

curl https://api.avantpay.io/v3/payments/2f9b6c1e-4d7a-4c3b-9e8f-1a2b3c4d5e6f \
-u "$AVANTPAY_SHOP_ID:$AVANTPAY_SECRET_KEY"

Ответ — объект платежа в текущем состоянии, такой же, как в object уведомления. Запрашивайте платёж:

  • когда пришло уведомление;
  • когда покупатель вернулся на return_url;
  • когда запрос на создание платежа закончился ошибкой 500 или без ответа;
  • раз в несколько минут для сверки: уведомление может не дойти (как сверяться).

Что делать по статусу​

statusЧто значитЧто делать
pendingПокупатель ещё не заплатил.Ждать. Заказ не выполнять.
succeededОплачен.Сверить amount с суммой заказа и выполнить заказ один раз.
canceledНе оплачен: истёк срок, банк отказал или сработала проверка.Заказ не выполнять. Чтобы покупатель заплатил снова, создать новый платёж с новым ключом идемпотентности.

Все подробности — на странице Статусы платежа.

Готово​

Интеграция работает, если:

  • платёж создаётся с email покупателя, а покупатель попадает на страницу оплаты;
  • после оплаты ваш сервер получает payment.succeeded, проверяет платёж запросом и выполняет заказ один раз;
  • после отмены ваш сервер получает payment.canceled и не выполняет заказ;
  • покупатель, вернувшийся на return_url, видит правильный результат.

Перед запуском пройдите чеклист.