Кирилл Золотавин
29.10.2019
3379

Кастомизация интеграции Asterisk с Terrasoft (BPM Online CRM)

В прошлой статье мы рассмотрели как выполнить интеграцию BPM online CRM с Asterisk, но стандартный функционал интеграции обладает ограниченными возможностями, в рамках же данной статьи будет рассмотрен пример расширения возможностей интеграции посредством написания дополнительного конфигурационного сервиса(https://academy.terrasoft.ru/documents/technic-sdk/7-13/razdel-konfiguraciya) в встроенных средствах разработки CRM. 1. Пройдем авторизацию в CRM системе с правами администратора и перейдем в раздел «Настройки […]

Кастомизация Asterisk с Terrasoft

В прошлой статье мы рассмотрели как выполнить интеграцию BPM online CRM с Asterisk, но стандартный функционал интеграции обладает ограниченными возможностями, в рамках же данной статьи будет рассмотрен пример расширения возможностей интеграции посредством написания дополнительного конфигурационного сервиса(https://academy.terrasoft.ru/documents/technic-sdk/7-13/razdel-konfiguraciya) в встроенных средствах разработки CRM.

Все описанные действия в статье необходимо выполнять от имени суперпользователя (root). Установка и настройка производилась на предустановленной системе CentOS 6.9 + Asterisk 13 + FreePBX 13 + PHP 5.6.36 + BPM Online Crm 7.14.1.935. Действия со стороны CRM должны выполняться специалистом со знаем языков программирования C#, JavaScript.

1. Пройдем авторизацию в CRM системе с правами администратора и перейдем в раздел «Настройки → Управление конфигурацией Конфигурация → Добавить» и в выпадающем списке выберем «Исходный код».

Авторизация в CRM
Авторизация в CRM
Переход в управление конфигурациями
Переход в управление конфигурациями
Добавление исходного кода
Добавление исходного кода

2. В открывшейся форме редактирования исходного кода  первым шагом необходимо прописать «Заголовок» и «Название» создаваемой конфигурации. И в качестве примера данной статьи рассмотрим конфигурационный сервис который будет возвращать имя клиента по его номеру прописанному в CRM, для этого пропишем следующий код, сформированный на основе официальной документации для разработчиков: https://academy.terrasoft.ru/documents/technic-sdk/7-14/sozdanie-polzovatelskogo-konfiguracionnogo-servisa

namespace Terrasoft.Configuration.UsrCustomConfigurationService
{
 using System;
 using System.ServiceModel;
 using System.ServiceModel.Web;
 using System.ServiceModel.Activation;
 using Terrasoft.Core;
 using Terrasoft.Web.Common;
 using Terrasoft.Core.Entities; 

 [ServiceContract]
 [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
 public class UsrCustomConfigurationService: BaseService
    {  
        // Метод, возвращающий имя контакта по его номеру.
        [OperationContract]
        [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped,
        ResponseFormat = WebMessageFormat.Json)]
        public string GetContactNamebyPhone(string Phone){
            // Результат по умолчанию.
            var result = "";
            // Экземпляр EntitySchemaQuery, обращающийся в таблицу Contact базы данных.
            var esq = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "Contact");
            // Добавление колонок в запрос.
           var colName = esq.AddColumn("Name");
            // Фильтрация данных запроса по номеру и типу сравнения Contain.
            var esqFilter = esq.CreateFilterWithParameters(FilterComparisonType.Contain, "Phone", Phone);
            esq.Filters.Add(esqFilter);
            // Получение результата запроса.
            var entities = esq.GetEntityCollection(UserConnection);
            // Если данные получены.
            if (entities.Count > 0)
            {
                // Возвратить значение колонки "Name" первой записи результата запроса.
                result = entities[0].GetColumnValue(colName.Name).ToString();
            }
            // Возвратить результат.
            return result;
        }
    }
}
В данном коде применяется тип сравнения при фильтрации Contain, согласно которому выполняется сверка содержимого выражения передаваемого номера, т.е. нет необходимости передавать номер в полном формате или это удобно применять так же когда номера в CRM прописаны с «+7» а оператор связи выполняет передачу с «8». Более подробно о типах сравнения можно почерпнуть информацию из официальной документации разработчика: https://academy.terrasoft.ru/api/SDKNETAPI/7.10.0/Terrasoft.Core~Terrasoft.Core.Entities.FilterComparisonType.html
Создание конфигурационного сервиса
Создание конфигурационного сервиса

3. После заполнения всех необходимых полей из предыдущего пункта, для возможности обращения к создаваемому конфигурационному сервису его необходимо «Сохранить» и «Опубликовать»

Сохранение конфигурационного сервиса
Сохранение конфигурационного сервиса
Успешность сохранения
Успешность сохранения
Публикация конфигурационного сервиса
Публикация конфигурационного сервиса
Успешность публикации
Успешность публикации

4. Для возможности обращения к конфигурационному сервису добавим в  CRM пользователя  “Supervisor” и предоставим ему достаточные права для доступа к внешним сервисам. Перейдем в Настройки → Пользователи системы → Добавить → Пользователя портала, заполним основные разделы и нажать «Сохранить для применения внесенных изменений»:

Контакт — контактные данные закрепленные за пользователем
   На вкладке «Основная информация»:
Имя пользователя — в примере данной статьи «Supervisor»
Пароль — пароль создаваемого пользователя
Подтверждение пароля —  пароль создаваемого пользователя
   На вкладке «Роли»:
Организационные роли — в рамках данной статьи назначим права администратора данному пользователю

Переход в раздел «Пользователи системы»
Добавление пользователя портала
Добавление пользователя портала
Заполнение основной информации пользователя
Заполнение основной информации пользователя
Сохранение введенной информации пользователя.

5. Выполним подключение по SSH к серверу IP АТС Asterisk для дальнейшей настройки. В зависимости от используемой системы(Windows, Linux, MacOS), подключение по SSH можно выполнить с использованием различного дополнительного программного обеспечения(Putty), либо системного терминала.

6. Создадим исполняемый php файл посредством обращения к которому из Asterisk будем получать имя звонящего клиента из CRM:

# nano /opt/bpm_check.php

И предем данный файл к виду(не забывая изменить логин, пароль и адрес CRM):

#!/usr/bin/php -q
<?php
//*********************************************
//Обращение к методу AuthService (Авторизация)
//*********************************************
//Ссылка на метод авторизации
$url = "https://048821-crm-bundle.bpmonline.com/ServiceModel/AuthService.svc/Login";
//Формируем данные для запроса содержащих логин и пароль
$requestData["UserName"] = "Supervisor";
$requestData["UserPassword"] = "password";
//Формируем json-представление данных
$jcres = json_encode($requestData);
//Инициируем сеанс cUrl
$ch = curl_init($url);
//Определяем файл для хранения cookies
curl_setopt($ch, CURLOPT_COOKIEJAR,'cookie.txt');
//Указываем метод запроса
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
//Подставляем данные для передачи в запросе
curl_setopt($ch, CURLOPT_POSTFIELDS, $jcres);
//Указываем, что результат вернем в строку при вызове метода curl_exec()
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//Формируем массив http-заголовков. Формат json.
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Content-Length: ' . strlen($jcres))
);
$result = curl_exec($ch);
curl_close($ch);

//Определяем файл для хранения cookies
$file = "cookie.txt";
$lines = file( $file );
$str =  $lines[6];
$prefix = "BPMCSRF";
$index = strpos($str, $prefix) + strlen($prefix);
// Присвоим переменной токкен сессии авторизации
$token = trim(substr($str, $index));

//*********************************************
//Обращение к методу GetContactNamebyPhone созданного конфигурационного сервиса в CRM
//*********************************************
//Ссылка на метод GetContactNamebyPhone
$url_1 = "https://048821-crm-bundle.bpmonline.com/0/rest/UsrCustomConfigurationService/GetContactNamebyPhone";
$requestDataService["Phone"] = $argv[1];
//Формируем json-представление данных содеращий номер звонящего клиента передаваемый из Asterisk
$jcres = json_encode($requestDataService);
$ch5 = curl_init($url_1);
curl_setopt($ch5, CURLOPT_COOKIEFILE, 'cookie.txt');
curl_setopt($ch5, CURLOPT_COOKIEJAR,'cookie.txt');
curl_setopt($ch5, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch5, CURLOPT_POSTFIELDS, $jcres);
curl_setopt($ch5, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch5, CURLOPT_HEADER   ,FALSE);
curl_setopt($ch5, CURLOPT_HTTPHEADER, array(
        'Content-Type: application/json',
        'BPMCSRF: ' .$token,
        'Content-Length: ' . strlen($jcres))
);

$result5 = curl_exec($ch5);
curl_close($ch5);

$result5 = json_decode($result5, true);
//Возвращаем результат обращения содержащий имя клиента из базы CRM
echo print_r($result5['GetContactNamebyPhoneResult'],true);
unlink('cookie.txt');
Создание исполняемого php файла.
Создание исполняемого php файла.

7. Приступим к конфигурированию Asterisk, в качестве примера рассмотрим создание кастом контекста для входящего маршрута:

# nano /etc/asterisk/extensions_custom.conf

И приведем данный файл к виду:

[from-7495XXXXXXX]
exten => _X.,1,Set(TOEXT=${SHELL(/opt/bpm_check.php ${CALLERID(num)})})
same => n,NoOp(Name Client=${TOEXT})
same => n,Set(CALLERID(name)=${TOEXT})
same => n,Goto(from-trunk,7495XXXXXXX,1)
Добавление кастом контекста
Добавление кастом контекста

В результате установив данный контекст в параметрах транка используемой городской линии, при прохождении звонка с номера известного клиента, на экране телефонного аппарата(софтфона) отобразиться имя звонящего клиента:

Пример входящего вызова
Пример входящего вызова
Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии

Остались вопросы?

Я - Кондрашин Игорь, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.

VoIP оборудование


ближайшие курсы

10 доводов в пользу Asterisk

Распространяется бесплатно.

Asterisk – программное обеспечение с открытым исходным кодом, распространяется по лицензии GPL. Следовательно, установив один раз Asterisk вам не придется дополнительно платить за новых абонентов, подключение новых транков, расширение функционала и прочие лицензии. Это приближает стоимость владения станцией к нулю.

Безопасен в использовании.

Любое программное обеспечение может стать объектом интереса злоумышленников, в том числе телефонная станция. Однако, сам Asterisk, а также операционная система, на которой он работает, дают множество инструментов защиты от любых атак. При грамотной настройке безопасности у злоумышленников нет никаких шансов попасть на станцию.

Надежен в эксплуатации.

Время работы серверов некоторых наших клиентов исчисляется годами. Это значит, что Asterisk работает несколько лет, ему не требуются никакие перезагрузки или принудительные отключения. А еще это говорит о том, что в районе отличная ситуация с электроэнергией, но это уже не заслуга Asterisk.

Гибкий в настройке.

Зачастую возможности Asterisk ограничивает только фантазия пользователя. Ни один конструктор шаблонов не сравнится с Asterisk по гибкости настройки. Это позволяет решать с помощью Asterisk любые бизнес задачи, даже те, в которых выбор в его пользу не кажется изначально очевидным.

Имеет огромный функционал.

Во многом именно Asterisk показал какой должна быть современная телефонная станция. За многие годы развития функциональность Asterisk расширилась, а все основные возможности по-прежнему доступны бесплатно сразу после установки.

Интегрируется с любыми системами.

То, что Asterisk не умеет сам, он позволяет реализовать за счет интеграции. Это могут быть интеграции с коммерческими телефонными станциями, CRM, ERP системами, биллингом, сервисами колл-трекинга, колл-бэка и модулями статистики и аналитики.

Позволяет телефонизировать офис за считанные часы.

В нашей практике были проекты, реализованные за один рабочий день. Это значит, что утром к нам обращался клиент, а уже через несколько часов он пользовался новой IP-АТС. Безусловно, такая скорость редкость, ведь АТС – инструмент зарабатывания денег для многих компаний и спешка во внедрении не уместна. Но в случае острой необходимости Asterisk готов к быстрому старту.

Отличная масштабируемость.

Очень утомительно постоянно возвращаться к одному и тому же вопросу. Такое часто бывает в случае некачественного исполнения работ или выбора заведомо неподходящего бизнес-решения. С Asterisk точно не будет такой проблемы! Телефонная станция, построенная на Asterisk может быть масштабируема до немыслимых размеров. Главное – правильно подобрать оборудование.

Повышает управляемость бизнеса.

Asterisk дает не просто набор полезных функций, он повышает управляемость организации, качества и комфортности управления, а также увеличивает прозрачность бизнеса для руководства. Достичь этого можно, например, за счет автоматизации отчетов, подключения бота в Telegram, санкционированного доступа к станции из любой точки мира.

Снижает расходы на связь.

Связь между внутренними абонентами IP-АТС бесплатна всегда, независимо от их географического расположения. Также к Asterisk можно подключить любых операторов телефонии, в том числе GSM сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.