Жизненный цикл заказа
| status | Значение | Следующий шаг |
|---|---|---|
| waiting | Ожидание SMS | Опрос с интервалом ≥ 5 секунд |
| completed | Заказ завершён | Сохранить code, остановить опрос |
| cancelled | Заказ отменён | Остановить опрос |
| error | Заказ в ошибке | Остановить опрос, проверить детали |
Планировщик, а не бесконечный цикл
- Один активный запрос на заказ. Планируйте следующий только после завершения предыдущего.
- Храните order.id и nextPollAt в своей базе, чтобы переживать перезапуски.
- Используйте общий ограничитель аккаунта: несколько процессов не получают независимые лимиты.
- Добавляйте небольшой случайный разброс задержки и увеличивайте паузу при 429 или временной ошибке.
- Задайте бизнес-дедлайн и ручную проверку. Прекращение опроса не отменяет заказ.
Алгоритм одного шага
Бот получает SMS в фоне; REST API читает общую базу. Уменьшение интервала ниже 5 секунд не ускоряет доставку кода.
Pseudocode · server worker
order = GET /orders/{savedOrderId}
if order.status in [completed, cancelled, error]:
persist(order)
stop_polling()
else:
schedule_next_poll(after >= 5 seconds)
on HTTP 429:
schedule_after(Retry-After + jitter)
on timeout or HTTP 5xx:
retry_read_with_bounded_backoff()Не преобразуйте код в число
code имеет тип string | null. Проверяйте null явно и сохраняйте строку без parseInt. Даты переводите из миллисекунд: JavaScript new Date(createdAt), Python datetime.fromtimestamp(createdAt / 1000, tz=timezone.utc).
Не нашли ответ на свой вопрос?Помощь с интеграцией