Qut Pay Сайт Кабинет База знаний Инструкции Документация API ҚАЗРУС
ГлавнаяБаза знаний → Решение проблем

Счета дублируются

Обновлено: 2026-09-14 · Версия в Markdown

Коротко

Первым делом остановите поток: удалите API-ключ в кабинете. С момента удаления все запросы с этим ключом получают 401, то есть новые счета не создаются — и пока вы правите код, покупатели не увидят лишних счетов. Причину ищите уже после остановки: обычно это отсутствие идемпотентности, цикл повторов или неправильная обработка вебхуков. Надёжное решение — передавать заголовок Idempotency-Key в каждом запросе на создание счёта.

Экстренная остановка

  1. Заходите в кабинет, открываете раздел API-ключей
  2. Удаляете ключ, которым выставляются счета
  3. Правите код
  4. Создаёте новый ключ и меняете его на сервере

Удаление ключа — самый быстрый «рубильник». Ни передеплой, ни остановка сервера для этого не нужны.

Что не меняется: ранее созданные счета остаются на месте, настройки вебхуков сохраняются, привязка Kaspi не рвётся. Недействительным становится только сам ключ.

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

Уборка лишних счетов

После остановки потока:

Не торопитесь: счёт в статусе pending ещё может быть оплачен, поэтому уборку начинайте только после остановки потока.

Поиск причины

ПризнакВероятная причина
Ровно два счёта на заказПокупатель дважды нажал «Оплатить» или форма ушла дважды
Десятки счетов на один заказЦикл в коде: повтор при ошибке без условия выхода
Счета выходят с ровным интерваломЗадача по расписанию создаёт новый счёт на каждом проходе
Счёт появляется на каждый вебхукОбработчик вебхука сам создаёт счёт, а вебхук повторяется 11 раз
Пришла ошибка tariff_daily_burstСработала суточная защита — она и сделана для отлова таких циклов

tariff_daily_burst — это не бизнес-лимит, а предохранитель от зациклившейся интеграции. Если он сработал, не спешите повышать тариф: сначала проверьте код. Месячный лимит приходит с другим кодом — tariff_limit_reached.

Как работает Idempotency-Key

Вы добавляете к запросу на создание счёта заголовок Idempotency-Key. При повторной отправке с тем же ключом новый счёт не создаётся: возвращается прежний, с HTTP 200 и признаком idempotentReplay: true в ответе.

POST /api/v1/invoices
X-API-Key: qp_live_…
Idempotency-Key: order-10482
Content-Type: application/json

{ "amount": 12500, "externalOrderId": "10482" }

Как выбирать ключ:

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

Как правильно писать повторы

Чтобы повтор запроса на создание счёта был безопасным:

Идемпотентность в обработке вебхуков

Если вы отвечаете не 2xx, мы повторяем доставку 11 раз. Поэтому одно событие приходит несколько раз — это нормально. Если ваш обработчик на каждое пришедшее уведомление создаёт новый счёт или заново проводит заказ, дубли берутся именно отсюда.

Берите пару (invoice.id, status) как ключ и не обрабатывайте повторно то, что уже обработали. Если обработка долгая, сначала ответьте 200, а работу делайте в фоне — иначе мы засчитаем таймаут и отправим снова.

Профилактика

Вопросы и ответы

Если удалить ключ, пропадут ли старые счета? Нет. Счета, их статусы и история сохраняются. Недействительным становится только ключ.

Сколько живёт Idempotency-Key? Не рассчитывайте переиспользовать один ключ сколь угодно долго: он защищает от повторов в ближайшее время. Если берёте за ключ номер заказа, на практике этого достаточно.

Считаются ли счета из песочницы в лимит? Нет, счета песочницы в месячный лимит не идут.

Покупатель оплатил оба счёта, что теперь? Вернуть лишнюю сумму. Частичный возврат тоже поддерживается.

Достаточно ли externalOrderId для защиты от дублей? Нет, это поле для поиска и учёта. От повторов защищает заголовок Idempotency-Key.

Связанные статьи

Возврат не проходитРазбор ошибок возврата по коду: счёт не подлежит возврату, неверная сумма, Kaspi не выполнил операцию или результат неизвестен. Где можно повторять запрос, а где категорически нельзя.Счёт завис в статусе pendingPending — не ошибка, а нормальное состояние: счёт выставлен, покупатель ещё не подтвердил. Сколько он живёт, когда станет expired, как мы его проверяем и когда действительно стоит волноваться.Вебхук не приходит — как найти причинуСчёт оплачен, а на ваш сервер уведомление не пришло. С чего начать диагностику, какая причина встречается чаще всего и как проверить её одним запросом.Оплата не приходит покупателюСчёт создан, но на телефон покупателя ничего не пришло или QR не открывается. Чаще всего причина в том, что остался включённым тестовый режим. Шесть шагов проверки.

Остались вопросы? WhatsApp +77788813333 · kazprose@gmail.com
Написать можно и из кабинета: Поддержка.

Qut Pay — независимый сервис, не аффилирован с АО «Kaspi Bank». Kaspi и Kaspi Pay — товарные знаки их правообладателя.