Приветствую всех! Сегодня я хотел бы поделиться своим опытом оптимизации процесса оповещения клиентов о выполнении заказов из 1С. Ранее, я использовал SMSAero для отправки SMS-уведомлений, однако с увеличением количества заказов это стало дорогим решением. Кроме того, ограничение символов в одном сообщении неудобно. Решение, которое я выбрал, – использование Telegram Бота. Давайте расскажу, как это работает.
Преимущества Телеграм Бота
Оповещение через Telegram Бот оказалось выгодным решением. Я могу предоставлять клиентам более подробную информацию о выполненных заказах, а главное – это абсолютно бесплатно! Отправка уведомлений через Telegram API позволила существенно сэкономить на затратах, что является значимым фактором для моего бизнеса.
Использование существующего Telegram Бота
У меня уже был готовый бот для интернет-магазина, и я решил использовать его базу пользователей. Это позволило мне сэкономить время на создание нового списка пользователей для оповещений.
Приступаем к реализации проекта
Передо мною стоит задача интегрировать Telegram Бот в связке с сайтом на платформе docpart и 1С 8.3 Управление торговлей редакция 10.3 для оптимального оповещения клиентов о выполнении заказов. Хотя я не люблю кодить на 1С, это оказалось необходимо для эффективной реализации проекта.
Определение механизма работы
Для успешной интеграции двух различных систем, я решил использовать взаимодействие по API через GET запросы. Такой подход позволяет мне отправлять GET запрос из 1С на сайт, где он обрабатывается, а затем полученный ответ передается обратно в 1С.
Создание точки приема запросов на сайте
Для обработки запросов, я создал специальную папку "api" на сайте, в которой создал файл v1.php. Это дает мне точку работы сервиса API, которая доступна по адресу my-site.ru/api/v1.php. Вы можете выбирать любые имена для файлов и папок в соответствии с вашими предпочтениями.
Добавление библиотеки работы с API.telegram.org
Чтобы обеспечить взаимодействие с Telegram API, я добавил соответствующую библиотеку "telegram-bot/api" с помощью Composer. Если у вас еще нет Composer, просто следуйте следующим шагам для установки:
- Откройте командную строку или терминал и перейдите в корневую директорию вашего проекта.
- Перейдите на официальный сайт Composer (https://getcomposer.org/) и следуйте инструкциям для установки на вашу операционную систему.
Добавим библиотеку "telegram-bot/api": "^2.4"
Для установки необходимой библиотеки "telegram-bot/api" воспользуйтесь следующими шагами:
- Убедитесь, что у вас установлен Composer (если нет, выполните установку, как было описано ранее). Можно проверить наличие Composer командой в терминале composer -v
- В командной строке введите команду: composer require telegram-bot/api
Пропишем логику обработки поступающих данных в файл v1.php
Теперь давайте перейдем к обработке поступающих данных в нашем файле v1.php. Для работы с Telegram API нам необходимо подключить библиотеку и создать объект бота. Добавим следующий код в файл v1.php:
<?php
// Подключаем библиотеку telegram-bot/api
require_once($_SERVER["DOCUMENT_ROOT"]."/vendor/autoload.php");
use TelegramBot\Api\Client;
// Далее нам необходимо защитить запросы по API от посторонних запросов, придумываем токен
$expectedToken = "ваш токен";
// Получение токена из параметра GET
$token = $_GET['token'];
// Проверка токена
if ($token !== $expectedToken) {
echo json_encode('Ошибка, не верный Токен');
die(); // Прекратить выполнение скрипта, если токен неверный
}
// Здесь продолжается логика обработки поступающих данных и отправка уведомлений через Telegram API.
Процесс при удачной авторизации и подключение к базе данных MySQL
После успешной авторизации с помощью токена, следующим шагом я подключаюсь к базе данных MySQL, чтобы получить необходимые данные о клиентах из моего Telegram Бота. Продолжаем писать наш код, вот пример кода для подключения к базе данных:
// Ваши данные для подключения к базе данных
$hostname = 'ваш_хост';
$username = 'ваш_логин';
$password = 'ваш_пароль';
$database = 'ваша_база_данных';
// Подключение к базе данных
$db_Link = new mysqli($hostname, $username, $password, $database);
// Проверка подключения к базе данных
if ($db_Link->connect_errno) {
echo json_encode('Ошибка подключения к базе данных: ' . $db_Link->connect_error);
die();
}
// Здесь продолжается логика обработки поступающих данных и отправка уведомлений через Telegram API.
Создаем объект Бота
После подключения к базе данных, я создаю объект Бота с помощью созданного ранее токена Telegram Бота:
// Создаем объект Бота
$bot = new Client("токен вашего телеграм бота");
// Здесь продолжается логика обработки поступающих данных и отправка уведомлений через Telegram API.
Обработка запроса и отправка уведомлений
Далее, когда мы получаем запрос с данными из 1С (с помощью GET запроса, содержащего токен, номер телефона и сообщение), мы обрабатываем этот запрос в файле v1.php, должно получиться примерно так:
<?php
// Получаем данные из GET запроса
$token = $_GET['token'];
$numberPhone = $_GET['phone'];
$message = $_GET['message'];
// Обработка запроса по токену (как уже ранее реализовано)
// Получение чат ID клиента из базы данных
$sql = "SELECT chat_id FROM telegram_users WHERE phone = ?";
$stmt = $db_Link->prepare($sql);
$stmt->bind_param("s", $numberPhone);
$stmt->execute();
$result = $stmt->get_result();
// Получение результатов запроса
$rows = $result->fetch_all(MYSQLI_ASSOC);
// Подкорректирую входящее сообщение
$message .= "\n Добавляем свой текст";
$message .= "\n Добавляете еще какой-нибудь текст";
$message .= "\n Можно добавить ссылку, например, на WhatsApp <a href='https://wa.me/номер'>Напиши мне в WhatsApp</a>";
// Отправка сообщения через Telegram API
if (count($rows) > 0) {
foreach ($rows as $row) {
try {
$bot->sendMessage($row['chat_id'], $message, "html");
http_response_code(200); // Ответ на удачное выполнение
$jsonAnswer = json_encode(array('ok' => 'ok', 'message' => 'Message SEND! ALL OK!!' ));
echo $jsonAnswer;
} catch (Exception $e) {
http_response_code(500); // Ответ на неудачное выполнение
$jsonAnswer = json_encode(array('Error' => $e ));
echo $jsonAnswer;
}
}
} else {
http_response_code(205); // Если клиента нет в базе данных
$jsonAnswer = json_encode(array('Error' => 'NO CLIENT' ));
echo $jsonAnswer;
}
$stmt->close();
$db_Link->close();
Приступаем к 1С
Теперь, когда веб-сервер и Telegram Бот готовы к взаимодействию по API, перейдем к настройке самой 1С, как же я не люблю ней кодить... Итак, в заказ покупателя я хочу добавить кнопку "СМС".
Добавление кнопки "СМС" в форму Заказа Покупателя в 1С
В 1С Конфигураторе для начала открою документ "ЗаказПокупателя" и перейду в раздел "Формы" -> "ФормаДокумента". Здесь я добавлю новую кнопку и создам процедуру для обработки нажатия на эту кнопку в модуле.
Процедура будет выглядеть следующим образом:
Процедура КнопкаОтправитьСмсНажатие(Элемент)
// Ваш код обработки нажатия кнопки "СМС"
КонецПроцедуры
Далее я подключу процедуру в кнопке СМС, в настройках кнопки выбираем Событие -> Нажатие и выбираем нашу процедуру КнопкаОтправитьСмсНажатие.
Получение данных о заказе и номере телефона клиента
Когда пользователь нажимает на кнопку "СМС", процедура "КнопкаОтправитьСмсНажатие" будет выполняться. В этой процедуре я буду получать данные о заказе и номере телефона клиента, для этого пишем в процедуре:
КлиентЗаказа = ЭтотОбъект.Контрагент; // ФИО клиента
КодКлиента = ЭтотОбъект.Ссылка.Контрагент.Код; // Код клиента
НомерЗаказа = ЭтотОбъект.Номер; // Номер заказа
СуммаЗаказа = ЭтотОбъект.СуммаДокумента; // Сумма заказа
ДатаЗаказа = Формат(ЭтотОбъект.Дата, "ДЛФ=Д"); // Дата без времени
// Далее нам нужно найти номер телефона клиента
НомерКлиента = Справочники.Контрагенты.НайтиПоКоду(КодКлиента);
Запрос = Новый Запрос;
Запрос.Текст = "
ВЫБРАТЬ РАЗРЕШЕННЫЕ
КонтактнаяИнформация.Представление
ИЗ
РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
ГДЕ
КонтактнаяИнформация.Тип = &Тип
И КонтактнаяИнформация.Объект = &Объект
УПОРЯДОЧИТЬ ПО
КонтактнаяИнформация.ЗначениеПоУмолчанию УБЫВ
";
Запрос.УстановитьПараметр("Тип", Перечисления.ТипыКонтактнойИнформации.Телефон);
Запрос.УстановитьПараметр("Объект", Контрагент);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
СтрокаТелефонов = Выборка.Представление;
КонецЦикла;
ТелефонКлиента = СтрокаТелефонов;
Если ЗначениеЗаполнено(ТелефонКлиента) Тогда
// Приводим формат телефона к стандартному виду, без +, -, ), ( и пробелов
Телефон = СокрЛП(ТелефонКлиента);
Телефон = СтрЗаменить(Телефон, "+7", "8");
Телефон = СтрЗаменить(Телефон, "(", "");
Телефон = СтрЗаменить(Телефон, ")", "");
Телефон = СтрЗаменить(Телефон, "-", "");
Телефон = СтрЗаменить(Телефон, " ", "");
Телефон = СтрЗаменить(Телефон, Символы.НПП, "");
Если СтрДлина(Телефон) = 10 Тогда
Телефон = "7" + Телефон;
КонецЕсли;
КонецЕсли;
Подготовка данных и отправка запроса на веб-сервер
Теперь, когда у нас есть номер телефона клиента и данные о заказе, мы можем подготовить данные для отправки на наш веб-сервер:
ТекстСообщения = "Здравствуйте! Ваш заказ "
+ НомерЗаказа + " от " + ДатаЗаказа + " готов к выдаче! Общая стоимость заказа "
+ СуммаЗаказа + " рублей";
// Собственный токен для взаимодействия по API
Токен = "Токен, который мы используем для авторизации на сайте";
Защищенное соединение и отправка запроса на сервер
Для безопасной передачи данных на сервер я использую защищенное соединение с помощью библиотеки OpenSSL:
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(Новый СертификатКлиентаWindows, Новый СертификатыУдостоверяющихЦентровWindows);
// Создаем тело запроса
ТелоЗапроса = "/api/v1.php?token=" + Токен + "&phone=" + Телефон + "&message=" + ТекстСообщения;
// Отправляем запрос на наш веб-сервер, порт 443 означает, что мы передаем данные по защищенному протоколу HTTPS
Соединение = Новый HTTPСоединение("my-site.ru", 443, , , , , ЗащищенноеСоединение);
Запрос = Новый HTTPЗапрос(ТелоЗапроса);
Ответ = Соединение.Получить(Запрос);
КодСостояния = Ответ.КодСостояния;
СтрокаОтвета = Ответ.ПолучитьТелоКакСтроку();
Обработка ответа с веб-сервера
После отправки запроса, наш веб-сервер обработает данные и вернет ответ. Мы обрабатываем этот ответ в 1С и информируем пользователя о результате отправки сообщения:
Если КодСостояния = 200 Тогда
ЧтениеОтвета = Новый ЧтениеJSON;
ЧтениеОтвета.УстановитьСтроку(СтрокаОтвета);
РезультатСтруктура = ПрочитатьJSON(ЧтениеОтвета);
Если РезультатСтруктура.ok = "ok" Тогда
Сообщить("Сообщение отправлено");
Иначе
Сообщить("Ошибка отправки");
КонецЕсли
КонецЕсли
Заключение
Теперь наш проект полностью реализован и настроен для взаимодействия с Telegram Ботом и веб-сервером через API. При нажатии кнопки "СМС" на форме документа "ЗаказПокупателя" в 1С, клиент получит уведомление о готовности заказа через Telegram (в зависимости от наличия номера телефона клиента в базе данных Telegram Бота).
Такой подход позволяет существенно сократить затраты на оповещение клиентов, предоставляет возможность отправки более информативных сообщений и позволяет эффективно взаимодействовать с аудиторией. При необходимости, можно расширить функциональность системы, добавить дополнительные возможности и оптимизировать её работу, например рассылка рекламы и акций магазина через бота клиентам на прямую в смартфон.
В этой статье я поделился своим опытом реализации проекта оповещения клиентов через Telegram Бот с помощью API. Надеюсь, что эта информация будет полезной для вас, и вы сможете успешно применить подобные решения в своем бизнесе. Удачи вам в вашем предпринимательском пути!