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

Запрос к SMM API завершился по тайм-ауту. Отправлять заказ снова?

Восстановите заказ с тем же request_id. Разберитесь в 60-секундной защите NotPanel от дублей, конфликтах ключей и поиске через order_details.

Карточка заказа со стрелкой повторной попытки и защитным щитом.

Sameer

Researcher

Повторите заказ с исходным request_id и неизменными параметрами. Не создавайте новый ключ только из-за тайм-аута. В NotPanel повтор возвращает исходный заказ с replayed: true или создаёт его, если первая попытка так и не дошла.

Клиент совершил одну покупку. Если после отправки в панель ответ потерялся, следующий шаг должен восстановить эту покупку, а не превратить неизвестный результат в новую.

После тайм-аута возможны три ситуации

  • Запрос не дошёл, заказ не был принят.
  • Заказ принят, но ответ потерялся.
  • Запрос дошёл в момент обрыва соединения; повтор с тем же request_id покажет, какой из двух случаев выше произошёл.

Тайм-аут не различает эти случаи. HTTP сам по себе не делает повтор POST с покупкой безопасным: защиту задаёт контракт API. См. RFC 9110, §9.2.2.

Как NotPanel распознаёт повтор

request_id необязателен, не может быть пустым и допускает до 128 символов. idempotency_key — совместимый псевдоним; при наличии обоих используется request_id. Сохраняйте аккаунт, ключ и все параметры заказа. Принятый заказ возвращает исходный ID; тот же ключ с другими параметрами отклоняется.

Без обоих полей NotPanel защищает одинаковые add одного аккаунта в течение 60 секунд: повтор в этот срок возвращает первый заказ, а не создаёт второй. Не рассчитывайте на этот короткий интервал при позднем повторе.

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

Параметры и ответы создания заказа

  1. После тайм-аута сохраните исходный request_id.

  2. Повторите запрос с тем же ключом и неизменными данными заказа.

  3. Сохраните ID исходного заказа, который вернул повтор.

Иллюстративная схема. Повтор возвращает принятый заказ и его исходное списание.

Сохраните идентификатор покупки до отправки

Для строки покупки 8427 сохраните request_id и полные параметры до первой попытки. В схеме используются заполнители и переносы строк; реальную форму кодируйте обычным способом. Отправляйте реальные значения только для нужного вам платного заказа.

POST https://notpanel.com/api/v3
Content-Type: application/x-www-form-urlencoded

key=YOUR_API_KEY
&action=add
&service=YOUR_SERVICE_ID
&link=YOUR_TARGET_URL
&quantity=YOUR_VALID_QUANTITY
&request_id=checkout-8427-line-1

После тайм-аута повторите checkout-8427-line-1 с теми же услугой, целью, количеством и дополнительными полями, даже после перезапуска. Сохраните полученный ID заказа и используйте его в status. request_id определяет запрос создания и не заменяет ID заказа при проверке статуса. Чтобы найти заказ по request_id, используйте order_details.

Читайте весь ответ

Тайм-аут или неопределённый ответ
Сохраните ключ и параметры. Ограничьте число повторов, делайте паузы и учитывайте Retry-After. После исчерпания попыток оставьте запись нерешённой.
INTERNAL_ERROR, API_DISABLED или ORDER_PLACEMENT_PAUSED (retryable: true)
Подождите (учитывайте Retry-After, если он есть) и отправьте тот же add с тем же request_id. Вы получите исходный заказ или ровно один новый. Не создавайте замену с другим ключом.
REQUEST_ID_CONFLICT
Сравните сохранённые параметры. Для восстановления верните исходные значения; новый ключ нужен только для намеренно отдельной покупки.
Ошибка проверки, авторизации или лимита
Читайте error_code и retryable. Исправьте данные или ключ доступа и соблюдайте время ожидания. Не повторяйте любую ошибку автоматически.

Проверьте восстановление до клиентских покупок

Начните с имитации API в своей тестовой среде. Реальная покупка и специальный тестовый ключ NotPanel не нужны.

  1. Сымитируйте принятый заказ и потерянный ответ; повтор должен сохранить ключ и параметры.
  2. Перезапустите клиент и восстановите сохранённый идентификатор.
  3. Верните сначала 500 или 503 с возможностью повтора, затем повтор с replayed: true; должен сохраниться один ID заказа.
  4. Верните конфликт или ошибку без повтора; автоматические попытки должны остановиться.
  5. Создайте две новые одинаковые покупки с разными ключами. Для последующего реального теста используйте нужный заказ и проверьте заказ и операции кошелька.

Частые вопросы

Означает ли тайм-аут двойное списание?

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

Обязателен ли request_id?

Нет. request_id и idempotency_key необязательны. Без них одинаковые add одного аккаунта защищены на 60 секунд. Явный ключ определяет каждую отдельную покупку.

Нужен ли новый ключ для каждой попытки?

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

Можно ли найти заказ по request_id?

Да, через order_details: отправьте action=order_details с тем же request_id и получите заказ и его номер без повтора add. Если заказ не создавался, придёт ORDER_NOT_FOUND. Действие status по-прежнему принимает номер заказа.

Далее: руководство по интеграции · вебхуки и опрос статуса · справочник ошибок.

Поделиться статьёй