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

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

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

В прошлой статье мы рассмотрели как выполнить интеграцию 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)
Добавление кастом контекста
Добавление кастом контекста

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

Пример входящего вызова
Пример входящего вызова
 
avatar
  Подписаться  
Уведомление о

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

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

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

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

ближайшие Вебинары

ONLINE

Why Choose HUGE?

Unlimited pre-designed elements

Each and every design element is designed for retina ready display on all kind of devices

User friendly interface and design

Each and every design element is designed for retina ready display on all kind of devices

100% editable layered PSD files

Each and every design element is designed for retina ready display on all kind of devices

Created using shape layers

Each and every design element is designed for retina ready display on all kind of devices