Давно чесались руки, но не было времени для реализации данного функционала.
Итак, начнем настройку.
1. Настройка в личном кабинете https://vpbx.mts.ru/
Главное меню - Методы API:
Активируем API, генерируем ключ, указываем URL для обратных вызовов (об этом подробнее ниже).
Переходим Главное меню - web hooks, активируем.
Заполняем настройки CRM УНФ - Облачная телефония:
Ставим галочку здесь:
Копируем ключ API и заполняем адрес АТС:
Заполняем пользователей телефонии. Важно: вместо внутренних телефонов указываем идентификаторы абонентов отсюда (главное меню-абоненты):
Число в адресной строке и есть идентификатор абонента.
Заполняем действия при исходящих звонках (входящие мы пока не будем отслеживать, т.к. надо поднять отдельный HTTP сервис для callback-запросов МТС и об этом будет отдельная тема):
Теперь конфигуратор.
В конфигураторе добавляем расширение.
Заимствуем процедуру ДополнитьПараметрыОтправки общего модуля ОтправкаЗапросов для исправления запроса по требованиям API МТС:
Вставляем следующий код:
&После("ДополнитьПараметрыОтправки")
Процедура Расш1_ДополнитьПараметрыОтправки(ПараметрыОтправки)
ИДАбонента =ПараметрыОтправки.ПараметрыТела["user"];
ИсходящийНомер = ПараметрыОтправки.ПараметрыТела["phone"];
ПараметрыОтправки.URL = "https://vpbx.mts.ru/api/user/" + ИДАбонента + "/calls?address=tel:" + ИсходящийНомер;
ПараметрыОтправки.Заголовки.Вставить("X-AUTH-TOKEN", ПараметрыОтправки.ПараметрыТела["token"]);
ПараметрыОтправки.Заголовки.Вставить("cache-control", "no-cache");
КонецПроцедуры
Запускаем в режиме предприятия, находим контакт для звонка. Нажимаем трубочку, радуемся.
Немного про callback адрес и webhooks.
Из описания методов API:
Для активации API CRM необходимо выбрать в левом меню пункт "Активация API". В нем необходимо активировать API, сгенерировать токен авторизации и настроить URL для обратного вызова. URL для обратного вызова должен быть доступен в публичном интернете.
Если мы не предполагаем использование входящих вызовов в CRM, то можно поднять простой HTTP сервис с методом POST.
Адрес запроса будет выглядеть так:
http://ххх.ххх.ххх.ххх/mts/hs/api/post/subscription
Примерный код обработки входящих запросов
Функция ШаблонURL1subscription(Запрос)
ТекДата = ТекущаяДата();
суффикс = Формат(Год(текДата),"ЧГ=") + "_" + Формат(Месяц(Текдата),"ЧГ=") + "_" + Формат(День(Текдата),"ЧГ=");
ИмяЛога = "D:\Разработка\МТС\Логи\logHooks_" + суффикс + ".txt";
ткс = НайтиФайлы(ИмяЛога); //лог входящих запросо для отладки
Текст = Новый ТекстовыйДокумент;
Если НЕ ткс.Количество() = 0 тогда
Текст.Прочитать(ИмяЛога);
КонецЕсли;
СтрокаЗапрос = Запрос.ПолучитьтелоКакСтроку();
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(СтрокаЗапрос);
Попытка
мДаты = Новый Массив; //формат даты в запросе ФорматДатыJSON.JavaScript надо восстанавливать функцией ВосстановитьДатуJSON
мДаты.Добавить("startTime");
мДаты.Добавить("endTime");
мДаты.Добавить("answerTime");
Данные = ПрочитатьJSON(Чтение,,мДаты,ФорматДатыJSON.JavaScript,"ВосстановитьДатуJSON",МТС);
Исключение
иск = ОписаниеОшибки();
КонецПопытки;
Чтение.Закрыть();
Попытка
МТС.ДобавитьЗаписьВходящийЗапрос(Данные); //процедура заполнения регистра с протоколом входящих запросов
Исключение
КонецПопытки;
Текст.ДобавитьСтроку(Формат(ТекДата,"ДЛФ=T") + " " + СтрокаЗапрос);
Текст.Записать(ИмяЛога);
Ответ = Новый HTTPСервисОтвет(200);
Возврат Ответ;
КонецФункции
И на всякий случай функция разбора даты:
&НаСервере
Функция ВосстановитьДатуJSON(Свойство, Значение, ДополнительныеПараметры) Экспорт
Если Свойство = "answerTime" Или Свойство = "endTime" Или Свойство = "startTime" Тогда
Результат = Дата(1,1,1);
Если ЗначениеЗаполнено(Значение) Тогда
Попытка
фЗначение = "new Date(" + Формат(Значение,"ЧГ=") + ")";
Результат = ПрочитатьДатуJSON(фЗначение, ФорматДатыJSON.JavaScript);
Возврат Результат;
Исключение
КонецПопытки;
КонецЕсли;
КонецЕсли;
КонецФункции
Теперь МТС при проверке нашего адреса получит код 200 и не отключит API взаимодействие. До выхода стабильной платформы 8.3.21 нет возможности поднять этот сервис на стороне УНФ. Т.к. МТС стучится к нам используя ключ авторизации а не Логин и пароль пользователя. Оказывается можно.
В файле публикации default.vrd прописываем
Пример файловой базы:
ib="File="[КаталогВиртуальноПриложения]";Usr=[Пользователь];Pwd=[Пароль];"
Пример клиент-серверной базы:
ib="Srvr="tcp://[ИмяСервера]";Ref="[ИмяПубликации]";Usr=[Пользователь];Pwd=[Пароль];"
Получится примерно так:
<?xml version="1.0" encoding="UTF-8"?>
<point xmlns="http://v8.1c.ru/8.2/virtual-resource-system"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
base="/unf"
ib="File="D:\УНФ";Usr=TelephonyService;Pwd="111111111";">
Ссылка на пруфы:
https://its.1c.ru/db/metod81#content:6966:hdoc )
А Токен авторизации проверяется в самом коде программы.
В модуле http-сервиса:
Если НЕ ТелефонияСервер.КорректнаяПодписьЗапроса(Перечисления.ДоступныеАТС.ДомRu, Запрос.Заголовки["X-AUTH-TOKEN"]) Тогда
Ответ = СообщениеОбОшибке(
400,
ИмяСобытияДляЖурналаРегистрации,
НСтр("ru='Некорректный ключ'"));
ТелефонияСервер.ЛогироватьИсходящийОтвет(Ответ, ИдентификаторЗапроса);
Возврат Ответ;
КонецЕсли;
Однако, в дальнейшем есть смысл поднять сервис на отдельно взятой конфигурации и обеспечить взаимодействие с ней УНФ. Чтобы в УНФ поступали только "рабочие" звонки. Практика тестирования показала, что в регистрах оседает много ненужного мусора, который сложно отсеять. Информации во входящих запросах МТС маловато и ее сложно однозначно идентифицировать как конкретное событие. Примерно 90% информации - сервисного характера (пытаюсь дозвониться на ИД 1,2,3,4,5,6... ИД 3 ответил, ИД 1,2,4,5... положили трубку, а они и не брали, ИД3 - активен разговор, ИД3 закончил разговор и, зачем-то, повтор об остальных, которые не взяли трубки, и это продублировано с 2х IP адресов МТС). Но это мое мнение и оно может быть не единственным.
Далее продолжу разговор о получении записей разговора. Сейчас у них технические работы. Ждем...