Share via


Call Automation을 사용하여 기존 통화에 Microsoft Teams 사용자 추가

이 빠른 시작에서는 Azure Communication Services 통화 자동화 API를 사용하여 Teams 사용자에 통화를 추가, 제거 및 전송합니다.

필수 조건

  • 활성 구독이 있는 Azure 계정.
  • 관리자 권한이 있는 Microsoft Teams 전화 라이선스 및 Teams 테넌트가 있어야 합니다. Teams 전화 라이선스는 이 기능을 사용하려면 필수이며 여기에서 Teams 라이선스에 대해 자세히 알아보세요. Microsoft Teams 사용자도 voice를 사용하도록 설정해야 합니다. 전화 시스템 설정을 참조하세요. 1단계의 뒷부분에서 설명한 Teams 사용자를 호출하도록 Communication Services 리소스에 권한을 부여하려면 관리 권한이 필요합니다.
  • Azure Portal의 왼쪽 메뉴에서 키를 선택하여 배포된 Communication Service 리소스 및 유효한 연결 문자열을 찾습니다.
  • Communication Service 리소스에서 PSTN 전화 번호를 가져옵니다. 이 빠른 시작에서 사용하기 위해 획득한 전화 번호를 기록해 둡니다.
  • IncomingCall 이벤트를 받을 Azure Event Grid 구독입니다.
  • 사용 중인 운영 체제에 맞는 최신 Azure Communication Service Call Automation API 라이브러리가 있어야 합니다.
  • 이 자습서를 따라 만든 Call Automation API 라이브러리를 구현하는 웹 서비스가 있어야 합니다.

1단계: Microsoft Teams 사용자에게 전화를 걸 수 있도록 Azure Communication Services 리소스 권한 부여

통화 자동화 API를 사용하여 전화를 걸 수 있도록 설정하려면 Microsoft Teams 관리자 또는 전역 관리자는 Communication Services 리소스가 테넌트에 액세스하여 통화할 수 있도록 명시적으로 허용해야 합니다.

Set-CsTeamsAcsFederationConfiguration(MicrosoftTeamsPowerShell)은 테넌트와 특정 Communication Services 리소스 간의 페더레이션을 사용하거나 사용하지 않도록 설정하는 테넌트 수준 설정입니다.

Set-CsExternalAccessPolicy(SkypeForBusiness)는 조직에 속한 사용자를 Communication Services 사용자와 페더레이션된 통신에 참여할 수 있도록 제어할 추가 권한을 관리자에게 허용하는 사용자 정책입니다.

Teams 사용자가 이 기능을 사용하려면 전화 라이선스가 필요합니다. 라이선스를 할당하려면 Set-CsPhoneNumberAssignment cmdlet을 사용하고 EnterpriseVoiceEnabled 매개 변수를 $true로 설정합니다. 자세한 내용은 조직에 Teams 전화 설정을 참조하세요.

2단계: Graph API를 사용하여 Teams 사용자의 Microsoft Entra 개체 ID를 가져오고 필요에 따라 현재 상태 검사

Communication Services 통화에서 Teams 사용자의 Microsoft Entra OID(개체 ID)를 추가하거나 전송하려면 해당 정보가 필요합니다. OID는 1) Office 포털, 2) Microsoft Entra 관리 센터, 3) Microsoft Entra Connect 또는 4) Graph API를 통해 검색할 수 있습니다. 아래 예제에서는 Graph API를 사용합니다.

Graph를 사용하여 사용자를 검색하려면 먼저 Microsoft Entra 관리자의 동의를 얻어야 합니다. 자세한 내용은 Microsoft Graph 보안 API 개요 문서를 참조하세요. 사용자 나열 API로 사용자를 검색하여 OID를 찾을 수 있습니다. 아래 예제는 표시 이름으로 검색하는 과정을 보여 주지만, 다른 속성도 검색할 수 있습니다.

Microsoft Graph v1.0을 사용하여 사용자 나열:

Request:
	https://graph.microsoft.com/v1.0/users?$search="displayName:Art Anderson"
Permissions:
	Application and delegated. Refer to documentation.
Response:
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users",
    "value": [
        {
            "displayName": "Art Anderson",
            "mail": "artanderson@contoso.com",
            "id": "fc4ccb5f-8046-4812-803f-6c344a5d1560"
        }

필요에 따라 현재 상태 가져오기 API 및 사용자의 ObjectId를 사용하여 사용자의 현재 상태를 검색할 수 있습니다. 자세히 알아보려면 Microsoft Graph v1.0 설명서를 참조하세요.

Request:
https://graph.microsoft.com/v1.0/users/fc4ccb5f-8046-4812-803f-6c344a5d1560/presence
Permissions:
Delegated only. Application not supported.  Refer to documentation.
Response:
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('fc4ccb5f-8046-4812-803f-6c344a5d1560')/presence/$entity",
    "id": "fc4ccb5f-8046-4812-803f-6c344a5d1560",
    "availability": "Offline",
    "activity": "Offline"

3단계: 통화 자동화 API로 제어하는 기존 Communication Services 통화에 Teams 사용자 추가

필수 구성 요소 단계를 완료하고 Communication Services 통화를 제어하는 웹 서비스 앱이 있어야 합니다. callConnection 개체를 사용하여 통화에 참가자를 추가합니다.

CallAutomationClient client = new CallAutomationClient('<Connection_String>');
AnswerCallResult answer = await client.AnswerCallAsync(incomingCallContext, new Uri('<Callback_URI>'));
await answer.Value.CallConnection.AddParticipantAsync(
    new CallInvite(new MicrosoftTeamsUserIdentifier('<Teams_User_Guid>'))
    {
        SourceDisplayName = "Jack (Contoso Tech Support)"
    });
CallAutomationClient client = new CallAutomationClientBuilder().connectionString("<resource_connection_string>").buildClient();
AnswerCallResult answer = client.answerCall(incomingCallContext, "<Callback_URI>"));
answer.getCallConnection().addParticipant(
    new CallInvite(new MicrosoftTeamsUserIdentifier("<Teams_User_Guid>"))
        .setSourceDisplayName("Jack (Contoso Tech Support)"));
const client = new CallAutomationClient("<resource_connection_string>");
const answer = await client.answerCall(incomingCallContext, "<Callback_URI>"));
answer.callConnection.addParticipant({
    targetParticipant: { microsoftTeamsUserId: "<Teams_User_Guid>" },
    sourceDisplayName: "Jack (Contoso Tech Support)"
});
call_automation_client = CallAutomationClient.from_connection_string("<resource_connection_string>")
answer = call_automation_client.answer_call(incoming_call_context = incoming_call_context, callback_url = "<Callback_URI>")
call_connection_client = call_automation_client.get_call_connection(answer.call_connection_id)
call_connection_client.add_participant(target_participant = CallInvite(
    target = MicrosoftTeamsUserIdentifier(user_id="<USER_ID>"),
    source_display_name = "Jack (Contoso Tech Support)"))

Microsoft Teams 데스크톱 클라이언트에서 Jack의 통화는 수신 전화 알림 메시지를 통해 Microsoft Teams 사용자에게 전송됩니다.

수신 전화 알림 메시지를 통해 Microsoft Teams 사용자에게 Jack의 통화가 전송되는 Microsoft Teams 데스크톱 클라이언트의 스크린샷.

Microsoft Teams 사용자가 통화를 수락하면 모든 참가자를 표시하는 Microsoft Teams 명단이 Microsoft Teams 사용자용 통화 중 환경에 표시됩니다. 통화 자동화 API를 사용하여 통화를 관리하는 애플리케이션은 Teams 사용자와 1:1 통화를 시작하는 경우를 제외하고 통화 화면에서 Teams 사용자에게 숨겨집니다.
전화를 수락하고 Microsoft Teams 사용자용 통화 중 환경에 들어간 Microsoft Teams 사용자의 스크린샷.

4단계: 통화 자동화 API로 제어하는 기존 Communication Services 통화에서 Teams 사용자 제거

await answer.Value.CallConnection.RemoveParticipantAsync(new MicrosoftTeamsUserIdentifier('<Teams_User_Guid>'));
answer.getCallConnection().removeParticipant(new MicrosoftTeamsUserIdentifier("<Teams_User_Guid>"));
answer.callConnection.removeParticipant({ microsoftTeamsUserId: "<Teams_User_Guid>" });
call_connection_client.remove_participant(target_participant = MicrosoftTeamsUserIdentifier(user_id="<USER_ID>"))

선택적 기능: 통화 자동화 API로 제어하는 기존 Communication Services 통화에서 Teams 사용자에게 통화 전환

await answer.Value.CallConnection.TransferCallToParticipantAsync(new MicrosoftTeamsUserIdentifier('<Teams_User_Guid>'));
answer.getCallConnection().transferCallToParticipant(new MicrosoftTeamsUserIdentifier("<Teams_User_Guid>"));
answer.callConnection.transferCallToParticipant({ microsoftTeamsUserId: "<Teams_User_Guid>" });
call_connection_client.transfer_call_to_participant(target_participant = MicrosoftTeamsUserIdentifier(user_id = "<USER_ID>"))

리소스 정리

Communication Services 구독을 정리하고 제거하려면 리소스 또는 리소스 그룹을 삭제하면 됩니다. 리소스 그룹을 삭제하면 해당 리소스 그룹에 연결된 다른 모든 리소스가 함께 삭제됩니다. 리소스 정리에 대해 자세히 알아보세요.

다음 단계