Как интегрировать Drupal с Salesforce и не переносить секретные данные
О клиенте
Клиент производит и монтирует фасадные материалы: сайдинг, фасадные панели и плитку, черепицу, водостоки. На сайте, разработанном на Drupal, пользователи смотрят ассортимент, запрашивают оценку работы, заказывают обслуживание ранее установленных материалов или делятся возникшей проблемой. Функциональности для платежей на сайте нет — специфика товаров требует индивидуального подхода и заранее снятых мерок. Но вместо этого здесь есть очень много форм.
Проблема и задача
Данные собираются через форму, передаются в админ-панель Drupal, а оттуда — в систему управления клиентами Salesforce для дальнейшей обработки. У Drupal есть интеграция с Salesforce через набор модулей Salesforce Suite. С её помощью можно авторизоваться в сервисе и использовать API для работы с Salesforce. API поддерживает как отправку данных из Drupal в Salesforce, так и импорт данных Salesforce в Drupal. Однако опция импорта нам была не нужна — клиент не планировал хранить данные Salesforce на стороне сайта, ему нужна только отправка данных с определённых полей для определённых веб-форм.
У Drupal на этом проекте две роли:
- загружать в себя данные через контактные формы;
- отправлять данные в Salesforce повторно или вручную, если автоматическую отправку данных прервала ошибка. Вводить эти данные снова пользователю не нужно.
Интеграция Drupal c Salesforce
У Drupal и Salesforce разные поля для хранения данных, и нужно было сделать так, чтобы они соответствовали друг другу, то есть настроить маппинг. В модуле Salesforce есть встроенный стандартный маппинг, но он был не нужен.
Интеграция с Salesforce — это легаси-код, который работал ещё в сайте на Drupal 7. Соответственно, проблема была в том, что работа форм была захардкожена — код находился в Git-репозитории, и клиент с ним никак не мог взаимодействовать. Маппинг для веб-форм тоже был захардкожен. В результате внутри тянулись бесконечные портянки кода, где прописаны соответствия полей в десятках разных форм, и в случае каждой проблемы нужно было лезть в код.
В итоге наши задачи свелись к тому, чтобы:
- создать функциональность в админ-панели Drupal для маппинга полей в веб-формах Drupal и в Salesforce,
- настроить возможность переотправки данных в Salesforce в случае ошибки.
Решение
Маппинг полей
Поскольку мы ничего не берём с Salesforce, у нас есть настройка в кастомном webform handler — обработчике, который запускается сразу после отправки заполненной формы, чтобы сформировать массив полей из Drupal и отправить их в Salesforce. Список полей, которые планируем использовать, мы перечисляем в самом хэндлере.
Рассмотрим это на конкретной форме.
Тут нужно указать номер заказа, заполнить данные о проблеме и о себе, оставить контактную информацию и нажать на кнопку Request Service. После нажатия все эти поля сохраняются на сайте, а Drupal сопоставляет свои поля с полями в Salesforce через маппинг и отправляет в CRM данные. Если при отправке произошла ошибка, она трекается и отправляется на почту техническому специалисту клиента.
Настройка маппинга полей
- Во вкладке build админ-панели Drupal создаём и позже редактируем поля для форм.
- В настройках веб-формы settings > emails/handlers создаём наш кастомный хэндлер под названием salesforce mapping, которое запускает маппинг после отправки формы. В режиме редактирования хэндлера для маппинга есть общие параметры, не требующие маппинга, и специальные поля, которые его требуют. Редактор сайта выбирает из этих выпадающих меню поле формы, а напротив — поле из Salesforce. Список полей редактируется во вкладке build.
- Сохраняем.
Центральный участник этого процесса — PHP-класс webform handler. В нём прописываются поля, действия при отправке сабмита и логика отправки на Salesforce.
Повторная отправка данных на Salesforce
Все отправленные формы можно посмотреть на странице Results. Но среди них будут и те, из которых данные ушли на Salesforce, и те, из которых передача данных сорвалась из-за сбоя в работе интернета, устаревшего токена авторизации или другой ошибки. Клиент очень дорожит этими данными, ведь это и информация о клиентах, и жалобы на неисправности в продукции. Поэтому мы сделали страницу Salesforce failed submissions — здесь лежат заявки только с ошибками. Если был какой-то ответ от сервера, то ошибка сопровождается описанием.
Теперь клиент может выбрать какую-то определёную или несколько форм и отправить их заново.
Результаты работы
- не надо лезть в код — клиент сам может добавлять поля и настраивать маппинг из админки Drupal;
- из кода удалены сотни строк с маппингом и логикой;
- появилась возможность переотправить заявку заново.
Работа с клиентом продолжается.