Интеграция сторонних средств набора номера с аналитикой разговоров Dynamics 365 (предварительная версия)
[Данная статья посвящена предварительному выпуску и может быть изменена.]
Благодаря этой интеграции пользователи Dynamics 365 могут использовать средства набора номера, предоставляемые сторонними телефонными компаниями, такими как Twilio Flex, для совершения и приема телефонных звонков в Dynamics 365, а также для получения аналитических данных, созданных искусственным интеллектом в режиме реального времени, и подробного анализа своих звонков после их завершения. Узнайте больше об аналитике разговоров Dynamics 365
Внимание
- Это предварительная версия функции.
- Предварительные версии функций не предназначены для использования в производственной среде, а их функциональность может быть ограничена. Для этих функций действуют дополнительные условия использования и они доступны перед официальным выпуском, чтобы клиенты могли досрочно получить доступ и предоставить отзывы.
Как работает интеграция
На высоком уровне интеграция состоит из трех частей:
Регистрация поставщика: зарегистрируйте сведения о поставщике и получите список пользователей для записи с помощью API-интерфейса аналитики разговоров.
Разветвление мультимедиа: разветвление аудиопотока на устройства записи аналитики разговоров с использованием протокола SIPREC.
Отправка событий в реальном времени: чтобы включить расшифровку в режиме реального времени и аналитику звонков, отправляйте события пользовательского интерфейса из пользовательского интерфейса клиента поставщика в аналитику разговоров Dynamics 365.
Пример интеграции между аналитикой разговоров Dynamics 365 и сторонним поставщиком услуг телефонии, Twilio Flex, см. в разделе Интеграция Twilio Flex с аналитикой раговоров Dynamics 365.
На следующей диаграмме показано, как работает интеграция:
Шаг 1. Регистрация поставщика
Добавьте разрешение API для записи мультимедиа:
В приложении Microsoft Entra ID, которое вы создали, перейдите к пункту Разрешения API.
Выберите Добавить разрешение.
В разделе Используемые в моей организации API найдите пункт Запись мультимедиа для Dynamics 365 Sales и выберите его:
Добавьте разрешение Users.Read.All и выберите Добавить разрешение
Заметка
Убедитесь, что вы получили согласие администратора на разрешение вызывать API аналитики разговоров в контексте приложения. Узнайте больше о разрешениях и согласии.
Получите токен для запуска 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 для субъектов-служб.
Вызовите следующий 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.
Вызовите следующий API аналитики разговоров, чтобы получить список пользователей для записи:
GET /api/v1.0/providers/users
После того как администратор Dynamics 365 Sales создаст политику записи, поставщик может использовать эту конечную точку для фильтрации мультимедиа, которые будут разветвлены на устройства записи аналитики разговоров.
Шаг 2. Разветвление мультимедиа (интеграция с SIPREC)
Устройства записи аналитики разговоров реализуют стандартный протокол SIPREC.
Связь защищена с помощью протоколов SIPS (порт 5061) и SRTP. Аутентификация осуществляется с помощью mTLS в соединении для сообщений SIPS и основана на сертификате, предоставленном API. Это означает, что поставщик должен быть зарегистрирован, чтобы клиент мог установить соединение SIPS.
На следующем снимке экрана показан обмен данными между клиентом 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 и событий номеронабирателя клиента вы можете протестировать интеграцию, создав новую политику записи с новым поставщиком.
Войдите как системный администратор в приложение "Центр продаж".
В области "Изменить" выберите Параметры Sales Insights.
Перейдите в раздел Глобальные параметры>Аналитика разговоров. В разделе «Поставщики звонков» вы увидите стороннего поставщика, которого вы зарегистрировали.
Создайте политику записи для нового поставщика. Дополнительные сведения см. в разделе Настройка Microsoft Teams для аналитики разговоров
Следующий снимок экрана является примером политики записи для Twilio.
Теперь вызовите пользователя, входящего в состав выбранной роли безопасности (в нашем примере политика включена для всех ролей безопасности).
Когда Dynamics 365 получает событие callStarted от номеронабирателя, у вас будет возможность начать запись:
Выбрав Запись, вы сможете увидеть расшифровку в реальном времени во время звонка, а также полную сводку и аналитику звонка после завершения звонка.