← На главную

Captcha v2 для встраивания на сайт

Captcha v2 для встраивания на сайт
================================

Цель: невидимая каптча при первом прохождении, при необходимости — проверка
в модальном окне, без вставки лишних блоков в разметку формы.

Онлайн: этот текст доступен на публичной странице сервиса по пути
`/docs/v2-flow` (или откройте раздел «Обзор» по `/docs`).

Привязка к сайту
----------------
В личном кабинете задаётся домен. Запросы из браузера к API капчи должны
идти с Origin/Referer, чей хост совпадает с доменом или является поддоменом.

Быстрый старт (HTML)
--------------------
1. URL точки входа API — файл `api.php` капчи. Публичный лоадер доступен
   по адресу `/assets/captcha-v2.js`.

2. Подключите скрипт **после** разметки формы (или с атрибутом `defer`),
   чтобы в момент выполнения скрипта форма уже была в DOM:

   <script defer
     src="https://s.go-up.info/assets/captcha-v2.js">
   </script>

3. На `<form>` обязательно:

   - `data-site-key="ck_pub_…"` — публичный ключ из ЛК;
   - `data-captcha-guard="v2"` — без этого скрипт форму не привязывает.

   Опционально: `data-field-message="message"` — имя поля с текстом письма
   (по умолчанию ищутся имена: message, body, text, comment).

   Пример полей, которые читает загрузчик: `name` / `fio` / `fullname`,
   `phone` / `tel` / `telephone`, текст — по `data-field-message` или
   перечисленные выше имена.

4. При успешной проверке скрипт сам отправит форму с одним из скрытых
   полей:
   - `captcha_invisible_pass` — невидимая отправка;
   - `captcha_attestation` — после решения модалки step-up (challenge).

Сервер сайта
------------
- Принять POST формы.
- **Проще всего (PHP):** один запрос `POST https://s.go-up.info/api.php/v2/verify-submission`
  с заголовком `Authorization: Bearer cs_sec_…` и JSON-телом:
  `invisible_pass`, `attestation`, `captcha_service_unavailable`, `user_ip` (IP посетителя),
  `verify_fail_open` (bool), опционально дублируйте секрет полем `secret` (тот же `cs_sec_…`) —
  на части PHP/хостингов исходящий `file_get_contents` не передаёт `Authorization`. Ответ: `valid: true/false`.
  См. `examples/server_verify.php`.
- Если есть `captcha_invisible_pass` — вызвать
  `POST …/api.php/v2/verify-invisible` с секретом сайта
  (`Authorization: Bearer cs_sec_…`) и телом JSON:
  `{ "invisible_pass": "<значение из формы>", "user_ip": "<IP клиента>" }`.
  IP — тот же, что видит ваш веб-сервер для этого запроса (за прокси —
  первый адрес из `X-Forwarded-For` или эквивалент).
- Если пришёл `captcha_attestation` (после step-up) — проверить подпись на сервере:
  `POST …/api.php/v1/verify` с секретом и телом `{"attestation":"…"}`
  (см. примеры в `examples/server_verify.*`).
- Если пришло только `captcha_service_unavailable=1` (без токенов) — сервис
  капчи был недоступен в браузере; при необходимости примите заявку при
  `CAPTCHA_VERIFY_FAIL_OPEN=1` или отложите в модерацию.

Примеры PHP и Python — в `examples/server_verify.php` и
`examples/server_verify.py`. MODX — `modx/INSTALL.txt` и сниппет
`snippet.CaptchaVerify.php` (один POST на `/v2/verify-submission`).

Клиент (кратко)
---------------
Скрипт `captcha-v2.js` создаёт сессию в cookie, перед отправкой запрашивает
политику и вызывает `/v2/decide`; при необходимости показывает модалку
с короткой задачей и подставляет скрытые поля. Повторные отправки с одной
сессии браузера могут потребовать прохождения модалки; при отказе сервис
возвращает понятное сообщение пользователю — обрабатывайте ответ формы
на своём бэкенде как обычно.

Если в тексте сообщения есть ссылка, step-up запрашивается сразу уже на
первой попытке. Это не означает авто-блок IP: ссылка только усиливает
проверку конкретной отправки.
Если в тексте сообщения есть ссылка, step-up может появиться уже на первой
попытке отправки — это штатная эвристика и она не заносит IP в blacklist сама по себе.

Политика fail-open на **вашем** сайте
--------------------------------------
- В примерах `examples/server_verify.php` и `server_verify.py` в начале файла
  задаётся `$CAPTCHA_VERIFY_FAIL_OPEN` / `CAPTCHA_VERIFY_FAIL_OPEN` (`0` или `1`):
  при сетевой ошибке verify или при `captcha_service_unavailable=1` без токенов
  считать проверку пройденной. В своём коде можно вынести то же значение в
  конфиг или переменные окружения. Согласуйте с разделом «Правила» в ЛК.