You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于Microsoft Graph Subscription通话数据延迟及来电号码提前获取的技术咨询

解决方案

一、为什么CallRecords订阅延迟高?

CallRecords是通话结束后后台异步生成的日志记录,本身就存在10-15分钟的延迟,无法满足实时通知需求。要实现通话结束即时通知,必须切换到通信会话的实时Webhook订阅。

二、实时通话事件订阅实现

订阅/communications/calls资源,监听通话状态的更新事件,通话状态变化(来电、接通、挂断)会实时推送通知到你的端点。

替换后的订阅代码

var subscription = new Subscription
{
    ChangeType = "updated",
    NotificationUrl = "https://myendpoint.com",
    Resource = "/communications/calls",
    ExpirationDateTime = DateTimeOffset.UtcNow.AddHours(6),
    IncludeResourceData = true,
    AdditionalData = new Dictionary<string, object>
    {
        {"clientState", "your-secret-client-state"},
        {"latestSupportedTlsVersion", "v1_2"}
    }
};

await graphClient.Subscriptions.Request()
    .AddAsync(subscription);
var subscriptions = await graphClient.Subscriptions
    .Request()
    .GetAsync();

三、在端点中处理通知

你的通知端点需要解析推送的事件,根据通话状态实现对应逻辑:

1. 通话挂断即时通知

当推送的resourceData.status字段为completed时,说明通话已挂断,此时可以立即执行后续操作。

2. 接听前获取来电号码

当推送的resourceData.status字段为incoming时,说明有来电进入(此时尚未接听),可以从resourceData.participants数组中提取来电方的号码信息:

// 示例通知中的resourceData片段
{
  "status": "incoming",
  "participants": [
    {
      "info": {
        "identity": {
          "phoneNumber": "+8613xxxxxxxxx" // 来电号码
        }
      }
    }
  ]
}

四、注意事项

  • 权限要求:需要申请Calls.Read.All或Calls.ReadWrite.All应用权限(需管理员同意),权限范围比CallRecords更大。
  • 通知端点必须支持HTTPS,且能处理Microsoft Graph的订阅验证请求(创建订阅时会发送验证令牌,需返回正确响应)。
  • 订阅有效期最长为6小时,需定期续期以保持通知可用。

内容的提问来源于stack exchange,提问作者Ya Wang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 13:33:26