呼叫者从队列中移除后,Twilio 呼叫流程不再继续

Twilio Call Flow Not Continuing After Caller Removed From Queue

基于the documentation for the TwiML <Leave> verb,当调用者退出队列时,他们的调用应该继续执行导致他们进入队列的<Enqueue>之后的调用逻辑。在我的例子中,我的呼叫者通过处理这个 TwiML 进入队列:

<?xml version="1.0" encoding="UTF-8"?>
<Response>
  <Enqueue>business</Enqueue>
  <Say>Sorry, no one is currently available. Please leave a message.</Say>
  <Record action="${endpoint}/hangup" timeout="10" transcribeCallback="${endpoint}/voicemailHandler"/>
</Response>

稍后,我正在执行此 Javascript 逻辑以触发从队列中删除成员:

await twilioClient
      .queues(queueSid)
      .members('Front')
      .update({url: `${endpoint}/leave`})

/leave 端点将成员定向到 TwiML 的这一点:

<?xml version="1.0" encoding="UTF-8"?>
<Response>
     <Leave />
</Response>

我 运行 遇到一个问题,一旦 Javascript 执行,而不是听到 <Say>,呼叫就结束并且呼叫者断开连接。我误解了文档吗?如果是这样,我应该如何重组我的逻辑以达到我想要的结果?

正如 Alan 所说,您需要指定一个 waitUrl 来处理您的呼叫并发送离开指令。

例如,您可以将 waitUrl 设置为 Twilio Function that checks if the call is during business hours as shown in the blog post here,TwiML 将如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <Enqueue waitUrl="https://zaffre-zorse-5224.twil.io/queue">support</Enqueue>
    <Say>Unfortunately, the support line has closed. Please call again tomorrow.</Say>
</Response>

你的函数看起来像这样:

exports.handler = function(context, event, callback) {
    let twiml = new Twilio.twiml.VoiceResponse();

    let moment = require('moment-timezone');
    let timezone = event.timezone || 'America/Los_Angeles';
    const hour = moment().tz(timezone).format('H');
    const dayOfWeek = moment().tz(timezone).format('d');
    
    if ((hour >= 8 && hour < 17) && (dayOfWeek >= 1 && dayOfWeek <= 5)) {
        // "open" from 8am to 5pm, PST.
        twiml.play('http://com.twilio.sounds.music.s3.amazonaws.com/MARKOVICHAMP-Borghestral.mp3');
    } else {
        twiml.leave();
    }
    callback(null, twiml);
};