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

Laravel+Vue集成Twilio Voice JS SDK报31009传输错误如何解决

Twilio Voice JavaScript SDK 31009错误排查方案

错误根因分析

你遇到的TransportError (31009): No transport available to send or receive messages错误,是Twilio JS SDK v2.x版本的典型异常,由以下几个可复现的代码问题导致:

  • JWT Token缺少语音权限配置:你当前生成AccessToken的代码仅配置了基础属性,未绑定VoiceGrant权限,服务端鉴权失败后会主动切断传输通道
  • SDK初始化参数配置错误:编码偏好参数传值不符合v2版本要求
  • 呼叫触发时机错误:未等待Device完成服务端注册就直接发起呼叫,此时传输通道未完成初始化
  • 多余的Token更新操作:初始化Device时已经传入Token,额外调用updateToken会触发重复鉴权,打断正在建立的连接

对应修复方案

1. 修复JWT生成逻辑

给AccessToken添加VoiceGrant权限,正确PHP代码如下:

$identity = uniqid();
$this->app->bind(
    AccessToken::class,
    function ($app,$identity) {
        $accountSid = '你的Account SID';
        $apiKey = '你的API Key';
        $apiSecret = '你的API Secret';
        $outgoingApplicationSid = '你的TwiML App SID'; // 必须配置,用来指定呼叫触发时执行的TwiML逻辑

        $accessToken = new AccessToken($accountSid, $apiKey, $apiSecret, 3600, $identity);
        // 添加语音权限
        $voiceGrant = new \Twilio\Jwt\Grants\VoiceGrant();
        $voiceGrant->setOutgoingApplicationSid($outgoingApplicationSid);
        // 可选:开启来电接收权限,如果需要接电话的话
        // $voiceGrant->setIncomingAllow(true);
        $accessToken->addGrant($voiceGrant);

        return $accessToken;
    }
);

2. 修复JS端初始化与呼叫逻辑

// 首先确保引入的Device是大写的构造函数,避免大小写错误
import { Device } from '@twilio/voice-sdk';

setupClient() {
    axios.post("/twilio/token", {
        forPage: window.location.pathname,
        _token: $('meta[name="csrf-token"]').attr('content')
    }).then((response) => {
        const device = new Device(response.data.token, {
            logLevel: 1,
            answerOnBridge: true,
            // 修复编码偏好参数,v2版本接受的有效值为opus和pcmu
            codecPreferences: ["opus", "pcmu"],
        });
        // 移除多余的updateToken调用
        
        // 先绑定事件监听器,等注册完成后再发起呼叫
        this.addDeviceListeners(device);
        
        // 监听注册成功事件后再呼叫
        device.on('registered', () => {
            this.makeOutgoingCall(device);
        });

        // 可选:监听错误事件方便后续排查
        device.on('error', (error) => {
            console.error('Device错误:', error);
        });
    });
},

makeOutgoingCall(device) {
    var params = {
        phone: '被叫号码',
    };

    if (device) {
        console.log(`Attempting to call ${params.phone} ...`);
        // 注意v2版本connect的参数结构,直接传params即可,不需要包一层{ params }
        const call = device.connect(params);

        // 后续呼叫事件绑定逻辑
    } else {
        console.log("Unable to make call.");
    }
},

额外排查点

如果修改后仍有问题,可以优先检查以下配置:

  • 确认使用的SDK版本是官方v2.x正式版,不要使用测试版或过期的beta版本
  • 确认TwiML App的配置正确,服务端返回的TwiML格式符合要求
  • 检查当前网络环境没有限制wss://的WebSocket连接,没有防火墙拦截Twilio的服务端地址
  • 确认Account SID、API Key、API Secret、TwiML App SID几个参数全部填写正确,没有空值或者拼写错误

内容的提问来源于stack exchange,提问作者Qaisar Mughal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 20:36:04