AsterConnector v2.0

Интеграция Asterisk FreePBX/Issabel с Битрикс24. Единый PHP файл-демон с встроенным HTTP сервером, AMI клиентом и OAuth2.

Один файл
Нет зависимостей, нет composer. Просто PHP файл.
Битрикс24
OAuth2, CRM, звонки, задачи, сделки.
Asterisk AMI
PJSIP и chan_sip. FreePBX и Issabel.
Веб-панель
Встроенный интерфейс управления на порту 8080.

Что умеет модуль

  • Регистрация входящих и исходящих звонков в Битрикс24
  • Автоматическое создание лидов, контактов и сделок
  • Click-to-Call из карточки Битрикс24
  • Загрузка записей разговоров в Битрикс24
  • Маршрутизация входящих на ответственного менеджера
  • Создание задач при пропущенных звонках
  • Автозакрытие задач при успешном перезвоне
  • Повторные сделки для существующих клиентов
  • Поддержка нескольких DID с разными воронками
  • Нормализация номеров телефонов
Разработчик: ООО «LEADHUNTER» · +998 (71) 202-67-67 · support@leadhunter.uz

Системные требования

Сервер

КомпонентМинимумРекомендуется
ОСUbuntu 20.04 / CentOS 7Ubuntu 22.04
PHP8.08.1+
RAM256 МБ512 МБ
Asterisk16+18+

PHP расширения

php-cli php-curl php-pdo_sqlite php-pcntl php-mbstring
Issabel/CentOS 7: Системный PHP 5.4 не подходит. Установите PHP 8.1 через Remi репозиторий.

Сеть

  • Порт 8080 должен быть доступен для Битрикс24 (для C2C)
  • Сервер должен иметь доступ в интернет (OAuth и биллинг)
  • Битрикс24 должен иметь доступ к IP сервера

Установка

Ubuntu / Debian (FreePBX)

1
Установить PHP расширения
apt install -y php-cli php-curl php-sqlite3 php-mbstring
2
Скопировать файл модуля
cp asterconnector.php /opt/asterconnector.php
chmod 644 /opt/asterconnector.php
3
Создать systemd сервис
cat > /etc/systemd/system/asterconnector.service << 'EOF'
[Unit]
Description=AsterConnector v2.0
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/php /opt/asterconnector.php
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF
4
Запустить сервис
systemctl daemon-reload
systemctl enable asterconnector
systemctl start asterconnector
5
Открыть веб-панель
Адрес: http://IP_СЕРВЕРА:8080 · Логин: admin · Пароль: admin

Issabel / CentOS 7

Внимание: На Issabel нужен PHP 8.1 через Remi.
yum install -y epel-release
yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm
yum install -y php81 php81-php-cli php81-php-curl php81-php-pdo php81-php-mbstring

В systemd сервисе используйте ExecStart=/usr/bin/php81 /opt/asterconnector.php

Удаление

systemctl stop asterconnector && systemctl disable asterconnector
rm -f /etc/systemd/system/asterconnector.service && systemctl daemon-reload
rm -f /opt/asterconnector.php && rm -rf /etc/asterconnector/ /var/log/asterconnector/

Настройка AMI

Добавьте в /etc/asterisk/manager.conf:

[general]
enabled = yes
port = 5038
bindaddr = 127.0.0.1

[asterconnector]
secret = ВАШ_ПАРОЛЬ
deny = 0.0.0.0/0.0.0.0
permit = 127.0.0.1/255.255.255.0
read = all
write = all
asterisk -rx "manager reload"

Параметры в панели

ПолеПо умолчаниюОписание
Хост127.0.0.1IP адрес Asterisk
Порт5038Порт AMI
SIP стекАвтоPJSIP, chan_sip или автоопределение
SIP стек: На FreePBX обычно PJSIP, на Issabel — chan_sip. Если автоопределение работает неверно — выберите вручную.

Подключение Битрикс24

1
Скопируйте адрес для Битрикс24
В панели → Битрикс24 → скопируйте адрес внизу страницы: http://IP:8080/oauth/callback
2
Создайте локальное приложение
Битрикс24 → Приложения → Разработчикам → Локальные приложения → Добавить
3
Заполните параметры
Тип: Серверное · Путь обработчика: скопированный адрес · Галочка: Использует только API
Права: CRM, Телефония, Пользователи, Сообщения, Задачи
4
Вставьте Client ID и Client Secret в панели модуля
5
Нажмите Подключить и разрешите доступ
6
Синхронизируйте сотрудников
Панель → Сотрудники → Синхронизировать. У каждого сотрудника должен быть заполнен внутренний номер телефона в профиле Битрикс24.
HTTPS: Если сервер без SSL — C2C может не работать. Настройте nginx с Let's Encrypt.

Настройки звонков

Контексты

ПараметрПо умолчаниюОписание
Входящие контекстыfrom-trunk,from-pstnЧерез запятую
Контекст исходящихfrom-internalЗвонки из этого контекста — исходящие
Префикс набораДобавляется перед номером при исходящем

Нормализация номеров

Автоматически добавляет код страны: 901234567+998901234567

Создание CRM объектов

НастройкаОписание
Создавать контакт при входящемПри звонке от нового клиента
Создавать сделку при входящемТребует создания контакта
Повторная сделкаЕсли у контакта нет открытых сделок

Ответственный за пропущенный

  • Первый агент — первый кому позвонило
  • Последний агент — последний кому позвонило
  • Все агенты — уведомляются все
  • Ответственный за сделку — ищется по номеру в CRM

Маршрутизация на ответственного

Автоматически направляет входящий звонок на менеджера ответственного за клиента в Битрикс24.

Контекст ac-transfer (FreePBX/PJSIP)

[ac-transfer]
exten => _.,1,NoOp(AsterConnector Transfer: ${CALLERID(num)})
 same => n,Set(AC_EXT=)
 same => n,Set(CURLOPT(httptimeout)=3)
 same => n,Set(CURLOPT(conntimeout)=3)
 same => n,Set(AC_EXT=${CURL(http://127.0.0.1:8080/forward?phone=${CALLERID(num)}&ts=${EPOCH})})
 same => n,GotoIf($["${AC_EXT}"=""]?queue)
 same => n,Set(AC_RESPONSIBLE=${AC_EXT})
 same => n,Dial(PJSIP/${AC_EXT},20,tTg)
 same => n,GotoIf($["${DIALSTATUS}"="ANSWER"]?done)
 same => n(queue),Goto(ext-queues,1000,1)
 same => n(done),NoOp(Answered by ${AC_EXT})

Контекст ac-transfer (Issabel/chan_sip)

[ac-transfer]
exten => _.,1,NoOp(AsterConnector Transfer: ${CALLERID(num)})
 same => n,Set(AC_EXT=)
 same => n,Set(CURLOPT(httptimeout)=3)
 same => n,Set(CURLOPT(conntimeout)=3)
 same => n,Set(AC_EXT=${CURL(http://127.0.0.1:8080/forward?phone=${CALLERID(num)}&ts=${EPOCH})})
 same => n,GotoIf($["${AC_EXT}"=""]?queue)
 same => n,Set(AC_RESPONSIBLE=${AC_EXT})
 same => n,Dial(SIP/${AC_EXT},20,tTg)
 same => n,GotoIf($["${DIALSTATUS}"="ANSWER"]?done)
 same => n(queue),Goto(ext-queues,1000,1)
 same => n(done),NoOp(Answered by ${AC_EXT})
asterisk -rx "dialplan reload"

FreePBX → Connectivity → Inbound Routes → Set Destination → Custom Destinations → ac-transfer,s,1

Тест маршрутизации

curl -s "http://127.0.0.1:8080/forward?phone=998901234567"
Методы поиска: По лиду (crm.lead.list) — если клиенты хранятся как лиды. По контакту/сделке (searchCrmEntities) — если есть контакты без лидов.

Запись разговоров

ПараметрПо умолчаниюОписание
Директория записей/var/spool/asterisk/monitorПуть к файлам
Макс. размер файла50 МБФайлы больше не загружаются
Загружать в Битрикс24ДаАвтозагрузка каждые 30 секунд
Удалять после загрузкиНетУдалять файл после успешной загрузки
tail -f /var/log/asterconnector/asterconnector.log | grep RECORD

Click-to-Call (C2C)

Позволяет звонить клиентам прямо из Битрикс24 одним кликом на номер.

Требования

  • Порт 8080 доступен из интернета
  • В Битрикс24 → Телефония выбрано приложение AsterConnector
  • У сотрудника заполнен внутренний номер в Битрикс24

Ручная регистрация обработчика

TOKEN=$(cat /etc/asterconnector/tokens.json | php -r "echo json_decode(file_get_contents('php://stdin'))->access_token;")
curl -s "https://ДОМЕН.bitrix24.ru/rest/event.bind.json" \
  -d "auth=$TOKEN" -d "event=ONEXTERNALCALLSTART" \
  -d "handler=http://ВАШ_IP:8080/c2c"
chan_sip (Issabel): SIP стек в настройках должен быть выбран вручную как chan_sip.

Задачи при пропущенных звонках

При пропущенном звонке создаётся задача «Перезвонить: НОМЕР» с привязкой к контакту и сделке.

ПараметрОписание
Создавать задачу при пропущенномВключить/выключить
Исполнитель задачиОтветственный за пропущенный / сделку / по умолчанию / конкретный
Срок выполнения (часы)Через сколько часов задача должна быть выполнена
Автозакрытие задачЗакрывать при успешном звонке с клиентом
Автозакрытие: Закрываются все задачи «Перезвонить» для данного номера — даже если их несколько или у них разные исполнители.

Сделки и контакты

Повторные сделки

  1. Ищем контакт по номеру телефона
  2. Проверяем есть ли открытые сделки
  3. Если нет — создаём новую сделку
  4. Если есть — новую не создаём
crm.item.update: Для перемещения сделок между воронками используется crm.item.update, а не crm.deal.update — только так можно менять воронку.

Несколько DID с воронками

Для каждого DID номера можно указать свою воронку и этап. Звонки с разных DID попадают в разные воронки Битрикс24.

Лицензия

Активация: панель → Лицензия → введите ключ → Активировать.

Лицензия привязана к домену Битрикс24 и проверяется автоматически раз в час.

Grace период 7 дней: При недоступности сервера лицензий модуль продолжает работу. После 7 дней — регистрация звонков прекращается.
ФайлОписание
/etc/asterconnector/license.keyЛицензионный ключ
/etc/asterconnector/license.jsonКэш (подписан HMAC, не редактировать)

Ошибки и решения

AMIAMI: нет соединения / ошибка авторизации

Проверьте enabled=yes в manager.conf и правильность логина/пароля.

asterisk -rx "manager show settings"
B24Unsupported phone number format

Номер передаётся некорректно (например <unknown>). Включите нормализацию номеров в настройках.

B24expired_token / нет токена

Переподключите Битрикс24: панель → Битрикс24 → Отозвать → Подключить.

C2CC2C не работает / Внутренний номер не найден

Причина 1: У сотрудника не заполнен внутренний номер в Битрикс24. Синхронизируйте сотрудников.

Причина 2: Обработчик не зарегистрирован. Переподключите Битрикс24.

Причина 3 (Issabel): Неверный SIP стек. Выберите chan_sip вручную.

IssabelFunction CURL not registered
yum install -y asterisk16-curl
asterisk -rx "module load res_curl.so"
asterisk -rx "module load func_curl.so"
echo "load => res_curl.so" >> /etc/asterisk/modules.conf
echo "load => func_curl.so" >> /etc/asterisk/modules.conf
IssabelSQLSTATE: syntax error near "ON"

Старая версия SQLite на CentOS 7. Используйте актуальную версию модуля — в ней исправлен синтаксис.

МаршрутизацияЗвонок всегда идёт в очередь

1. Проверьте что ac-transfer подключён к входящему маршруту в FreePBX.

2. На Issabel — проверьте что func_curl загружен.

3. Включите автораспределение в панели модуля.

curl -s "http://127.0.0.1:8080/forward?phone=НОМЕР"
ЛицензияRC: cache integrity fail

Файл кэша лицензии повреждён. Удалите и перезапустите:

rm -f /etc/asterconnector/license.json
systemctl restart asterconnector

Общая диагностика

# Статус сервиса
systemctl status asterconnector

# Ошибки в логе
tail -50 /var/log/asterconnector/asterconnector.log | grep ERROR

# Проверка панели
curl -s http://127.0.0.1:8080/health

# Проверка AMI
asterisk -rx "manager show connected" | grep asterconnector

Часто задаваемые вопросы

Можно ли использовать с несколькими DID?

Да. В настройках → Номера компании добавьте все номера. Каждый можно привязать к своей воронке.

Как посмотреть историю звонков?

Панель → История звонков. Или напрямую:

sqlite3 /etc/asterconnector/asterconnector.db "SELECT * FROM calls ORDER BY id DESC LIMIT 20"

Звонок регистрируется дважды

Убедитесь что входящие контексты настроены правильно и DID номера компании указаны в настройках модуля.

Как изменить порт панели?

Панель → Система → Порт панели. После сохранения модуль перезапустится.

Как обновить модуль?

  1. Сделайте бэкап: панель → Система → Бэкап
  2. systemctl stop asterconnector
  3. cp новый_файл.php /opt/asterconnector.php
  4. systemctl start asterconnector

Нужен ли интернет для работы?

Да — для OAuth и лицензии. При отключении до 7 дней модуль работает через кэш.

История изменений

v2.0.0 Текущая

  • Единый PHP файл-демон без зависимостей
  • Встроенный HTTP сервер и веб-панель управления
  • Поддержка PJSIP и chan_sip (FreePBX и Issabel)
  • OAuth2 подключение к Битрикс24
  • Маршрутизация входящих на ответственного менеджера
  • Click-to-Call через событие ONEXTERNALCALLSTART
  • Загрузка записей разговоров в Битрикс24
  • Автосоздание задач при пропущенных звонках
  • Автозакрытие задач при успешном перезвоне
  • Повторные сделки через crm.item.update
  • Поддержка нескольких DID с отдельными воронками
  • Два метода поиска ответственного: по лиду и по контакту
  • Защита лицензии с привязкой к домену Битрикс24
  • Совместимость с Issabel/CentOS 7