如何通过Twilio PHP REST API向IVR分阶段发送DTMF按键?
如何通过Twilio PHP API向IVR发送多段DTMF按键?
场景:我需要拨打一个设置了IVR的号码,该IVR提示按1选择英语、按2选择西班牙语,选定语言后要求输入6位数字。请问如何通过DTMF传递后续的6位数字?
我已查阅文档并搜索相关内容,但未找到有效解决方案。
我的尝试代码如下:
$twilio = new Client("AC8b2cc96be2a8dbc059f2908exxxxxxxx", "88db8eeb71124a3effd6c196xxxxxxxx"); $from = "+1289724xxxx"; $to = "+1289670xxxx"; $call = $twilio->calls ->create($to, // to $from, // from [ "method" => "GET", "sendDigits" => "wwwwwwwwww1", "sendDigits" => "wwwwwwwwwwwwwwwwww123456", // 去掉此行时可正常发送第一个按键 "url" => "http://demo.twilio.com/docs/voice.xml" ] ); print($call->sid);
问题分析
你代码里的核心问题是PHP数组中重复的键会被后面的覆盖,所以第一个sendDigits设置的"wwwwwwwwww1"被第二个覆盖了,导致实际只发送了"wwwwwwwwwwwwwwwwww123456",这就是为什么去掉第二行后第一个按键能正常发送的原因。
另外,直接在呼叫发起时用sendDigits需要精准控制等待时间,确保IVR流程走到对应步骤再发送按键。
解决方案
方案1:合并sendDigits参数
把两段按键和对应的等待时间合并到同一个sendDigits值里,用w表示0.5秒的等待,根据IVR的实际响应速度调整等待时长:
$twilio = new Client("AC8b2cc96be2a8dbc059f2908exxxxxxxx", "88db8eeb71124a3effd6c196xxxxxxxx"); $from = "+1289724xxxx"; $to = "+1289670xxxx"; $call = $twilio->calls ->create($to, $from, [ "method" => "GET", // 先等3秒(6个w)按1选语言,再等3秒输入6位数字 "sendDigits" => "wwwwww1wwwwww123456", "url" => "http://demo.twilio.com/docs/voice.xml" ]); print($call->sid);
方案2:使用自定义TwiML控制(更灵活)
如果IVR流程的延迟不稳定,建议用TwiML来分步发送按键,这样能更精准地控制等待时间:
- 创建一个返回TwiML的文件(比如
voice_response.php):
<?xml version="1.0" encoding="UTF-8"?> <Response> <!-- 等待3秒,确保IVR语言选择提示加载完成 --> <Pause length="3"/> <!-- 发送1选择英语 --> <SendDigits>1</SendDigits> <!-- 等待3秒,确保IVR跳转到输入数字的步骤 --> <Pause length="3"/> <!-- 发送6位数字 --> <SendDigits>123456</SendDigits> </Response>
- 修改呼叫代码,将
url指向这个自定义TwiML文件:
$twilio = new Client("AC8b2cc96be2a8dbc059f2908exxxxxxxx", "88db8eeb71124a3effd6c196xxxxxxxx"); $from = "+1289724xxxx"; $to = "+1289670xxxx"; $call = $twilio->calls ->create($to, $from, [ "method" => "GET", "url" => "https://你的域名/voice_response.php" ]); print($call->sid);
说明
- 方案1适合IVR流程固定、延迟可预估的场景,配置简单;
- 方案2更灵活,能根据IVR的实际响应调整等待时长,避免按键发送过早导致无效操作。
内容的提问来源于stack exchange,提问作者NomanJaved
相关产品推荐
相关产品推荐

