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
相关产品推荐
相关产品推荐

