Twilio Flex坐席拒接来电后转回IVR功能报错咨询
Twilio Flex坐席拒接来电自动转回IVR故障解决方案
故障现象
已基于现有插件实现坐席接起后转接Studio IVR功能,新增拒接转接逻辑后触发报错,通话未完成转接:
twilio-flex.unbundled-react.min.js:1574 Error on afterRejectTask: SyntaxError: Unexpected token < in JSON at position 0
原有新增监听器代码如下:
flex.Actions.addListener("afterRejectTask", async (payload, abortFunction) => { let url: string = payload.task.attributes.transferToIvrUrl; let menu: string = 'hangup'; await request(url, { CallSid: payload.sid, menu }); });
请求目标为Twilio Function,正常返回TwiML格式响应:
<Response> <Enqueue workflowSid="WWcc1a650e4175089538d754a6c2e15a98"> <Task>{"transferToIvrUrl": "https://my-twilio-function-service.twil.io/studio-flex-transfer-helper"}</Task> </Enqueue> </Response>
控制台上下文截图:
根因分析
- 响应解析错误:插件内置的
request方法默认将接口响应当作JSON格式解析,但Twilio Function返回的是XML格式的TwiML内容,首字符为<,不符合JSON语法规则,直接触发解析报错,中断后续逻辑。 - 参数传值错误:
RejectTask事件的payload中,payload.sid是当前待处理任务(Task)的SID,并非通话的CallSid,传值错误会导致Twilio Function找不到目标通话,转接指令无法生效。 - 监听器时机错误:
afterRejectTask触发时,Flex已经执行完默认拒接逻辑,会将任务重新放回队列分配给其他坐席,此时再发送转接指令会和系统默认路由逻辑冲突,无法拿到通话控制权。
修复步骤
- 调整监听器挂载时机:将
afterRejectTask替换为beforeRejectTask,在系统执行默认拒接路由前先触发转接逻辑,抢占通话控制权。 - 修正CallSid取值:从任务属性中读取正确的通话SID,即
payload.task.attributes.call_sid,不要直接使用payload.sid。 - 替换请求方法:弃用默认解析JSON的
request工具,改用原生fetch发送请求,无需解析响应内容(TwiML是给Twilio语音平台执行的指令,不需要前端处理返回值)。
修复后的完整监听器代码:flex.Actions.addListener("beforeRejectTask", async (payload) => { const transferUrl = payload.task.attributes.transferToIvrUrl; const callSid = payload.task.attributes.call_sid; // 发送表单格式请求,不做JSON响应解析 await fetch(transferUrl, { method: "POST", headers: { "Content-Type": "application/x-www-form-urlencoded" }, body: new URLSearchParams({ CallSid: callSid, menu: "hangup" }) }); }); - 可选校验项:确认Twilio Function的响应头已设置
Content-Type: text/xml,确保Twilio平台能正确识别返回的TwiML指令。
内容的提问来源于stack exchange,提问作者Ben Osborne
相关产品推荐
相关产品推荐

