Как настроить интеграцию 1С с WhatsApp и почему возникают ошибки при использовании неофициальных библиотек

Программист IT и автоматизация бизнеса
← На главную

При попытке связать учетную систему 1С с мессенджером WhatsApp разработчики часто сталкиваются с решением автоматической отправки сообщений клиентам и приема их ответов. Однако попытка применить сторонние бесплатные библиотеки (например, скрипты на PHP из открытых репозиториев) приводит к ошибкам вида bad token или требованию ввода пароля авторизации, которого нет в стандартном приложении.

В этом материале мы проанализируем причины неполадок неофициальных решений и разберем правильный архитектурный подход к реализации бота на платформе 1С с помощью REST API.

Выясним причины сбоев неофициальных библиотек

Рассмотрим подробнее, почему возникают сбои при использовании библиотек эмуляции мобильного клиента:

  1. Изменение протоколов шифрования и авторизации: Сторонние библиотеки используют старые токены и ключи авторизации предыдущих версий приложения WhatsApp. Поскольку мессенджер регулярно обновляет протоколы защиты, запросы с устаревшей подписью отклоняются сервером с сообщением bad token.
  2. Отсутствие традиционного пароля: Приложение WhatsApp использует привязку устройства по номеру телефона и динамическим ключам, а не через постоянный пароль пользователя. Попытки залогиниться по паролю из консольных утилит не работают на актуальных версиях сервиса.
  3. Риск блокировки номера: Серверные алгоритмы выявляют автоматизированную рассылку, выполняемую не с официальных клиентов или эмуляторов. При превышении лимитов отправки номер телефона может быть окончательно заблокирован.

Разберем архитектуру отправки исходящих сообщений из 1С

Для создания надежного обмена сообщениями применяется официальный механизм API. Процесс взаимодействия строится на обмене REST-запросами в формате JSON.

Для отправки исходящего сообщения из платформы 1С выполним следующие шаги:

  1. Сформируем структурированный JSON-пакет с помощью объекта ЗаписатьJSON.
  2. Настроим защищенное соединение через HTTPСоединение по протоколу HTTPS.
  3. Передадим маркер доступа (Bearer Token) в заголовке Authorization объекта HTTPЗапрос.

Посмотрим на пример кода отправки текстового сообщения из 1С:


Сервер = "api.whatsapp.com";
Ресурс = "/v17.0/YOUR_PHONE_NUMBER_ID/messages";

Токен = "Ваш_Токен_Доступа";

Заголовки = Новый Соответствие;
Заголовки.Вставить("Authorization", "Bearer " + Токен);
Заголовки.Вставить("Content-Type", "application/json");

ДанныеСообщения = Новый Структура;
ДанныеСообщения.Вставить("messaging_product", "whatsapp");
ДанныеСообщения.Вставить("to", "79991112233");
ДанныеСообщения.Вставить("type", "text");

ТекстОбъекта = Новый Структура("body", "Здравствуйте! Ваша заявка обработана.");
ДанныеСообщения.Вставить("text", ТекстОбъекта);

ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ДанныеСообщения);
СтрокаJSON = ЗаписьJSON.Закрыть();

Соединение = Новый HTTPСоединение(Сервер, 443, , , , 30, Новый ЗащищенноеСоединениеOpenSSL);
Запрос = Новый HTTPЗапрос(Ресурс, Заголовки);
Запрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8);

Ответ = Соединение.ОтправитьДляОбработки(Запрос);
КодСостояния = Ответ.КодСостояния;

Настроим прием входящих сообщений через HTTP-сервис 1С (Webhook)

Чтобы бот мог принимать ответные сообщения от клиентов, базу 1С необходимо опубликовать на веб-сервере (IIS или Apache) с валидным SSL-сертификатом и создать объект HTTP-сервис.

При первичной настройке сервис WhatsApp отправляет контрольный GET-запрос верификации Webhook. Наша база должна проверить токен верификации и вернуть значение параметра challenge.

Рассмотрим пример обработки GET-запроса верификации в методе HTTP-сервиса:


Функция ОбработатьПроверкуWebhook(Запрос)
    
    ПараметрыЗапроса = Запрос.ПараметрыЗапроса;
    
    Режим = ПараметрыЗапроса.Получить("hub.mode");
    Токен = ПараметрыЗапроса.Получить("hub.verify_token");
    Вызов = ПараметрыЗапроса.Получить("hub.challenge");
    
    // Проверяем совпадение заданного вами токена верификации
    Если Режим = "subscribe" И Токен = "МойСекретныйТокен1С" Тогда
        Ответ = Новый HTTPСервисОтвет(200);
        Ответ.УстановитьТелоИзСтроки(Вызов);
        Возврат Ответ;
    Иначе
        Возврат Новый HTTPСервисОтвет(403);
    КонецЕсли;
    
КонецФункции

После верификации все входящие сообщения от пользователей будут поступать в виде POST-запросов. Для обработки входящего сообщения разберем полученное тело запроса функцией ПрочитатьJSON:


Функция ОбработатьВходящееСообщение(Запрос)
    
    СтрокаJSON = Запрос.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
    
    ЧтениеJSON = Новый ЧтениеJSON;
    ЧтениеJSON.УстановитьСтроку(СтрокаJSON);
    ДанныеЗапроса = ПрочитатьJSON(ЧтениеJSON);
    ЧтениеJSON.Закрыть();
    
    // Оперативно возвращаем статус 200 OK, чтобы сервис не повторял запрос
    Ответ = Новый HTTPСервисОтвет(200);
    
    // Передаем полученный JSON на асинхронную обработку
    ФоновыеЗадания.Выполнить("МойОбщийМодуль.РазобратьВходящееСообщениеФоново", Новый МассивДанных(СтрокаJSON));
    
    Возврат Ответ;
    
КонецФункции

Проанализируем архитектурные ограничения и правила работы

Для корректной и бесперебойной работы бота учтем следующие особенности платформы и мессенджера:

  1. Использование фоновых заданий: Обработка входящих HTTP-запросов в 1С происходит синхронно. Чтобы веб-сервер не выдавал таймаут при большом потоке сообщений, необходимо мгновенно возвращать статус 200 OK, а сам разбор данных и бизнес-логику бота передавать в ФоновыеЗадания.
  2. Правило 24-часового окна: Отправлять любые произвольные сообщения клиенту можно только в течение 24 часов с момента последнего входящего сообщения от этого клиента.
  3. Шаблоны HSM: Если требуется инициировать диалог первым или отправить уведомление по истечении 24 часов, необходимо использовать предварительно согласованные шаблоны сообщений (HSM).
  4. Разделение номера: Номер телефона, подключаемый к API, нельзя использовать одновременно в мобильном приложении на смартфоне. Перед интеграцией его следует отвязать от стандартного клиента.
← На главную