Поделиться через


Интеграция сторонних средств набора номера с аналитикой разговоров Dynamics 365 (предварительная версия)

[Данная статья посвящена предварительному выпуску и может быть изменена.]

Благодаря этой интеграции пользователи Dynamics 365 могут использовать средства набора номера, предоставляемые сторонними телефонными компаниями, такими как Twilio Flex, для совершения и приема телефонных звонков в Dynamics 365, а также для получения аналитических данных, созданных искусственным интеллектом в режиме реального времени, и подробного анализа своих звонков после их завершения. Узнайте больше об аналитике разговоров Dynamics 365

Внимание

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

Как работает интеграция

На высоком уровне интеграция состоит из трех частей:

  1. Регистрация поставщика: зарегистрируйте сведения о поставщике и получите список пользователей для записи с помощью API-интерфейса аналитики разговоров.

  2. Разветвление мультимедиа: разветвление аудиопотока на устройства записи аналитики разговоров с использованием протокола SIPREC.

  3. Отправка событий в реальном времени: чтобы включить расшифровку в режиме реального времени и аналитику звонков, отправляйте события пользовательского интерфейса из пользовательского интерфейса клиента поставщика в аналитику разговоров Dynamics 365.

Пример интеграции между аналитикой разговоров Dynamics 365 и сторонним поставщиком услуг телефонии, Twilio Flex, см. в разделе Интеграция Twilio Flex с аналитикой раговоров Dynamics 365.

На следующей диаграмме показано, как работает интеграция:

Диаграмма, показывающая поток интеграции

Шаг 1. Регистрация поставщика

  1. Создание приложения Microsoft Entra ID.

  2. Добавьте разрешение API для записи мультимедиа:

    1. В приложении Microsoft Entra ID, которое вы создали, перейдите к пункту Разрешения API.

    2. Выберите Добавить разрешение.

    3. В разделе Используемые в моей организации API найдите пункт Запись мультимедиа для Dynamics 365 Sales и выберите его: Снимок экрана параметра записи мультимедиа

    4. Добавьте разрешение Users.Read.All и выберите Добавить разрешение

    Заметка

    Убедитесь, что вы получили согласие администратора на разрешение вызывать API аналитики разговоров в контексте приложения. Узнайте больше о разрешениях и согласии.

  3. Получите токен для запуска API-интерфейсов аналитики разговоров с помощью приложения, созданного в предыдущем разделе:

    curl -X POST -H 'Content-Type: application/x-www-form-urlencoded' https://login.microsoftonline.com/<tenant-id>/oauth2/v2.0/token -d 'client_id=<your app id>' -d 'grant_type=client_credentials' -d 'scope=00001111-aaaa-2222-bbbb-3333cccc4444/.default' -d 'client_secret=<your app secret>'

    Параметр scope указывает идентификатор приложения Аналитика разговоров. Не меняйте этот значение.

    Дополнительные сведения о команде curl см. в разделе Получение токенов Microsoft Entra ID для субъектов-служб.

  4. Вызовите следующий API аналитики разговоров, чтобы зарегистрировать стороннего поставщика услуг:
    POST /api/v1.0/providers/tenants

    Укажите следующие параметры в текст запроса:

    • orgID: укажите идентификатор организации Dynamics 365.

    • Тип: укажите "пользовательский" для сторонних номеронабирателей.

    • хостинг: укажите тип хостинга поставщика услуг телефонии. Например, «облако» или «локальный».

    • AccountId: укажите идентификатор учетной записи поставщика услуг телефонии.

    • CerfificateSubjectName и CertificateIssuer: укажите детали сертификата поставщика услуг телефонии.

    • SourceIPNetwork: укажите IP-адрес клиента SIPREC. Укажите «0.0.0.0», если вы не хотите ограничивать IP-адрес.
      Следующий фрагмент кода является примером текста запроса:

      
      {
         "orgId": "ad3dca46-962a-4895-9f85-d25f3828781f",
         "Type": "custom",
         "hosting": "cloud",
         "displayName": "Test Custom Provider",
         "AuthenticationDetails": 
         {
             "AccountId":"adxxxxx-xxxx-xxxx-xxxx-xxxxxxxx",
             "CertificateSubjectName": "certSubject",
             "CertificateIssuer": "issuer",
             "SourceIPNetwork": "0.0.0.0"
         }
      }
      

    Дополнительные сведения об этом API-интерфейсе см. в документации по Swagger.

  5. Вызовите следующий API аналитики разговоров, чтобы получить список пользователей для записи:
    GET /api/v1.0/providers/users

После того как администратор Dynamics 365 Sales создаст политику записи, поставщик может использовать эту конечную точку для фильтрации мультимедиа, которые будут разветвлены на устройства записи аналитики разговоров.

Шаг 2. Разветвление мультимедиа (интеграция с SIPREC)

Устройства записи аналитики разговоров реализуют стандартный протокол SIPREC.

Связь защищена с помощью протоколов SIPS (порт 5061) и SRTP. Аутентификация осуществляется с помощью mTLS в соединении для сообщений SIPS и основана на сертификате, предоставленном API. Это означает, что поставщик должен быть зарегистрирован, чтобы клиент мог установить соединение SIPS.

На следующем снимке экрана показан обмен данными между клиентом SIPREC и сервером SIPREC:

Снимок экрана примера обмен данными между клиентом SIPREC и сервером SIPREC.

Для аналитики разговоров требуются следующие метаданные:

Заголовки:

Имя заголовка Описание Пример значения
Call-ID Уникальный идентификатор звонка. Этот идентификатор используется для корреляции сигналов SIP и действий пользователя, таких как запуск/остановка записи. efxxxxxxxxxxxxx
X-AccountId Уникальный идентификатор организации, к которой принадлежит вызов. Этот идентификатор используется для аутентификации и авторизации. Это тот же идентификатор организации, зарегистрированный в API для клиента. ACxxxxxxxxxxxxxxxxxxxxxxx

Метаданные

Имя ключа метаданных Описание Пример значения
Роль Указывает, является ли это входящим или исходящим звонком для продавца. ["inbound", "outbound"]
CallerDisplayName Отображаемое имя вызывающего абонента. Если недоступно, отображается номер телефона. Кенни Смит
CalleeDisplayName Отображаемое имя получателя. Если недоступно, отображается номер телефона. Алекс Бейкер

Вот примеры сообщений приглашения и прощания с необходимыми заголовками и метаданными:

Сообщение INVITE:

INVITE sip:SRS@media.recording.dynamics.com:5061;transport=tls SIP/2.0 
Via: SIP/2.0/TLS 84.172.x.x:5061;branch=z9hG4bK4fa2.cdabfe83d76d3c41987802096d3b342a.0;received=172.16.x.x;rport=40334 
Via: SIP/2.0/UDP 172.25.x.x:5060;rport=5060;branch=z9hG4bK917ce574-0345-4c3d-9b63-d98c2c57dbe6_c3356d0b_599-10236398515455707148 
To: <sip:SRS@media.recording.dynamics.com:5061;transport=tls> 
From: <sip:SRC@sip.provider.com>;tag=66790678_c3356d0b_917ce574-0345-4c3d-9b63-d98c2c57dbe6 
Call-ID: efab0870bc597cb3fb56010921e2f57f 
CSeq: 1 INVITE 
Contact: <sip:SRC@172.25.x.x:5060;transport=udp>;+sip.src 
Max-Forwards: 67 
Record-Route: <sip:84.172.x.x:5061;transport=tls;r2=on;lr>,<sip:84.172.x.x;r2=on;lr> 
User-Agent: provider Gateway 
Allow: INVITE,ACK,CANCEL,OPTIONS,BYE,REFER,NOTIFY 
Require: siprec 
Content-Length: 3194 
Content-Type: multipart/mixed;boundary=\"----=_Part_1253_283419664.1674116473425\" 
Min-SE: 35 
X-AccountId: ACxxxxxxxxxxxxxxxxxxxx 
------=_Part_1253_283419664.1674116473425 

Content-Type: application/sdp 
v=0 
o=root 1176539620 1176539620 IN IP4 172.18.x.x 
s=provider Media Gateway 
c=IN IP4 84.172.x.x 
t=0 0 
m=audio 15352 RTP/SAVP 0 8 101 
a=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:<Encryption_key>
a=rtpmap:0 PCMU/8000 
a=rtpmap:8 PCMA/8000 
a=rtpmap:101 telephone-event/8000 
a=fmtp:101 0-16 
a=ptime:20 
a=maxptime:20 
a=sendonly 
a=label:inbound 
m=audio 16022 RTP/SAVP 0 8 101 
a=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:<Encryption_key> 
a=rtpmap:0 PCMU/8000 
a=rtpmap:8 PCMA/8000 
a=rtpmap:101 telephone-event/8000 
a=fmtp:101 0-16 
a=ptime:20 
a=maxptime:20 
a=sendonly 
a=label:outbound 
------=_Part_1253_283419664.1674116473425 

Content-Type: application/rs-metadata+xml 
Content-Disposition: recording-session 
<?xml version=\"1.0\" encoding=\"UTF-8\"?> 
<recording xmlns='urn:ietf:params:xml:ns:recording:1'> 
    <datamode>complete</datamode> 
    <session session_id=\"Wd/putWgTWCW2z1lI5Db9w==\"> 
            <ExtensionParameters  xmlns=\"http://provider.com/siprec\"> 
                    <Parameter name=\"Role\" value=\"inbound\"/> 
                    <Parameter name=\"CallerDisplayName\" value=\"Kiana Anderson\"/> 
                    <Parameter name=\"CalleeDisplayName\" value=\"Tomas Richardson\"/> 
            </ExtensionParameters> 
    </session> 
        <participant participant_id=\"bXCloPcETS6P/kfeeJtiow==\"> 
            <nameID aor=\"EE5C7EF0\"/> 
        </participant> 
        <participant participant_id=\"3nPi8XzBSzWrtSLlkU8Gjw==\"> 
            <nameID aor=\"230908\"/> 
        </participant> 
        <stream stream_id=\"9xff8FcdRUaJCSTxWFbV9g==\" session_id=\"Wd/putWgTWCW2z1lI5Db9w==\"><label>inbound</label></stream> 
        <stream stream_id=\"f/Qezx4jTMqiWSB1vW7oJA==\" session_id=\"Wd/putWgTWCW2z1lI5Db9w==\"><label>outbound</label></stream> 
    <sessionrecordingassoc session_id=\"Wd/putWgTWCW2z1lI5Db9w==\"> 
        <associate-time>2023-01-19T08:21:13.382512Z</associate-time> 
    </sessionrecordingassoc> 
        <participantsessionassoc participant_id=\"bXCloPcETS6P/kfeeJtiow==\" session_id=\"Wd/putWgTWCW2z1lI5Db9w==\"> 
            <associate-time>2023-01-19T08:21:13.382512Z</associate-time> 
        </participantsessionassoc> 
        <participantsessionassoc participant_id=\"3nPi8XzBSzWrtSLlkU8Gjw==\" session_id=\"Wd/putWgTWCW2z1lI5Db9w==\"> 
            <associate-time>2023-01-19T08:21:13.382512Z</associate-time> 
        </participantsessionassoc> 
        <participantstreamassoc participant_id=\"bXCloPcETS6P/kfeeJtiow==\"> 
                <send>9xff8FcdRUaJCSTxWFbV9g==</send> 
                <recv>f/Qezx4jTMqiWSB1vW7oJA==</recv> 
        </participantstreamassoc> 
        <participantstreamassoc participant_id=\"3nPi8XzBSzWrtSLlkU8Gjw==\"> 
                <send>f/Qezx4jTMqiWSB1vW7oJA==</send> 
                <recv>9xff8FcdRUaJCSTxWFbV9g==</recv> 
        </participantstreamassoc> 
</recording> 
------=_Part_1253_283419664.1674116473425--

Сообщение BYE:

BYE sip:SRS@media.recording.dynamics.com:5061;transport=tls SIP/2.0 
Via: SIP/2.0/TLS 84.172.x.x:5061;branch=z9hG4bK1fa2.d03c36b567136fcfae84281e926cda62.0;received=172.16.x.x;rport=40334 
Via: SIP/2.0/UDP 172.25.x.x:5060;rport=5060;received=84.144.x.x;branch=z9hG4bK917ce574-0345-4c3d-9b63-d98c2c57dbe6_c3356d0b_600-2513288074170844985 
To: <sip:SRS@media.recording.dynamics.com:5061;transport=tls>;tag=OXFWHPJQTL 
From: <sip:SRC@sip.provider.com>;tag=66790678_c3356d0b_917ce574-0345-4c3d-9b63-d98c2c57dbe6 
Call-ID: efab0870bc597cb3fb56010921e2f57f 
CSeq: 2 BYE 
Max-Forwards: 68 
User-Agent: provider Gateway 
Require: siprec 
Content-Length: 901 
Content-Type: multipart/mixed;boundary=\"----=_Part_29418_1017575873.1674116842924\" 
X-AccountId: ACxxxxxxxxxxxxx 

Поддерживаемые конечные точки и регионы устройства записи

В следующей таблице перечислены поддерживаемые конечные точки устройства записи и их регионы. Вы можете настроить устройства записи, которые хотите использовать, в настройках вашего поставщика услуг телефонии. Чтобы узнать, как это делается для Twilio Flex, см. Шаг 2. Установка соединителя SIPREC и маршрутизация вызовов в Dynamics 365.

Конечная точка Область/регион
media.recording.dynamics.com Глобальный (ближайший регион)
southeastasia.media.recording.dynamics.com Юго-Восточная Азия
australiaeast.media.recording.dynamics.com Австралия
sam.media.recording.dynamics.com Южная Америка
canadacentral.media.recording.dynamics.com Канада
switzerlandnorth.media.recording.dynamics.com Швейцария
eastus.media.recording.dynamics.com US
francecentral.media.recording.dynamics.com Франция
centralindia.media.recording.dynamics.com Индия
japaneast.media.recording.dynamics.com Япония
uae.media.recording.dynamics.com UAE
uksouth.media.recording.dynamics.com Соединенное Королевство
westeurope.media.recording.dynamics.com Западная Европа
zaf.media.recording.dynamics.com Южная Африка

Шаг 3. Отправка событий в реальном времени (интеграция клиента номеронабирателя)

Чтобы аналитика разговоров обеспечивала расшифровку и анализ в режиме реального времени, сторонний номеронабиратель может использовать два события для уведомления о начале или завершении вызова.

  • Событие "Начало звонка": когда приложение аналитики разговоров получает событие "Начало звонка", в нем отображается кнопка записи, расшифровка и аналитика в реальном времени.

  • Событие "Звонок завершен": когда приложение аналитики разговоров получает событие "Звонок завершен", оно подводит итоги звонка и показывает кнопку Полная сводка, чтобы получить сводку вызова и аналитику, созданные ИИ.

Для отправки событий используйте API raiseEvent в инфраструктуре интеграции каналов Dynamics 365 (CIF).

Вот пример фрагмента кода для отправки событий:

export interface CallStartedEvent { 
  callId: string; 
  startTime: Date; 
  isIncomingCall: boolean; 
  contactNumber: string; 
  contactName: string; 
} 

export interface CallEndedEvent { 
  callId: string; 
  callDurationInSeconds: number; 
  callTerminationReason: string; // ['success', 'error'] 
  callEndTime: Date; 
  isCallStarted: boolean; 
} 

dialer.Actions.addListener('onCallStarted', (payload: any) => { 
  const callStartedEvent : CallStartedEvent = { 
    callId: payload.call_sid, 
    startTime: new Date(), 
    isIncomingCall: payload.attributes.is_incoming_call, 
    contactName: payload.attributes.caller_name, 
    contactNumber: payload.attributes.caller_phone_number 
  }; 

  // @ts-ignore 
  Microsoft.CIFramework.raiseEvent('WIDGET_CALL_STARTED', callStartedEvent); 
}); 

dialer.Actions.addListener('onCallEnded', (payload: any) => { 
  const callEndedEvent : CallEndedEvent = { 
    callId: payload.call_sid, 
    callEndTime: new Date(), 
    callTerminationReason: 'success', 
    isCallStarted: true, 
    callDurationInSeconds: payload.attributes.call_length 
  }; 

  // @ts-ignore 
  Microsoft.CIFramework.raiseEvent('WIDGET_CALL_ENDED', callEndedEvent); 
});

Тестирование интеграции

После регистрации нового поставщика в клиенте и настройки разветвления SIPREC и событий номеронабирателя клиента вы можете протестировать интеграцию, создав новую политику записи с новым поставщиком.

  1. Войдите как системный администратор в приложение "Центр продаж".

  2. В области "Изменить" выберите Параметры Sales Insights.

  3. Перейдите в раздел Глобальные параметры>Аналитика разговоров. В разделе «Поставщики звонков» вы увидите стороннего поставщика, которого вы зарегистрировали.

  4. Создайте политику записи для нового поставщика. Дополнительные сведения см. в разделе Настройка Microsoft Teams для аналитики разговоров

Следующий снимок экрана является примером политики записи для Twilio.

Снимок экрана политики записи для Twilio

Теперь вызовите пользователя, входящего в состав выбранной роли безопасности (в нашем примере политика включена для всех ролей безопасности).

Когда Dynamics 365 получает событие callStarted от номеронабирателя, у вас будет возможность начать запись:

Снимок экрана уведомления для записи звонков

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

Просмотр и понимание страницы сводки звонка