← Все кейсы

CASE STUDY / 10

WORDPRESS × CRM

Регистрация и вход через внешнюю CRM

Задача

Посетитель регистрируется на сайте, но учётная запись создаётся во внешней CRM. Сайт должен собрать нужные данные, отправить их в правильном формате и показать понятный результат. Вход тоже проходит через CRM. При этом публичная форма доступна любому посетителю: обычная проверка полей в браузере не защищает от прямого запроса к API, автоматических регистраций и перебора SMS-кодов.

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

Роль и объём

Реализовал плагин с формами регистрации и входа, шаблонами и шорткодами для открытия форм. Связал REST-обработчики с CRM, предусмотрел настройки языка и содержимого формы, проверки регистрации, SMS-подтверждение номера и диагностику. Этот кейс посвящён именно самописным формам и одному маршруту регистрации в CRM.

Ограничения

  • Форма может находиться на странице, которую отдаёт кеш. Короткоживущие проверочные значения должны обновляться отдельно от HTML страницы.
  • Настройки CAPTCHA и SMS могут меняться. Сервер должен решать, какая проверка обязательна, а не принимать это решение из полей запроса.
  • Данные регистрации содержат пароль и телефон. До подтверждения кода их нельзя хранить открытым текстом в журнале или временной записи.
  • Ошибки SMS-провайдера и CRM нужно различать: отправленный код ещё не означает созданную учётную запись.

Архитектура

Страница WordPress
     ├── Шорткод кнопки регистрации / входа
     └── Самописные формы и клиентский сценарий
          │
          ▼
REST WordPress
     ├── Вход → запрос к CRM
     └── Регистрация
          ├── nonce и подписанный токен формы
          ├── лимит запросов и проверка пароля
          ├── CAPTCHA по настройке сайта
          └── SMS по настройке сайта
               ├── хеш кода, шифрование данных, срок действия
               ├── лимиты отправки и проверки, повторная отправка
               └── журнал событий
                    │
                    ▼
               Подтверждение кода
                    │
                    ▼
               Адаптер регистрации → API CRM

Обработчик прямой регистрации и обработчик подтверждения номера приводят данные к одному вызову регистрации в CRM. Поэтому бизнес-правила формирования заявки не расходятся между сценариями с SMS и без него.

Реализация

Формы выводятся плагином в общий слой страницы; кнопки их открытия доступны через шорткоды. Перед регистрацией сервер проверяет REST nonce, подпись и срок действия токена формы, ограничивает частоту запросов, проверяет пароль и, если включена CAPTCHA, подтверждает её на стороне сервера. Токен кодирует обязательные проверки по текущим настройкам сайта. Когда SMS включено, прямой вызов регистрации блокируется: клиент должен пройти маршрут запроса и проверки кода.

Для SMS-сценария номер нормализуется, код сохраняется в виде хеша, а данные формы — в зашифрованном виде во временной записи. Запись связана с IP и хешем токена формы. Действуют срок жизни кода, задержка перед повторной отправкой и лимиты по отправке и ошибочным попыткам. После успешной проверки временная запись удаляется, данные расшифровываются и передаются адаптеру CRM. Секреты интеграции задаются в конфигурации сайта.

Регистрация и вход обращаются к CRM разными обработчиками. При регистрации адаптер собирает тело запроса с языком, согласием и доступными данными о переходе, разбирает ответ провайдера и возвращает результат форме. События после регистрации и входа вынесены в хуки, чтобы сопутствующие действия можно было подключать отдельно от основного запроса.

Сбои и диагностика

SMS-модуль пишет события отправки, повторной отправки, успешной и неуспешной проверки, блокировок. В журнале номер маскируется, номер и IP представлены хешами; сам код и исходные данные формы туда не передаются. Ошибки ответа CRM фиксируются отдельно с идентификатором запроса провайдера, когда он есть. По этим записям можно понять, где прервался путь пользователя: на защите формы, доставке SMS, проверке кода или запросе регистрации.

Если SMS не отправлено, временная сессия удаляется и регистрация не продолжается. Если CRM отказывает уже после успешной проверки кода, форма получает ошибку регистрации. Код к этому моменту израсходован, поэтому повторная попытка начинается с нового подтверждения номера.

границы решения

Временные записи и счётчики попыток построены на WordPress transients. Это практичное ограничение частоты, но операции чтения и изменения записи не образуют атомарную транзакцию: строгую гарантию однократного выполнения при параллельных запросах этот механизм не даёт. Для неё потребовалась бы атомарная блокировка или идемпотентность на стороне CRM.

Журналы ошибок интеграции записываются в файлы внутри каталога плагина. Для рабочего сайта их доступность через веб-сервер нужно закрывать и ограничивать срок хранения. Журнал SMS отделён от этих файлов и очищает чувствительные поля, но это не заменяет общую политику хранения логов.

Результат

Получился управляемый сценарий регистрации и входа через CRM: формы можно размещать на сайте без дублирования логики, а обязательные проверки выполняются на сервере. Ошибки разделены по этапам и доступны для диагностики.

Стек

PHP · WordPress · REST API · JavaScript · CRM API · SMS API · reCAPTCHA · MySQL

Есть похожая задача?

Расскажите о текущей системе и нужных изменениях — обсудим следующий шаг.

Следующий кейс: Настраиваемые формы регистрации для нескольких направлений