שלב חייגנים של צד שלישי עם בינת שיחות של Dynamics 365 (Preview)
[מאמר זה הוא תיעוד קדם-הפצה והוא עשוי להשתנות.]
באמצעות שילוב זה, משתמשי Dynamics 365 יכולים להשתמש בחייגנים המסופקים על ידי חברות טלפוניה של צד שלישי כגון Twilio Flex, כדי לבצע ולקבל שיחות טלפון ב- Dynamics 365, ולקבל תובנות של AI בזמן אמת וניתוח עשיר לאחר השיחה של השיחות שלהם. קבל מידע נוסף על 'בינת שיחות' של Dynamics 365
חשוב
- זוהי תכונת Preview.
- תכונות Preview אינן מיועדות לשימוש בייצור וייתכן שיש להן פונקציונליות מוגבלת. תכונות אלה כפופות לתנאי השימוש המשלימים והן זמינות לפני הפצה רשמית, כך שהלקוחות יכולים לקבל גישה מוקדמת ולספק משוב.
כיצד פועל השילוב
ברמה גבוהה, האינטגרציה מורכבת משלושה חלקים:
רשום את הספק: רשום את פרטי הספק וקבל את רשימת המשתמשים להקלטה באמצעות ממשק ה- 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=f448d7e5-e313-4f90-a3eb-5dbb3277e4b3/.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:
המטה-נתונים הבאים נדרשים עבור בינת שיחות:
כותרות:
שם כותרת | תיאור | ערך לדוגמה |
---|---|---|
מזהה שיחה | המזהה הייחודי של השיחה. המזהה משמש להתאמה בין אותות SIP ופעולות משתמש כגון התחלה/עצירה של הקלטה. | efxxxxxxxxxxxxxx |
X-AccountId | המזהה הייחודי של תיק הלקוח אליו שייך השיחה. המזהה משמש לאימות והרשאה. זהו אותו מזהה תיק לקוח הרשום ב- API עבור הדייר. | ACxxxxxxxxxxxxxxxxxxxxxxxx |
מטה-נתונים
שם מפתח של מטה-נתונים | תיאור | ערך לדוגמה |
---|---|---|
תפקיד | מציין אם מדובר בשיחה נכנסת או יוצאת עבור המוכר. | ["נכנסת", "יוצאת"] |
CallerDisplayName | שם תצוגה של המתקשר. אם השם לא זמין, מספר הטלפון יוצג. | קני סמית |
CalleeDisplayName | שם תצוגה של הנמען. אם השם לא זמין, מספר הטלפון יוצג. | אלכס בייקר |
להלן דוגמאות להודעות הזמנה והודעות פרידה עם הכותרות והמטה-נתונים הנדרשים:
הודעת הזמנה:
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 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 | בארה"ב |
francecentral.media.recording.dynamics.com | צרפת |
centralindia.media.recording.dynamics.com | הודו |
japaneast.media.recording.dynamics.com | יפן |
uae.media.recording.dynamics.com | איחוד האמירויות הערביות |
uksouth.media.recording.dynamics.com | בריטניה |
westeurope.media.recording.dynamics.com | מערב אירופה |
zaf.media.recording.dynamics.com | דרום אפריקה |
שלב 3: שלח אירועים בזמן אמת (שילוב הלקוח של חייגן)
כדי לאפשר לבינת שיחות לספק תמלול ותובנות בזמן אמת, חייגן הצד השלישי יכול להשתמש בשני אירועים כדי להודיע מתי שיחה מתחילה או מסתיימת.
אירוע התחילה שיחה: כאשר בינת שיחות מקבל את אירוע "התחלת שיחה", הוא יציג את לחצן ההקלטה ואת התמלול והתובנות בזמן אמת.
אירוע השיחה הסתיימה: כאשר בינת שיחות מקבל את אירוע "השיחה הסתיימה", הוא יסיים את השיחה ויציג את הלחצן סיכום מלא לקבלת סיכום השיחה שנוצרה על ידי בינה מלאכותית ואת התובנות.
כדי לשלוח את האירועים, השתמש ב- API raiseEvent בתוך Dynamics 365 Channel Integration Framework (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 מהחייגן, תהיה לך אפשרות להתחיל את ההקלטה:
לאחר בחירה בהקלט, תוכל לראות את התמלול בזמן אמת במהלך השיחה וסיכום מלא ותובנות שיחה בסיום השיחה.