你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
Azure 通信服务对 Teams 标识的支持 - 用例
Microsoft Teams 提供由 Microsoft Entra ID 管理的标识,以及由 Teams 管理员 中心和策略控制的通话体验。 用户可能已分配许可证来启用 Microsoft Teams Phone 的电话呼叫和高级呼叫功能。 Azure 通信服务对 Teams 标识的支持允许管理 Teams IP 语音通话 (VoIP) 呼叫、Teams 电话呼叫和加入 Teams 会议。 开发人员可以使用图形 API 来扩展 Azure 通信服务,以提供来自 Microsoft 365 生态系统的上下文数据。 本页提供有关如何使用现有 Microsoft 技术为 Teams 用户和 Azure 通信服务呼叫 SDK 的呼叫方案提供端到端体验的启示。
用例 1:发起出站 Teams PSTN 呼叫
此场景显示一个多租户用例,其中 Contoso 公司向 Fabrikam 公司提供 SaaS。 SaaS 允许 Fabrikam 的用户通过一个自定义网站发起 Teams 电话呼叫,该网站采用 Teams 用户的标识以及分配给该 Teams 用户的 PSTN 连接配置。
以下序列图显示了发起 Teams 电话呼叫的详细步骤:
步骤
- 在 Contoso 的客户端应用程序中对 Fabrikam 的用户 Alice 进行身份验证:Alice 使用浏览器打开 Fabrikam 的网页并进行身份验证。 可以查找有关使用 Teams 标识进行身份验证的更多详细信息。 如果身份验证成功,Alice 将重定向到初始页。
- 加载客户及其 PSTN 号码:Contoso 提供自定义逻辑来检索客户的列表及其关联的电话号码。 此列表在初始页上呈现给 Alice。
- 向 Megan 发起呼叫:Alice 在 Contoso 的客户端应用程序中选择一个按钮,以向 Megan 发起 PSTN 呼叫。 客户端应用程序使用 Azure 通信服务呼叫 SDK 来提供呼叫功能。 它首先创建 callAgent 的实例,该实例保存执行第一步骤期间获取的 Azure 通信服务访问令牌。
const callClient = new CallClient();
tokenCredential = new AzureCommunicationTokenCredential('<AlICE_ACCESS_TOKEN>');
callAgent = await callClient.createTeamsCallAgent(tokenCredential)
然后,你需要拨打 Megan 的电话号码。
const pstnCallee = { phoneNumber: '<MEGAN_PHONE_NUMBER_E164_FORMAT>' }
const oneToOneCall = callAgent.startCall([pstnCallee], { threadId: '00000000-0000-0000-0000-000000000000' });
- 将 PSTN 呼叫连接到 Megan:呼叫通过分配给 Alice 的 Teams 电话连接路由,抵达 PSTN 网络,并使与提供的电话号码关联的电话响铃。 Megan 看到与 Alice 的 Teams 用户关联的电话号码的来电。
- Megan 接听来电:Megan 接听来电,Alice 与 Megan 之间的连接已建立。
用例 2:接听入站 Teams 电话呼叫
此场景显示一个多租户用例,其中 Contoso 公司向 Fabrikam 公司提供 SaaS。 SaaS 允许 Fabrikam 的用户通过一个自定义网站接听 Teams 电话呼叫,该网站采用 Teams 用户的标识以及分配给该 Teams 用户的 PSTN 连接配置。
以下序列图显示了接听 Teams 电话呼叫的详细步骤:
步骤
- 在 Contoso 的客户端应用程序中对 Fabrikam 的用户 Alice 进行身份验证:Alice 使用浏览器打开 Fabrikam 的网页并进行身份验证。 可以查找有关使用 Teams 标识进行身份验证的更多详细信息。 如果身份验证成功,Alice 将重定向到初始页。
- 订阅接听呼叫:客户端应用程序使用 Azure 通信服务呼叫 SDK 来提供呼叫功能。 它首先创建 callAgent 的实例,该实例保存执行第一步骤期间获取的 Azure 通信服务访问令牌。
const callClient = new CallClient();
tokenCredential = new AzureCommunicationTokenCredential('<AlICE_ACCESS_TOKEN>');
callAgent = await callClient.createTeamsCallAgent(tokenCredential)
然后你订阅来电事件。
const incomingCallHandler = async (args: { teamsIncomingCall: TeamsIncomingCall }) => {
const incomingCall = args.teamsIncomingCall;
// Get information about caller
var callerInfo = incomingCall.callerInfo
showIncomingCall(callerInfo,incomingCall);
};
callAgent.on('incomingCall', incomingCallHandler);
方法 showIncomingCall 是 Contoso 的一个自定义方法,它呈现一个用于指示来电的用户界面,以及用于接听和拒绝呼叫的两个按钮。 如果选择接听按钮,则会使用以下代码:
// Accept the call
var call = await incomingCall.accept();
如果选择拒绝按钮,则会使用以下代码:
// Reject the call
incomingCall.reject();
- Megan 开始呼叫分配给 Teams 用户 Alice 的 PSTN 号码:Megan 使用她的电话呼叫 Alice。 运营商网络将连接到分配给 Alice 的 Teams 电话连接,并在 Alice 注册的所有 Teams 终结点中响铃。 这些终结点包括:Teams 桌面、移动、Web 客户端和基于 Azure 通信服务呼叫 SDK 的应用程序。
- Contoso 的客户端应用程序显示 Megan 的来电:客户端应用程序接听来电通知。 showIncomingCall 方法使用 Contoso 的自定义逻辑将电话号码转换为客户姓名(例如使用一个数据库,其中存储了由电话号码和客户姓名组成的键值对)。 检索信息后,通知会在 Contoso 的客户端应用程序中向 Alice 显示。
- Alice 接听呼叫:Alice 选择一个按钮来接听呼叫,Alice 与 Megan 之间的连接已建立。
用例 3:发起出站 Teams VoIP 呼叫
此场景显示一个多租户用例,其中 Contoso 公司向 Fabrikam 公司提供 SaaS。 SaaS 允许 Fabrikam 的用户通过一个采用 Teams 用户标识的自定义网站发起 Teams VoIP 呼叫。
以下序列图显示了发起 Teams VoIP 呼叫的详细步骤:
步骤
- 在 Contoso 的客户端应用程序中对 Fabrikam 的用户 Alice 进行身份验证:Alice 使用浏览器打开 Fabrikam 的网页并进行身份验证。 可以查找有关使用 Teams 标识进行身份验证的更多详细信息。 如果身份验证成功,Alice 将重定向到初始页。
- 从 Fabrikam 的组织加载用户及其标识符:Contoso 客户端应用程序利用图形 API 从 Fabrikam 的租户获取用户列表。 Alice 或她的管理员需要同意图形 API 执行此操作。 可以在文档中详细了解图形 API 命令。
GET https://graph.microsoft.com/v1.0/users
Permissions: User.ReadBasic.All (delegated)
Response: response.body.value[1].displayName; // ”Megan Bowen”
response.body.value[1].id; // "e8b753b5-4117-464e-9a08-713e1ff266b3"
然后,Contoso 的客户端应用程序将显示用户列表以及用于向给定用户发起呼叫的功能。
- 向 Megan 发起呼叫:Alice 在 Contoso 的客户端应用程序中选择一个按钮,以向 Megan 发起 Teams VoIP 呼叫。 客户端应用程序使用 Azure 通信服务呼叫 SDK 来提供呼叫功能。 Teams 客户端中的呼叫与 Teams 聊天相关联。 首先,应用程序请求为 VoIP 呼叫创建专用聊天。
POST https://graph.microsoft.com/v1.0/chats
Body:
{
"chatType": "oneOnOne",
"members": [
{
"@odata.type": "#microsoft.graph.aadUserConversationMember",
"roles": [
"owner"
],
"user@odata.bind": "https://graph.microsoft.com/v1.0/users('8c0a1a67-50ce-4114-bb6c-da9c5dbcf6ca')"
},
{
"@odata.type": "#microsoft.graph.aadUserConversationMember",
"roles": [
"owner"
],
"user@odata.bind": "https://graph.microsoft.com/v1.0/users('e8b753b5-4117-464e-9a08-713e1ff266b3')"
}
]
}
Permissions: Chat.Create (delegated)
Response: response.body.value.id; // "19:8c0a1a67-50ce-4114-bb6c-da9c5dbcf6ca_e8b753b5-4117-464e-9a08-713e1ff266b3@unq.gbl.spaces"
然后,客户端应用程序创建 callAgent 的实例,该实例保存执行第一步骤期间获取的 Azure 通信服务访问令牌。
const callClient = new CallClient();
tokenCredential = new AzureCommunicationTokenCredential('<AlICE_ACCESS_TOKEN>');
callAgent = await callClient.createTeamsCallAgent(tokenCredential)
然后你开始呼叫 Megan 的 Teams ID。
var teamsUser = { microsoftTeamsUserId: 'e8b753b5-4117-464e-9a08-713e1ff266b3'};
const oneToOneCall = callAgent.startCall([teamsUser], { threadId: '19:8c0a1a67-50ce-4114-bb6c-da9c5dbcf6ca_e8b753b5-4117-464e-9a08-713e1ff266b3@unq.gbl.spaces' });
- 将 VoIP 呼叫连接到 Megan:通过 Teams 路由呼叫,并在与 Megan 关联的 Teams 客户端中响铃。 Megan 看到 Alice 的传入呼叫,该呼叫的名称在 Microsoft Entra ID 中定义。
- Megan 接听来电:Megan 接听来电,Alice 与 Megan 之间的连接已建立。
用例 4:接听入站 Teams VoIP 呼叫
此场景显示一个多租户用例,其中 Contoso 公司向 Fabrikam 公司提供 SaaS。 SaaS 允许 Fabrikam 的用户通过自定义网站接收 Teams VoIP 呼叫,该网站采用 Teams 用户的标识,并应用应用于 Teams 用户的路由策略。
以下序列图显示了接听 Teams VoIP 呼叫的详细步骤:
步骤
- 在 Contoso 的客户端应用程序中对 Fabrikam 的用户 Alice 进行身份验证:Alice 使用浏览器打开 Fabrikam 的网页并进行身份验证。 可以查找有关使用 Teams 标识进行身份验证的更多详细信息。 如果身份验证成功,Alice 将重定向到初始页。
- 订阅接听呼叫:客户端应用程序使用 Azure 通信服务呼叫 SDK 来提供呼叫功能。 它首先创建 callAgent 的实例,该实例保存执行第一步骤期间获取的 Azure 通信服务访问令牌。
const callClient = new CallClient();
tokenCredential = new AzureCommunicationTokenCredential('<AlICE_ACCESS_TOKEN>');
callAgent = await callClient.createTeamsCallAgent(tokenCredential)
然后,应用程序订阅来电事件。
const incomingCallHandler = async (args: { teamsIncomingCall: TeamsIncomingCall }) => {
const incomingCall = args.teamsIncomingCall;
// Get information about caller
var callerInfo = incomingCall.callerInfo
showIncomingCall(callerInfo,incomingCall);
};
callAgent.on('incomingCall', incomingCallHandler);
方法 showIncomingCall 是 Contoso 的一个自定义方法,它呈现一个用于指示来电的用户界面,以及用于接听和拒绝呼叫的两个按钮。 如果选择接听按钮,则会使用以下代码:
// Accept the call
var call = await incomingCall.accept();
如果选择拒绝按钮,则会使用以下代码:
// Reject the call
incomingCall.reject();
- Megan 开始向 Teams 用户 Alice 发起 VoIP 呼叫:Megan 使用她的 Teams 桌面客户端呼叫 Alice。 Teams 基础结构在与 Alice 关联的所有终结点中响铃。 这些终结点包括:Teams 桌面、移动、Web 客户端和基于 Azure 通信服务呼叫 SDK 的应用程序。
- Contoso 的客户端应用程序显示 Megan 的来电:客户端应用程序接听来电通知。 showIncomingCall 方法使用图形 API 将 Teams 用户 ID 转换为显示名称。
GET https://graph.microsoft.com/v1.0/users/e8b753b5-4117-464e-9a08-713e1ff266b3
Permissions: User.Read (delegated)
Response: response.body.value.displayName; // ”Megan Bowen”
response.body.value.id; // "e8b753b5-4117-464e-9a08-713e1ff266b3"
检索信息后,通知会在 Contoso 的客户端应用程序中向 Alice 显示。
- Alice 接听呼叫:Alice 选择一个按钮来接听呼叫,Alice 与 Megan 之间的连接已建立。
用例 5:加入 Teams 会议
此场景显示一个多租户用例,其中 Contoso 公司向 Fabrikam 公司提供 SaaS。 SaaS 允许 Fabrikam 的用户通过一个采用 Teams 用户标识的自定义网站加入 Teams 会议。
以下序列图显示了加入 Teams 会议的详细步骤:
步骤
- 在 Contoso 的客户端应用程序中对 Fabrikam 的用户 Alice 进行身份验证:Alice 使用浏览器打开 Fabrikam 的网页并进行身份验证。 可以查找有关使用 Teams 标识进行身份验证的更多详细信息。 如果身份验证成功,Alice 将重定向到初始页。
- 加载 Teams 会议及其标识符:Contoso 客户端应用程序利用图形 API 获取 Fabrikam 用户的 Teams 会议列表。 Alice 或她的管理员需要同意图形 API 执行此操作。 可以在文档中详细了解图形 API 命令。
GET https://graph.microsoft.com/v1.0/me/calendar/calendarView?startDateTime={start_datetime}&endDateTime={end_datetime}
Permissions: Calendars.Read (delegated)
Response: response.body.value[0].subject; // ”Project Tailspin”
response.body.value[0].onlineMeeting.joinUrl; // "https://teams.microsoft.com/l/meetup-join/..."
response.body.value[0].start.dateTime;
response.body.value[0].end.dateTime;
response.body.value[0].location.displayName;
然后,Contoso 的客户端应用程序将显示 Teams 会议列表以及用于加入这些会议的功能。
- 加入 Teams 会议“Project Tailspin”:Alice 在 Contoso 的客户端应用程序中选择一个按钮以加入 Teams 会议“Project Tailspin”。 客户端应用程序使用 Azure 通信服务呼叫 SDK 来提供呼叫功能。 客户端应用程序创建 callAgent 的实例,该实例保存执行第一步骤期间获取的 Azure 通信服务访问令牌。
const callClient = new CallClient();
tokenCredential = new AzureCommunicationTokenCredential('<AlICE_ACCESS_TOKEN>');
callAgent = await callClient.createTeamsCallAgent(tokenCredential)
然后应用程序通过收到的 joinUrl 加入会议。
var meetingLocator = new TeamsMeetingLinkLocator("https://teams.microsoft.com/l/meetup-join/...");
callAgent.startCallJoinAsync(meetingLocator , new JoinCallOptions());
然后,Alice 加入 Teams 会议。
- 加入 Teams 会议的其他参与者:提供的体验是一个标准的 Teams 会议。 根据配置和邀请方式,Teams 用户、Teams 匿名用户(使用 Teams Web 客户端、Teams 桌面客户端、Teams 移动客户端)、Azure 通信服务用户(通过基于通信服务呼叫 SDK 的应用程序)或使用电话的用户可以加入 Teams 会议。
后续步骤
你可能会对以下文章感兴趣:
- 详细了解身份验证。
- 尝试学习 Teams 用户身份验证快速入门。
- 尝试学习有关呼叫 Teams 用户的快速入门。