Попытки использовать CRM Bitrix24 в своей работе я предпринимал уже несколько раз, но каждый раз, невозможность объединения CRM и своей телефонии, не используя телефонию битрикс, отбивало всякое желание. И вот, некоторое время назад, Bitrix24 объявил об открытии API для интеграции с телефонией.
Вооружившись Java и знаниями Asterisk я приступил к созданию приложнения, стыкующего API Bitrix24 и AMI Asterisk.
Сразу оговорюсь, Java - потому-что это единственный язык программирования, который я уже достаточно хорошо освоил и продолжаю в нем развиваться.
Конечно писал я приложение "наскоком", без техзадания или блок-схемы. О чем в дальнейшем не раз жалел. Но сейчас у меня есть возможность изложить все по порядку.
Техническое задание.
По сути здесь я опишу только тот функционал, который мне нужно было реализовать.
При входящих или исходящих звонках должна всплывать стандартная карточка звонка в CRM Bitrix24. По окончании разговора, карточка должна исчезать, а в битрикс должны подгружаться сведения о звонке и запись разговора.
Схема работы приложения.
Описательная часть.
BitrixConnector
API битрикса работает на основе "вебхуков", т.е. http запросов. Соответственно, в компоненте bitrixConnector есть легковесный http-сервер и валидатор, отвечающий за http авторизацию.
AsteriskConnector
В Java есть несколько реализаций Connector'ов к Asterisk'у. Но все они не успевают за обновлениями последнего и имели ошибки в нужных мне местах. Поэтому я написал свой простой коннектор, который реагировал, только на нужные мне события в Asterisk и так же мог отдавать команды в него.
Controller
Каждое событие, приходящее из bitrixConnector или asteriskConnector попадает в этот модуль, где каждое событие выделяется в отдельный поток. Почему так? Например, для того, чтоб отправить запись разговора в битрикс, нужно его перекодировать. А это затратное действие и чтоб не блокировать работу всего приложения, пока это действие будет выполняться, оно выделяется в отдельный самостоятельный поток. Который отправляет запись в битрикс по мере готовности.
Вся магия происходит в Controller'е.
Он следит за наличием в приложении актуального списка пользователей битрикс, имеющих внутренние телефоны.
Обновляет у пользователей статусы в соответствии с поступающими событиями от одного коннектора и отправляет соответствующие события в другой коннектор.
В битриксе, все события выстраиваются в цепочки событий с уникальным ID. Например: вызов - начало разговора - завершение разговора - загрузка записи разговора.
В астериске, разговор выстраивается из цепочки каналов. В каждом канале есть запись, с каким каналом он сейчас связан. Таким образом проходя по цепочке каналов, можно найти абонентов А и Б.
Все это позволяет приложению работать асинхронно.
Внедрение приложения можно заказать здесь.