...

Интеграция с IP-телефонией

Тема в разделе "Примеры решений и дополнительных модулей", создана пользователем cheremisinova, 29 мар 2022.

  1. cheremisinova

    cheremisinova Новичок

    Пошагово процесс создания модуля интеграции с IP-телефонией с примером описан в справке: https://elma365.com/ru/help/ip-tel-integration.html

    Если кратко, то в модуле интеграции с IP-телефонией обязательно должны быть реализованы 5 функций:

    async function VoipTestConnection(): Promise<VoipTestConnectionResult>
    async function VoipParseWebhookRequest(request: FetchRequest): Promise<VoipWebhookParseResult
    async function VoipGetMembers(): Promise<VoipMember[]>
    async function VoipGenerateCall(srcPhone: string, dstPhone: string): Promise<void>
    async function VoipGetCallLink(callData: any): Promise<string>

    При этом на форме настроек модуля появится дополнительная форма Настроек телефонии.

    [​IMG]

    Реализация функций зависит от API виртуальной АТС, но есть общие моменты для любого провайдера:

    VoipTestConnection() вызывается при нажатии кнопки «Проверить соединение». В ней делается любой запрос к API ВАТС и в формате VoipTestConnectionResult возвращается либо успешный ответ, либо ошибка.

    VoipGetMembers() вызывается при нажатии кнопки «Настроить». Здесь начитываются пользователи ВАТС для таблицы сопоставлений пользователя ВАТС с пользователем ELMA365. При звонке значение из поля id возвращаемой структуры VoipMember будет сопоставляться с dstPhone из объекта VoipWebhookParseResult, возвращенного из VoipParseWebhookRequest(), поэтому они должны содержать одинаковое свойство пользователя ВАТС.

    VoipParseWebhookRequest(request: FetchRequest) обрабатывает запросы, пришедшие на Webhook URL. Обычно там находится switch-case, разбирающий данные от ВАТС в объект VoipWebhookParseResult:

    {
    event: event, // данные о этапе звонка, номер звонящего и ответившего пользователя и т.д.
    callRecord: callRecord, // данные для записи в историю звонков в карточке контакта
    response: response, // ответ ВАТС
    }


    VoipGenerateCall(srcPhone: string, dstPhone: string) вызывается при совершении звонка из интерфейса ELMA365. При этом после получения команды ВАТС сначала сгенерирует звонок на номер звонящего srcPhone, а после его ответа вызов начнет идти у вызываемого абонента dstPhone.

    VoipGetCallLink() вызывается из карточки контакта при проигрывании записи и должен возвращать прямую ссылку на запись.

    Была добавлена еще одна функция VoipOnWebhookUpdated(webhookUrl: string): Promise<void> для получения вебхука из скриптов модуля. В аргументе webhookUrl передается полная ссылка на вебхук в таком же виде, как она отображается на странице модуля в разделе «Настройка телефонии». Эта функция является необязательной к реализации. Функция вызывается после обновления настроек телефонии (по нажатию на кнопку «Сохранить») или когда модуль впервые инициализируется (при публикации скриптов в случае если реализован контракт телефонии).

    Если надо сохранить вебхук для дальнейшего использования, можно использовать storage: Namespace.storage.setItem(...).

    async function VoipOnWebhookUpdated(webhookUrl: string): Promise<void> {
    Namespace.storage.setItem("webhookUrl_mango", webhookUrl);
    }


    Настройка софтфонов для тестирования звонков.
    Я для тестирования использовала 3CX Phone 6 и X-Lite 3.0. Интерфейс добавления аккаунта у них примерно одинаковый: заполняются Номер/ID пользователя, пароль, домен, если есть – прокси сервер. После этого можно совершать звонки по внутреннему номеру в ВАТС.

    [​IMG]
  2. kurbatov-la

    kurbatov-la Активный участник

    Не видны вложения картинки