Интеграция Битрикс24 с 3CX
3CX — коммерческая IP-АТС с продуманным веб-интерфейсом и собственной экосистемой клиентских приложений. В отличие от Asterisk, 3CX предоставляет структурированный API для интеграций — что упрощает задачу, но и накладывает ограничения на архитектурные решения.
Два официальных способа интеграции
Встроенная CRM-интеграция 3CX. 3CX имеет раздел Settings → CRM Integration, где можно настроить передачу событий звонков во внешние CRM. Битрикс24 не входит в список предустановленных CRM в 3CX по умолчанию, но поддерживается через Custom CRM — механизм шаблонов HTTP-запросов.
3CX Call Flow Designer (CFD) + Webhooks. CFD — визуальный дизайнер call-flow в 3CX, позволяющий при определённых событиях звонка делать HTTP-запросы. Гибче, чем CRM-интеграция, и подходит для нестандартных сценариев.
Настройка через Custom CRM Integration
В консоли 3CX Management Console → CRM Integration → Custom CRM:
URL звонка (Call Answered):
https://ваш_портал.bitrix24.ru/rest/КЛЮЧ/telephony.externalcall.register/
Параметры запроса передаются в теле POST:
{
"USER_PHONE_INNER": "%Ext%",
"PHONE_NUMBER": "%CallerNumber%",
"CALL_START_DATE": "%CallStarted%",
"CRM_CREATE": "Y",
"TYPE": "%Direction%"
}
3CX поддерживает переменные-плейсхолдеры: %Ext% — внутренний номер, %CallerNumber% — номер звонящего, %Direction% — направление (1=входящий, 2=исходящий). Полный список переменных в документации 3CX.
URL завершения звонка (Call Ended):
https://ваш_портал.bitrix24.ru/rest/КЛЮЧ/telephony.externalcall.finish/
Параметры:
{
"CALL_ID": "%call_id_saved%",
"DURATION": "%TalkDuration%",
"STATUS_CODE": "200"
}
Проблема: Custom CRM Integration в 3CX не предоставляет механизма хранения состояния (нельзя сохранить CALL_ID из ответа Битрикс24 и передать при завершении). Это ключевое ограничение — для полноценной интеграции с сохранением CALL_ID нужен промежуточный сервер.
Промежуточный сервер: решение проблемы CALL_ID
Архитектура с промежуточным обработчиком:
3CX → webhook → PHP/Node.js обработчик
↓
Битрикс24 REST API → получаем CALL_ID
↓
Сохраняем CALL_ID в Redis/БД с ключом = UNIQUEID звонка
↓
3CX → webhook завершения → обработчик
↓
Достаём CALL_ID из Redis
↓
telephony.externalcall.finish
↓
Прикрепляем запись
Это добавляет компонент инфраструктуры, но даёт полный контроль над интеграцией.
Запись звонков в 3CX
3CX сохраняет записи в директории сервера или в облачном хранилище (зависит от версии и настроек). Доступ к файлам через 3CX Recording Storage API или напрямую к файловой системе.
Для передачи в Битрикс24 — скрипт после завершения звонка обращается к 3CX API, получает ссылку на запись и загружает её через telephony.externalCall.attachRecord.
3CX возвращает ссылку на запись через API звонков:
GET /api/recordings?callId={callId}
Авторизация через JWT-токен (3CX версии 18+): Authorization: Bearer <token>.
3CX SBC и проблема NAT
3CX часто разворачивается с SBC (Session Border Controller) для NAT-traversal. При интеграции с Битрикс24 через SIP-транк нужно убедиться, что внешний IP SBC прописан в настройках SIP-транка Битрикс24. Иначе — одностороннее аудио при звонках от Битрикс24 к 3CX.
Кейс: распределённая команда, 3CX в облаке
IT-компания с офисами в двух городах использовала 3CX Hosted (облачная версия). Требование: когда клиент звонит на московский номер и попадает к питерскому менеджеру, в Битрикс24 звонок должен создаваться у питерского менеджера с привязкой к московскому входящему номеру.
3CX Custom CRM Integration не поддерживает маппинг внутренних номеров на пользователей Битрикс24. Решили через промежуточный обработчик с таблицей соответствий: внутренний номер 3CX → ID пользователя Битрикс24. При регистрации звонка обработчик смотрит в таблицу и подставляет USER_ID нужного пользователя.
Срок настройки: 5-7 рабочих дней.







