未接听Twilio API呼叫却收到in-progress状态回调的原因咨询
问题描述
我使用Twilio API发起呼叫后未接听,但仍收到in-progress状态回调。
相关代码及操作
- Twilio呼叫初始化代码
func TestCall(t *testing.T) { client := twilio.NewRestClient() params := &api.CreateCallParams{} params.SetFrom("xxx") params.SetTo("xxx") params.SetStatusCallbackEvent([]string{"initiated", "ringing", "answered", "completed"}) params.SetStatusCallback("{API_URL}/hook/status") params.SetStatusCallbackMethod("POST") xml := `<Response> <Say>Hello.</Say> </Response>` params.SetTwiml(xml) resp, err := client.Api.CreateCall(params) if err != nil { fmt.Println(err.Error()) os.Exit(1) } else { if resp.Sid != nil { fmt.Println(*resp.Sid) } else { fmt.Println(resp.Sid) } } }
- 状态回调代码
router.POST("/hook/status", func(c *gin.Context) { callSid := c.PostForm("CallSid") callStatus := c.PostForm("CallStatus") fmt.Printf("==== hook status %s %s\n", callSid, callStatus) })
- 操作:发起呼叫后未接听
- 日志结果
initiated ringing in-progress completed
请问为何在未接听呼叫的情况下仍会收到in-progress状态回调?该状态回调是否应仅在通话进行时触发?
解答
这是因为你直接在请求中设置了Twiml参数。当Twilio发起呼叫后,不管被叫方是否接听,它都会立即执行你提供的TwiML指令,此时通话状态就会切换为in-progress。
具体流程是:
- 呼叫启动后触发
initiated状态 - 被叫方响铃时触发
ringing状态 - Twilio开始执行预设的TwiML内容,此时状态变为
in-progress - TWiML执行完毕(比如
<Say>语音播放结束),呼叫进入completed状态
如果想要in-progress仅在被叫方实际接听后触发,你需要移除Twiml参数,改用Url参数指向一个能返回TwiML的后端端点。这样Twilio只有在被叫方接听后才会请求该Url获取TwiML并执行,此时才会触发in-progress状态,符合你预期的触发时机。
内容的提问来源于stack exchange,提问作者Yida Chen
相关产品推荐
相关产品推荐

