Прерванный запрос не отменяет операцию
AbortSignal, таймаут HTTP-клиента и закрытие вкладки прекращают ожидание ответа. Сервер мог уже принять покупку. Никогда не показывайте «покупка не состоялась» только потому, что сработал локальный таймер.
Настройка HTTP-клиента
Примеры используют общий таймаут 150 секунд, чтобы дать длительной покупке возможность завершиться. Это настройка примера, а не обещание времени ответа. Согласуйте таймаут клиента, вашего backend и прокси: самый короткий обрывает ожидание первым.
Запрещайте неожиданные редиректы, чтобы не пересылать секрет другому хосту. Обрабатывайте ошибки DNS, TLS и разрывы соединения отдельно от валидного HTTP-ответа.
Состояние «требует проверки»
- Сохраните исходные ключ операции и тело; не меняйте их после таймаута.
- Поставьте операцию в очередь сверки. Повторяйте с ограниченной частотой и числом попыток.
- Если восстановить результат не удалось, передайте оператору контекст без API-ключа и SMS.
- Не создавайте новую покупку автоматически вместо неопределённой.
Дедлайн ожидания SMS
Дедлайн вашего приложения — бизнес-решение, не новый статус API. Если он истёк, перечитайте заказ и при необходимости запросите отмену по cancelAfter. Не подменяйте waiting на cancelled без подтверждения сервера.