При попытке связать учетную систему 1С с мессенджером WhatsApp разработчики часто сталкиваются с решением автоматической отправки сообщений клиентам и приема их ответов. Однако попытка применить сторонние бесплатные библиотеки (например, скрипты на PHP из открытых репозиториев) приводит к ошибкам вида bad token или требованию ввода пароля авторизации, которого нет в стандартном приложении.
В этом материале мы проанализируем причины неполадок неофициальных решений и разберем правильный архитектурный подход к реализации бота на платформе 1С с помощью REST API.
Рассмотрим подробнее, почему возникают сбои при использовании библиотек эмуляции мобильного клиента:
Для создания надежного обмена сообщениями применяется официальный механизм API. Процесс взаимодействия строится на обмене REST-запросами в формате JSON.
Для отправки исходящего сообщения из платформы 1С выполним следующие шаги:
ЗаписатьJSON.HTTPСоединение по протоколу HTTPS.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);
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
КодСостояния = Ответ.КодСостояния;
Чтобы бот мог принимать ответные сообщения от клиентов, базу 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));
Возврат Ответ;
КонецФункции
Для корректной и бесперебойной работы бота учтем следующие особенности платформы и мессенджера:
ФоновыеЗадания.