You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

未接听Twilio API呼叫却收到in-progress状态回调的原因咨询

问题描述

我使用Twilio API发起呼叫后未接听,但仍收到in-progress状态回调。

相关代码及操作

  1. 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)
        }
    }
}
  1. 状态回调代码
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)
})
  1. 操作:发起呼叫后未接听
  2. 日志结果
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 05:03:21