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

Twilio Voice SDK问题:无法获取呼入呼出的Call SID及客户端身份

问题

我已经在浏览器中实现Twilio Voice JS SDK,用于发起/接收通话。通过状态回调(status callbacks)能获取通话的发起、振铃、进行中及完成状态,但没法记录是哪个用户发起/接听了通话(每个用户都有独立的日志ID和客户端身份ID)。

收到呼入通话时,浏览器端语音客户端会触发incoming事件,但无法获取Call SID这类可用于关联记录的通话信息;发起呼出通话时也同样拿不到Call SID。

以下是我处理呼入通话、尝试获取Call SID的代码:

device.on("incoming", handleIncomingCall);

function handleIncomingCall(call) {
  try{
      console.log(call.properties.CallSid);
  }
  catch (err)
  {
      console.log("An error occurred while retrieving callsid properties from call object.");
  }

  // 显示呼入通话弹窗
  incomingCallDiv.classList.remove("d-none");

  // 为接听、拒接、挂断按钮添加事件监听
  incomingCallAcceptButton.onclick = () => {
    acceptIncomingCall(call);
  };

  incomingCallRejectButton.onclick = () => {
    rejectIncomingCall(call);
  };

  incomingCallHangupButton.onclick = () => {
    hangupIncomingCall(call);
  };
}

控制台输出错误:

An error occurred while retrieving callsid properties from call object.
解决方案

呼入通话获取Call SID

incoming事件触发时,Call SID还未生成,得等通话状态变更或者通过通话建立后的回调来获取,也可以通过TwiML传递自定义参数关联用户标识:

  1. 通话建立后获取
    接听通话后,监听call对象的connected事件,此时call.sid就是Call SID:
function acceptIncomingCall(call) {
  call.accept();
  call.on('connected', () => {
    console.log('Call SID:', call.sid);
    // 这里把Call SID和当前用户的日志ID关联记录
  });
}
  1. 通过TwiML传递自定义参数
    在处理呼入的TwiML中,给Client标签添加Parameter,传递发起方的日志ID或后端已生成的Call SID:
<Response>
  <Dial>
    <Client>
      <Parameter name="caller_log_id" value="用户A的日志ID"/>
      <Parameter name="call_sid" value="{{CallSid}}"/>
    </Client>
  </Dial>
</Response>

然后在浏览器的incoming事件里,通过call.parameters获取这些参数:

function handleIncomingCall(call) {
  const callerLogId = call.parameters.get('caller_log_id');
  const callSid = call.parameters.get('call_sid');
  console.log('发起方日志ID:', callerLogId, 'Call SID:', callSid);
}

呼出通话获取Call SID

发起呼出时,device.connect()返回的call对象,监听其initiated事件即可拿到Call SID,也可以传递自定义参数关联当前用户:

// 发起呼出通话
const call = device.connect({
  log_id: '当前用户的日志ID'
});

call.on('initiated', () => {
  console.log('呼出Call SID:', call.sid);
  // 关联日志ID和Call SID做记录
});

另外更可靠的方式是在后端的状态回调接口中接收Call SID和自定义参数(比如用户日志ID),直接在后端完成记录,避免前端获取不到的情况。


内容的提问来源于stack exchange,提问作者Manish Jain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 14:21:39