將 Azure 通訊服務 的電話通話功能整合到自定義企業營運 (LOB) 應用程式中,為企業及其使用者提供數個主要優點:
- 從 LOB 應用程式內直接啟用員工、客戶和合作夥伴之間的順暢且即時的通訊,而不需要在多個平臺或裝置之間切換。
- 增強用戶體驗並提升整體作業效率。
- 協助快速解決問題,因為使用者可以快速且輕鬆地與相關的支援小組或主題專家聯繫。
在本練習中,您將會:
- 探索應用程式中的通話功能。
- 逐步解說程序代碼,以瞭解如何建置通話功能。
使用通話功能
在上一個 練習 中,您已建立 Azure 通訊服務 (ACS) 資源,並啟動資料庫、Web 伺服器和 API 伺服器。 您也會更新 .env 檔案中的下列值。
ACS_CONNECTION_STRING=<ACS_CONNECTION_STRING> ACS_PHONE_NUMBER=<ACS_PHONE_NUMBER> ACS_EMAIL_ADDRESS=<ACS_EMAIL_ADDRESS> CUSTOMER_EMAIL_ADDRESS=<EMAIL_ADDRESS_TO_SEND_EMAIL_TO> CUSTOMER_PHONE_NUMBER=<UNITED_STATES_BASED_NUMBER_TO_SEND_SMS_TO>請確定您已完成先前的 練習 ,再繼續進行。
返回瀏覽器 (http://localhost:4200),找出 datagrid,然後選取 [ 連絡客戶 ],然後選取第一個數據列中的 [撥打客戶 ]。
通話元件將會新增至標頭。 輸入您想要撥打的電話號碼(確定其開頭為 + 並包含國家/地區代碼),然後選取 [ 通話]。 系統會提示您允許存取麥克風。
選取 [停止回應] 以結束通話。 選取 [關閉 ] 以關閉通話元件。
探索通話碼
小提示
如果您使用 Visual Studio Code,您可以選取下列專案來直接開啟檔案:
- Windows/Linux: Ctrl + P
- Mac: Cmd + P
然後輸入您要開啟的檔案名。
開啟 customers-list.component.ts 檔案。 檔案的完整路徑是 client/src/app/customers-list/customers-list.component.ts。
請注意,
openCallDialog()使用事件總線傳送CustomerCall訊息和客戶電話號碼。openCallDialog(data: Phone) { this.eventBus.emit({ name: Events.CustomerCall, value: data }); }備註
如果您想要進 一步 探索事件總線程式代碼,可以在eventbus.service.ts檔案中找到。 檔案的完整路徑是 client/src/app/core/eventbus.service.ts。
標頭元件的函
ngOnInit()式會CustomerCall訂閱事件總線所傳送的事件,並顯示通話元件。 您可以在 header.component.ts 中找到此程式碼。ngOnInit() { this.subscription.add( this.eventBus.on(Events.CustomerCall, (data: Phone) => { this.callVisible = true; // Show phone call component this.callData = data; // Set phone number to call }) ); }開啟 phone-call.component.ts。 花點時間來闡述程序代碼。 檔案的完整路徑為 client/src/app/phone-call/phone-call.component.ts。 請注意下列主要功能:
- 在 中
acsService.getAcsToken()呼叫ngOnInit()函式,以擷取 Azure 通訊服務 存取令牌。 - 將「電話撥號程式」新增至頁面。 您可以按下標頭中的電話號碼輸入來查看撥號程式。
- 分別使用
startCall()和函式啟動和endCall()結束呼叫。
- 在 中
在查看撥打電話的程序代碼之前,讓我們先檢查如何擷取 ACS 存取令牌,以及如何建立通話物件。 在 phone-call.component.ts
ngOnInit()找出 函式。async ngOnInit() { if (ACS_CONNECTION_STRING) { this.subscription.add( this.acsService.getAcsToken().subscribe(async (user: AcsUser) => { const callClient = new CallClient(); const tokenCredential = new AzureCommunicationTokenCredential(user.token); this.callAgent = await callClient.createCallAgent(tokenCredential); }) ); } }此函式會執行下列動作:
- 藉由呼叫
acsService.getAcsToken()函式來擷取 ACS userId 和存取令牌。 - 擷取存取令牌之後,程式代碼會執行下列動作:
- 建立的新實例
CallClient,並使用AzureCommunicationTokenCredential存取令牌。 - 使用
CallAgent和CallClient物件建立 的新實例AzureCommunicationTokenCredential。 稍後您會看到CallAgent用來啟動和結束通話。
- 建立的新實例
- 藉由呼叫
開啟 acs.services.ts 並找出 函
getAcsToken()式。 檔案的完整路徑是 client/src/app/core/acs.service.ts。 函式會對 API 伺服器公開的路由提出 HTTP GET 要求/acstoken。getAcsToken(): Observable<AcsUser> { return this.http.get<AcsUser>(this.apiUrl + 'acstoken') .pipe( catchError(this.handleError) ); }名為
createACSToken()的 API 伺服器函式會擷取 userId 和存取令牌,並將它傳回給用戶端。 您可以在 伺服器/typescript/acs.ts 檔案中找到。import { CommunicationIdentityClient } from '@azure/communication-identity'; const connectionString = process.env.ACS_CONNECTION_STRING as string; async function createACSToken() { if (!connectionString) return { userId: '', token: '' }; const tokenClient = new CommunicationIdentityClient(connectionString); const { user, token } = await tokenClient.createUserAndToken(["voip"]); return { userId: user.communicationUserId, token }; }此函式會執行下列動作:
- 檢查 ACS
connectionString值是否可用。 如果沒有,則傳回具有空白userId和token的物件。 - 建立 的新實例
CommunicationIdentityClient,並將值傳遞給connectionString它。 - 使用
tokenClient.createUserAndToken()搭配 「voip」 範圍建立新的使用者和令牌。 - 傳回包含
userId和token值的物件。
- 檢查 ACS
既然您已瞭解如何擷取 userId 和令牌,請返回並
phone-call.component.ts找出函式startCall()。在通話元件中選取 [通話 ] 時,會呼叫此函式。 它會使用
CallAgent稍早所述的 對象來啟動呼叫。 函callAgent.startCall()式會接受 物件,此物件表示要呼叫的號碼,以及用來撥打電話的 ACS 電話號碼。startCall() { this.call = this.callAgent?.startCall( [{ phoneNumber: this.customerPhoneNumber }], { alternateCallerId: { phoneNumber: this.fromNumber } }); console.log('Calling: ', this.customerPhoneNumber); console.log('Call id: ', this.call?.id); this.inCall = true; // Adding event handlers to monitor call state this.call?.on('stateChanged', () => { console.log('Call state changed: ', this.call?.state); if (this.call?.state === 'Disconnected') { console.log('Call ended. Reason: ', this.call.callEndReason); this.inCall = false; } }); }在通話元件中選取 [掛斷]
endCall(),會呼叫 函式。endCall() { if (this.call) { this.call.hangUp({ forEveryone: true }); this.call = undefined; this.inCall = false; } else { this.hangup.emit(); } }如果呼叫正在進行中,則會
call.hangUp()呼叫 函式以結束呼叫。 如果沒有任何通話進行中,事件hangup就會發出至標頭父元件,以隱藏通話元件。繼續進行下一個練習之前,讓我們先檢閱本練習中涵蓋的重要概念:
- ACS userId 和存取令牌是使用
acsService.createUserAndToken()函式從 API 伺服器擷取。 - 令牌是用來建立
CallClient和CallAgent物件。 - 對像是
CallAgent用來分別呼叫callAgent.startCall()和callAgent.hangUp()函式來啟動和結束呼叫。
- ACS userId 和存取令牌是使用
既然您已瞭解如何將通話整合到應用程式中,讓我們將焦點切換為使用 Azure 通訊服務 傳送電子郵件和簡訊。