呼叫保持(排队)时如何处理呼叫断开

how to handle call disconnection while call is on hold (queued)

我正在关注 以保持和恢复来自虚拟呼叫者的呼叫。它有效,但我还面临两个问题。仅供参考,设置完全相同。

第一个:

第一轮 Hold, Resume 完美运行。在保持状态下,我传递了 CallSid,然后我将 <Enqueue> TwiMl 应用于子呼叫(在我的情况下只有一个)。

  client.calls.list({ parentCallSid: callId }).then(calls => {
    calls.forEach(call => {
      call
      .update({ twiml: '<Response><Enqueue>ADMIN_ID</Enqueue></Response>' });
    });
  });

并且在恢复时,我将呼叫者的 Sid 更新为从队列中再次拨号

  client
    .calls(callId)
    .update({ twiml: '<Response><Dial action="/holding"><Queue>ADMIN_ID</Queue></Dial></Response>' })

它在第一轮中表现完美。当我第二次点击 hold 时,它在来电端显示 We are sorry, some application error occurred. Good Bye! 并断开连接。在接收端,它会播放保持音乐。我做错了什么?

第二个:

我看到 <Dial> 中的设置 action 使其保持活动状态并在我的情况下重复操作 TwiMl。但是在没有任何 hold 的正常情况下,如果接收器断开连接,我作为呼叫者会不断重复听到动作并且呼叫不会挂断。同样在保持期间,如果主叫方或被叫方挂断电话,另一个人只会停留在当前状态。有什么方法可以用上面的设置解决这个问题吗?

通过使用 REST API 检查调用状态解决了问题。

  client.calls.list({ parentCallSid: callId }).then(calls => {
    calls.forEach(call => {

      if (call.status !== 'in-progress') {
        client
          .calls(callId)
          .update({ status: 'completed' })
      }
    });
  });

F.e。上面的代码检查父 Sid(虚拟呼叫者)是否断开连接,在这种情况下它会断开子呼叫。