如何为从 twilio 发出的呼叫捕获 dtmf 代码?

How can I capture a dtmf code on for a call sent out of twilio?

我通过构建一个包含 twiml 标记的 html 文件来发送呼叫,并使用 php 库来拨打去电号码(参见示例)

$tw_call = $twilio_client->calls->create(
        "+1".$recipient['address'], "+1".$org['twilio_number'], 
        array(
            'Url' => VOICE_CALL_LINK.'/'.$file, (this contains the SAY verbs and text)
            'Timeout' => '30',
            'StatusCallback' => CALLBACK_LINK.'/voice_call_handler.php',
            'StatusCallbackEvent' => array('initiated', 'ringing', 'answered', 'completed')
            )

我想知道是否可以通过我用于拨打电话的方法记录来自呼叫接收者的 dtmf 代码?

能否在文本文件中放置额外的回调url?如果是这样,我将如何捕获返回的电话?调用 sid 是否可用于文本文件中可能的回调 url?

好的,我一定是漏掉了什么。我尝试了以下方法:

<Response>
    <Pause length='1'/>
    <Say voice='alice'>$intro</Say>
    <Pause length='1'/>
    <Say voice='alice'>$msg_body</Say>
    <Pause length='1'/>
    <Gather action='absolute html path' numDigits='1'>
        <Say Please respond by selecting 1 for I can come.  Select 2 for I cannot come.</Say>
    </Gather>
</Response>";

我从 Twilio 回来了 "an application error has occurred"。如果我删除 Gather 标签和 Gather 标签中的 Say 标签,我会收到一个完美的电话。

如果我保留标签并删除操作和路径,也会出现同样的错误。

你能收集外拨电话的回复吗?我问是因为所有 twilio 文档都提到了入站呼叫。

此处为 Twilio 开发人员布道师。

为了从通话中捕获 DTMF 音,您可以使用 <Gather> TwiML verb. This would probably go in the file which contains your <Say> that you point to in the code above. <Say> can be nested within <Gather> 以允许您要求用户输入并在他们开始输入时立即开始输入。

TwiML 可能如下所示:

<Response>
  <Gather action="/gather_result.php" numDigits="1">
    <Say>Welcome to the free beer hotline, dial 1 for free beer, dial 2 for other beverages.</Say>
  </Gather>
</Response>

然后,当用户拨打号码时(可以通过numDigits属性控制多少个号码)Twilio会向action属性中的URL发起请求。在该请求中将有一个 Digits parameter,其中将包含用户按下的数字。呼叫 SID 也将包含在参数中。

如果有帮助请告诉我。

我遇到了类似的问题,即 Gather TwiML 没有从 twilio 发出的调用中捕获用户 dtmf 输入。由于某些原因,它未能捕获我的输入数字。我确实按了 1#,但语音消息一直在播放并重复相同的消息。有时它可以工作并且 twilio 能够获取我输入的数字,但在我尝试的 80% 以上的时间里,它都无法捕获输入的数字。下面是节点 js 中的 TwiML 看起来像:

var promise = new Parse.Promise();

twilioClient.calls.create({
    to: phoneNumber,
    from:'+6598124124',
    url: hosturl + '/gather_user_dial',
    body: callParam,
    statusCallback: hosturl + '/callback_user',
    statusCallbackMethod: 'POST',
    statusCallbackEvent: ["completed", "busy", "no-answer", "canceled", "failed"]
}).then(function(call) {
    if (res) res.success(call);
    promise.resolve(call);
}, function(error) {
    console.error('Call failed!  Reason: ' + error.message);
    if (res) res.error(error);
    promise.reject(error);
});
app.post('/gather_user_dial', (request, response) => {
  const twiml = new VoiceResponse();

  const gather = twiml.gather({
    numDigits: 1,
    timeout: 5,
    actionOnEmptyResult: true,
    action: '/gather',
  });
  gather.say('You are receiving a call from company A because you press the emergency button. Press 1 if you are okay or Press 9 if you need help, followed by the pound sign.');

  twiml.redirect('/gather_user_dial');
  response.type('text/xml');
  response.send(twiml.toString());
});

app.post('/gather', (request, response) => {
  const twiml = new VoiceResponse();
  if (request.body.Digits) {
    switch (request.body.Digits) {
      case '1':
        twiml.say('User has been notified!');
        userPressOne(request.body.Called);
        break;
      case '9':
        twiml.say('User has been notified!');
        userPressNine(request.body.Called);
        break;
      default:
        twiml.say("Sorry, I don't understand that choice.").pause();
        twiml.redirect('/gather_user_dial');
        break;
    }
  } else {
      twiml.redirect('/gather_user_dial');
  }
  response.type('text/xml');
  response.send(twiml.toString());
});