Разработка Telegram Mini App с интеграцией Битрикс24

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Услуги, которые мы предлагаем
Показано 1 из 1Все 1626 услуг
Разработка Telegram Mini App с интеграцией Битрикс24
Средний
~1-2 недели
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1357
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Разработка веб-сайта для компании ФИКСПЕР
    944
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Разработка на базе Битрикс, Битрикс24, 1С для компании Development of an Online Appointment Booking Widget for a Medical Center
    693
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    829
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    731
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    1074

Разработка Telegram Mini App с интеграцией Битрикс24

Менеджер в поле открывает Telegram, видит лид — и переводит его в следующий статус за 30 секунд. Вместо 5 минут поиска в браузере. Это типовой сценарий, который мы закрываем связкой Telegram Mini App + REST API Битрикс24. Mini App работает как CRM-дашборд прямо в чате: список сделок, этапы, контактная информация, возможность прокомментировать. Разрабатываем под ключ с полной маршрутизацией OAuth, хранением токенов и настройкой вебхуков.

Проблемы, которые решает интеграция

Авторизация без браузера. Битрикс24 REST API требует OAuth access_token, но Mini App — веб-страница в WebView Telegram, где редирект невозможен. Решение — сервер-посредник, который валидирует Telegram initData и выдаёт OAuth-ссылку или готовый токен. Этот подход применили в 15+ проектах.

Задержки в обработке лидов. Менеджеры тратят до 5 минут на открытие браузера, вход в CRM и поиск карточки. Mini App сокращает это до 30 секунд: сотрудник видит лид сразу и меняет статус одним тапом. По нашим замерам, скорость реакции на входящий лид растёт на 60–70% — Telegram Mini App обрабатывает лиды в 3 раза быстрее, чем через веб-интерфейс.

Уведомления в реальном времени. Без интеграции менеджер узнаёт о новой сделке через email-рассылки с задержкой в минуты. Вебхуки событий Битрикс24 отправляют POST-запрос на сервер, а тот — сообщение в Telegram. Уведомление приходит за 1–2 секунды.

Сценарии использования

Сценарий Описание Целевая аудитория
Мобильный CRM-дашборд Просмотр лидов и сделок, смена статуса, комментарии Менеджеры в поле, отделы продаж
Корпоративный заказ Оформление заявок дилерами/агентами через Mini App Сетевые компании, дистрибьюторы
Self-service портал Клиент видит статус заявок и историю обращений B2C-сервисы, техподдержка
Таск-менеджер Список задач, смена статуса, прикрепление файлов Команды, использующие Битрикс24

Архитектура: OAuth и серверный прокси

Процесс авторизации:

  1. Пользователь открывает Mini App. Фронтенд передаёт initData на сервер.
  2. Сервер сверяет hash initData, извлекает user_id и ищет запись в таблице tg_bx24_tokens.
  3. Если токен найден и не просрочен — возвращает JWT для Mini App. Если нет — выдаёт ссылку на OAuth-авторизацию в Битрикс24.
  4. После подтверждения сервер обменивает code на access_token и сохраняет его с привязкой к Telegram user_id.
Шаг Действие Участник
1 Открытие Mini App, передача initData Пользователь -> Mini App
2 Валидация initData, поиск токена Сервер
3 Возврат JWT или OAuth-ссылки Сервер -> Mini App
4 Подтверждение OAuth (если нужно) Пользователь -> Битрикс24
5 Обмен code на токен, сохранение Сервер

Код обработки OAuth-колбека уже стандартный для всех наших интеграций:

class Bx24OAuthController
{
    public function callback(Request $request): Response
    {
        $code     = $request->get('code');
        $tgUserId = $request->session()->get('pending_tg_user_id');

        $tokenData = $this->exchangeCode($code);

        \Local\TgBx24\TokenStorage::save($tgUserId, [
            'access_token'  => $tokenData['access_token'],
            'refresh_token' => $tokenData['refresh_token'],
            'expires_at'    => time() + $tokenData['expires_in'],
            'domain'        => $tokenData['domain'],
            'user_id'       => $tokenData['user_id'],
        ]);

        $this->bot->sendMessage($tgUserId, 'Авторизация в Битрикс24 прошла успешно.');

        return redirect('/auth/success');
    }

    private function exchangeCode(string $code): array
    {
        $response = Http::post('https://oauth.bitrix.info/oauth/token/', [
            'grant_type'    => 'authorization_code',
            'client_id'     => config('bx24.client_id'),
            'client_secret' => config('bx24.client_secret'),
            'code'          => $code,
        ]);

        return $response->json();
    }
}

Токены хранятся в отдельной таблице или Redis. Мы используем автоматический refresh за 5 минут до истечения срока, чтобы пользователь не терял доступ. Все секреты шифруются.

class TokenStorage
{
    private const TABLE = 'tg_bx24_tokens';

    public static function save(int $tgUserId, array $tokenData): void
    {
        $encrypted = \Local\Crypto::encrypt(json_encode($tokenData));

        \Bitrix\Main\Application::getConnection()->queryExecute(
            "INSERT INTO " . self::TABLE . " (tg_user_id, token_data, updated_at)
             VALUES (?, ?, NOW())
             ON DUPLICATE KEY UPDATE token_data = ?, updated_at = NOW()",
            [$tgUserId, $encrypted, $encrypted]
        );
    }

    public static function getValidToken(int $tgUserId): ?array
    {
        $result = \Bitrix\Main\Application::getConnection()->query(
            "SELECT token_data FROM " . self::TABLE . " WHERE tg_user_id = ?",
            [$tgUserId]
        );

        $row = $result->fetch();
        if (!$row) return null;

        $data = json_decode(\Local\Crypto::decrypt($row['token_data']), true);

        if ($data['expires_at'] < time() + 300) {
            $data = self::refreshToken($data);
        }

        return $data;
    }

    private static function refreshToken(array $data): array
    {
        $response = \Bitrix\Main\Web\HttpClient::post(
            'https://oauth.bitrix.info/oauth/token/',
            [
                'grant_type'    => 'refresh_token',
                'client_id'     => \Bitrix\Main\Config\Option::get('local.tg_bx24', 'client_id'),
                'client_secret' => \Bitrix\Main\Config\Option::get('local.tg_bx24', 'client_secret'),
                'refresh_token' => $data['refresh_token'],
            ]
        );

        return $newData;
    }
}

Почему нужен сервер-посредник?

Прямой запрос из Mini App к API Битрикс24 невозможен из-за CORS и отсутствия безопасного хранения токена на клиенте. Сервер-посредник работает как шифровальный рубильник: все запросы к REST API идут через него, токены не покидают сервер. Это стандарт безопасности для OAuth в мобильных приложениях.

Как устроен обмен данными в реальном времени?

Битрикс24 позволяет настроить вебхуки на события — например, ONCRMDEALUPDATE. Когда событие срабатывает, Битрикс24 шлёт POST на наш сервер. Сервер определяет ответственного (ASSIGNED_BY_ID), находит его Telegram user_id через таблицу токенов и отправляет сообщение через sendMessage. Задержка — не более 2 секунд.

Как работает автоматический refresh токенов Мы храним токены в таблице `tg_bx24_tokens` с полем `expires_at`. За 5 минут до истечения срока сервер автоматически запрашивает новый токен через refresh_token. Если refresh_token тоже просрочен, пользователю предлагается пройти OAuth заново. Все секреты шифруются.

React Mini App: дашборд сотрудника CRM

Фронтенд написан на React с использованием Telegram WebApp SDK. Это позволяет встроить интерфейс в кнопку бота и использовать нативные элементы управления (например, хаптик-фидбэк).

import { useEffect, useState } from 'react';
const tg = window.Telegram.WebApp;

interface Deal {
    ID: string;
    TITLE: string;
    OPPORTUNITY: string;
    STAGE_ID: string;
    CONTACT_NAME: string;
}

function CrmDashboard() {
    const [deals, setDeals] = useState<Deal[]>([]);
    const [loading, setLoading] = useState(true);

    useEffect(() => {
        tg.ready();
        tg.expand();

        loadDeals();
    }, []);

    async function loadDeals() {
        const res = await fetch('/tg-api/crm/deals', {
            headers: { 'X-Tg-Init-Data': tg.initData },
        });
        const data = await res.json();
        setDeals(data.deals);
        setLoading(false);
    }

    async function updateStage(dealId: string, stageId: string) {
        await fetch(`/tg-api/crm/deals/${dealId}/stage`, {
            method: 'PUT',
            headers: {
                'Content-Type': 'application/json',
                'X-Tg-Init-Data': tg.initData,
            },
            body: JSON.stringify({ stage_id: stageId }),
        });
        tg.HapticFeedback.notificationOccurred('success');
        loadDeals();
    }

    // ... рендер
}

На сервере — прокси-класс, который инкапсулирует вызовы к REST API. Он автоматически подставляет токен из хранилища и обрабатывает ошибки авторизации:

class CrmDealsProxy
{
    public function getDeals(int $tgUserId): array
    {
        $tokenData = TokenStorage::getValidToken($tgUserId);
        if (!$tokenData) {
            throw new \RuntimeException('Not authorized', 401);
        }

        $bx24 = new \Local\TgBx24\Bx24Client($tokenData['access_token'], $tokenData['domain']);

        $result = $bx24->call('crm.deal.list', [
            'filter' => ['ASSIGNED_BY_ID' => $tokenData['user_id'], 'CLOSED' => 'N'],
            'select' => ['ID', 'TITLE', 'OPPORTUNITY', 'STAGE_ID', 'CONTACT_ID'],
            'order'  => ['DATE_MODIFY' => 'DESC'],
            'start'  => 0,
        ]);

        return $result['result'] ?? [];
    }

    public function updateDealStage(int $tgUserId, int $dealId, string $stageId): bool
    {
        $tokenData = TokenStorage::getValidToken($tgUserId);
        $bx24      = new \Local\TgBx24\Bx24Client($tokenData['access_token'], $tokenData['domain']);

        $result = $bx24->call('crm.deal.update', [
            'id'     => $dealId,
            'fields' => ['STAGE_ID' => $stageId],
        ]);

        return !empty($result['result']);
    }
}

Уведомления через вебхуки событий

(уже описано выше)

Что входит в разработку

  • Регистрация приложения Битрикс24 (OAuth), настройка Mini App в @BotFather
  • Сервер-посредник: валидация initData, хранение и обновление OAuth-токенов (PHP 8.1, MariaDB)
  • React Mini App под выбранный сценарий (дашборд сделок, заявки, задачи)
  • REST-прокси к Битрикс24 API с автопродлением токенов
  • Вебхуки событий Битрикс24 для уведомлений в Telegram
  • Онбординг пользователя: привязка аккаунта и тестовый запуск
  • Документация по установке и поддержке

Сроки и стоимость

  • MVP под один сценарий — от 3 до 5 недель
  • Полнофункциональное приложение с несколькими разделами — от 8 до 14 недель

Стоимость рассчитывается индивидуально после анализа технического задания. Предоставляем гарантию 30 дней на работоспособность интеграции. Опыт — 10+ лет, более 50 интеграций с внешними сервисами. Сертифицированные Битрикс-разработчики.

Свяжитесь с нами для консультации — мы проведём бесплатный аудит вашей CRM и предложим архитектуру, которая сократит время реакции отдела продаж.

Открытые линии: где всё начинается и ломается

Модуль «Открытые линии» (imopenlines) — штатный механизм Битрикс24 для омниканальных коммуникаций. Он связывает внешний канал с внутренним чатом через сущность Im\Model\ChatTable. Проблема в том, что из коробки настройки маршрутизации примитивные: «по очереди» или «всем сразу». Для реального отдела продаж с 15+ менеджерами, VIP-клиентами и SLA по времени ответа этого недостаточно. Мы дорабатываем маршрутизацию через обработчики событий OnImOpenLinesChatStart и REST API.

Менеджер переключается между пятью окнами, теряет сообщения, забывает ответить — клиент уходит к конкуренту, который ответил за 30 секунд. Настройка мессенджеров Битрикс24 собирает все каналы в один интерфейс, а CRM фиксирует каждое касание. Опыт показывает: после настройки среднее время первого ответа сокращается на 40% уже в первую неделю.

Как мы реализуем интеграцию мессенджеров

Подключаем Telegram, WhatsApp, Viber, VK, онлайн-чат, Email и другие каналы через штатные коннекторы или REST API. Каждый канал требует своей настройки, но результат единый — все сообщения попадают в открытые линии, а из них — в карточку клиента. Гарантируем, что ни одно обращение не потеряется: используем тегированное кэширование и агенты для проверки очередей.

Как подключить WhatsApp к Битрикс24?

WhatsApp — главный бизнес-канал. Интеграция через WhatsApp Business API с верифицированным аккаунтом. Настраиваем приём и отправку сообщений из интерфейса Б24 — они падают в открытую линию. Создаём HSM-шаблоны для инициации диалога (напоминание о брошенной корзине, статус заказа). Шаблоны проходят модерацию Meta — закладывайте 2-3 дня. Обеспечиваем передачу файлов, изображений, документов. Связываем переписку с контактом и сделкой через CRM_ENTITY_TYPE и CRM_ENTITY_ID.

Способ Нюансы Модель оплаты
WhatsApp Business API (Cloud) Верификация через Meta Business, шаблоны, массовые рассылки Оплата за conversation window (24ч)
Провайдер (Edna, Wazzup, Chat2Desk) Быстрый старт, промежуточный сервис, свои лимиты Абонентская плата
Б24 CRM-маркетинг Встроенная интеграция, минимум настроек Входит в тариф «Профессиональный»+

Telegram: бесплатный канал с высоким охватом

Telegram Bot API бесплатный и хорошо документированный — приятная редкость среди мессенджеров. Интеграция в Битрикс24 выполняется через коннектор imopenlines. Настройка: подключаем бота к открытым линиям, настройка коннектора → Telegram. Приём сообщений, фото, видео, документов — всё маппится в чат Б24. Inline-кнопки и reply-клавиатуры для навигации. Webhook на https://yourdomain/rest/imconnector.register — регистрация коннектора. Интеграция с CRM: входящее сообщение создаёт лид через crm.lead.add или активность в сделке.

Telegram незаменим для:

  • Поддержки через бота — типовые вопросы закрываются без оператора (до 70% обращений).
  • Уведомлений: заказы, доставка, оплата — через Telegram Bot API sendMessage.
  • Сбора лидов: бот задаёт квалифицирующие вопросы → создаёт лид.

Viber и VK: аудитория 35+ и соцсеть

Viber держит позиции в регионах. Подключаем бизнес-аккаунт через коннектор открытых линий. Используем Viber Business Messages — массовые рассылки с кнопками действий и rich-контентом. Приём и отправка из CRM работают сразу.

VK (ВКонтакте) — крупнейшая соцсеть в РФ. Интеграция через коннектор imopenlines сообщений сообщества. Обработка сообщений и комментариев из единого интерфейса. Автосоздание лида — обработчик OnImOpenLinesCrmCreate. Интеграция с VK Рекламой для трекинга источников через UTM. Бот для автоответов — VK Bot API + Callback API.

Почему важна правильная маршрутизация обращений?

Распределение обращений по операторам организовано через механизмы очередей. По умолчанию — «кто свободен». В реальности нужно сложнее:

  • Определение ответственного по номеру или email из CRM — im.chat.get + поиск по crm.contact.list.
  • Распределение по отделам на основе ключевых слов (NLP-классификатор или простой regex на первом сообщении).
  • Приоритетная очередь для VIP — по сегменту в CRM.
  • Эскалация при таймауте 5 минут — автопереключение на следующего.
  • Переход на звонок прямо из чата — telephony.externalcall.register.

Используем кастомные обработчики событий OnImOpenLinesChatStart и REST API для реализации таких сценариев. Дополнительно подключаем Bizproc для сложных цепочек согласований и интеграцию с HL-блоками для хранения пользовательских параметров очередей. Результат: клиент не ждёт, оператор не перегружен.

Что входит в работу по интеграции мессенджеров

Компонент Описание
Аудит текущей CRM-структуры Анализ типов обращений, каналов, нагрузки на операторов
Подключение каналов Настройка коннекторов WhatsApp, Telegram, Viber, VK, Email, онлайн-чат
Настройка маршрутизации Очереди, распределение по компетенциям, эскалации, SLA
Разработка чат-бота Сценарный или с NLP, интеграция с CRM и внешними API
Обучение операторов Документация, запись видеоинструкций, вебинар
Тестирование и сопровождение Прогон всех сценариев, мониторинг 2 недели после запуска
Гарантия 6 месяцев Бесплатная доработка ошибок, консультации

Чат-боты: сценарные и с NLP

Типы

Сценарные (rule-based): кнопочное меню, дерево решений. «Как оплатить» → «Где мой заказ» → «Часы работы». Передача на оператора при intent == 'unknown' → transfer_to_queue. Надёжно, предсказуемо, покрывает 60-70% типовых обращений.

С NLP: свободный текст на русском. Определение intent (купить, пожаловаться, узнать о доставке), извлечение сущностей (имя, дата, номер заказа). Контекстный диалог — помнит, о чём говорили. Реализуем на Rasa или Dialogflow, интеграция с Б24 через REST.

Пример кода обработчика для сценарного бота (PHP)
use Bitrix\Main\Loader;
use Bitrix\Imopenlines\Model\SessionTable;

Loader::includeModule('imopenlines');

$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandler('imopenlines', 'OnImOpenLinesMessageReceive', function($event) {
    $message = $event->getParameter('message');
    $chatId = $event->getParameter('chatId');
    
    if (preg_match('/статус заказа (\d+)/i', $message, $matches)) {
        $orderId = $matches[1];
        // Получаем статус заказа через API
        $order = \Bitrix\Sale\Order::load($orderId);
        if ($order) {
            $status = $order->getField('STATUS_ID');
            \Bitrix\ImOpenLines\Chat::sendMessage($chatId, 'Ваш заказ №' . $orderId . ' в статусе: ' . $status);
        }
    }
});

Сценарии и реальный эффект

Сценарий Действие Разгрузка операторов
FAQ Ответы из базы знаний по match intent 30-50%
Статус заказа Запрос sale.order.get по номеру 15-25%
Запись Выбор даты/специалиста, создание через API 20-30%
Калькуляция Предварительный расчёт по параметрам 10-20%
Квалификация лида Сбор данных → crm.lead.add Ускорение воронки в 3 раза
NPS/CSAT Оценка после обслуживания Автоматический сбор 100%

Сравнение: сценарный бот обрабатывает запросы в 5 раз быстрее оператора, а NLP-бот снижает fallback rate до 15% после обучения на реальных диалогах. Средняя экономия на зарплате операторов при внедрении чат-бота составляет значительную сумму — десятки тысяч рублей ежемесячно.

Процесс разработки

  1. Анализ обращений — выгружаем историю из открытых линий, кластеризуем по темам. Определяем 80% типовых запросов.
  2. Проектирование диалогов — карта на miro/figma. Каждая ветка заканчивается либо ответом, либо передачей оператору.
  3. Разработка — логика, интеграция с CRM и внешними API. Для сценарных — конечный автомат на состояниях. Для NLP — pipeline: tokenizer → featurizer → classifier → response selector.
  4. Обучение NLP — на реальных диалогах (не менее 500 примеров). Настройка threshold confidence.
  5. Тестирование — прогон всех веток, edge cases (пустое сообщение, стикер, голосовое).
  6. Оптимизация — мониторинг fallback rate, дообучение на новых диалогах каждые 2 недели.

Сроки

Задача Срок
Подключение одного мессенджера 1-2 дня
Настройка открытых линий 2-3 дня
Сценарный бот (базовый) 1-2 недели
Бот с NLP 3-6 недель
Комплексная омниканальная система 4-8 недель

Результат — все обращения в едином окне, рутина автоматизирована, ни одно сообщение не теряется. Менеджеры продают, а не ищут нужный чат. Оцените, какие каналы нужны именно вам, — напишите, подберём под вашу нишу. Получите персональный расчёт срока и стоимости для вашего проекта.