Контракт отображения ошибок онлайн-заявки

Назначение

Интерфейс формы не показывает клиенту сырой error_code, SQLSTATE, текст исключения или внутренние сведения Supabase. Серверный allowlist-код переводится в понятное действие, а безопасный request_id используется как технический номер для обращения в поддержку.

Контур подготовлен для будущего Supabase endpoint. Пока рабочий режим остаётся web3forms, а endpoint пуст.

Источник данных

Модуль внутри assets/js/application-inputs.js выполняется до assets/js/online-application.js и наблюдает только JSON-ответы со структурой:

{
  "ok": false,
  "success": false,
  "error_code": "validation_failed",
  "request_id": "UUID или IP-идентификатор"
}

Ответы Web3Forms без error_code не изменяются.

Категории интерфейса

Публичные коды объединяются в пять стабильных категорий:

Сетевая ошибка без JSON получает отдельную локальную категорию network.

Клиенту не показывается исходный error_code. Атрибут data-error-category содержит только одну из безопасных категорий.

Технический номер

Для интерфейса принимаются только:

При ответе сервера используется его correlation request_id. При таймауте или сетевой ошибке используется request ID, уже созданный формой.

Технический номер:

Сообщение клиенту

Ошибка должна содержать:

  1. понятное описание следующего действия;
  2. технический номер, если он валиден;
  3. напоминание, что готовый текст не потерян;
  4. резервные способы: SMS, MAX, ВКонтакте или ручное копирование.

Для rate_limit_exceeded разрешено показать приблизительное число минут из retry_after_seconds. Значение принимается только в диапазоне от 1 секунды до 24 часов.

Hybrid

Если Web3Forms успешно принял заявку, а будущий Supabase endpoint вернул ошибку, общий Promise.allSettled сохраняет успешный результат. Клиент переходит на /spasibo/, потому что хотя бы один рабочий канал принял заявку.

Ошибка дополнительного endpoint в этом случае может попасть в аналитику, но не должна заменять успешное сообщение клиенту.

Аналитика

Используются только фиксированные цели без request ID и персональных данных:

Сырой error_code, телефон, город, сценарий и технический номер в Метрику не передаются.

Запрещённое поведение

Нельзя:

ЗаявкаПозвонитьВК