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

Flutter集成agora_rtc_engine通话时随机出现errInvalidToken问题求助

Flutter集成Agora RTC Token无效/过期问题解决方案

从你提供的错误日志ErrorCodeType.errInvalidToken可以确定,问题确实出在Token的生命周期管理上。以下是具体的实现方案:

核心思路

Agora Token存在有效期限制,必须在过期前主动刷新,或在Token失效后重新获取并重新加入频道,才能避免通话中出现随机断连/错误的情况。

具体实现步骤

1. 监听Token相关回调

初始化Agora引擎时,注册三个关键回调来处理Token的有效期问题:

RtcEngine.createWithConfig(RtcEngineConfig(appId)).then((engine) {
  _engine = engine;
  _engine.setEventHandler(RtcEngineEventHandler(
    // Token即将过期(默认提前30秒触发),主动刷新Token
    onTokenPrivilegeWillExpire: (String oldToken) async {
      final newToken = await _fetchNewToken();
      _engine.renewToken(newToken);
    },
    // Token已失效,需要重新获取并加入频道
    onRequestToken: () async {
      final newToken = await _fetchNewToken();
      await _engine.leaveChannel();
      await _engine.joinChannel(newToken, channelName, null, uid);
    },
    // 捕获Token无效错误,被动处理
    onError: (ErrorCodeType err, String msg) async {
      if (err == ErrorCodeType.errInvalidToken) {
        final newToken = await _fetchNewToken();
        await _engine.leaveChannel();
        await _engine.joinChannel(newToken, channelName, null, uid);
      }
    },
  ));
});

2. 实现后端Token生成调用

前端需要调用后端接口动态获取新Token,绝对不能在前端硬编码Agora证书:

Future<String> _fetchNewToken() async {
  // 替换为你的后端API地址,传入频道名和用户ID
  final response = await http.post(
    Uri.parse('你的后端Token生成接口地址'),
    body: {
      'channel_name': channelName,
      'uid': uid.toString(),
    },
  );
  if (response.statusCode == 200) {
    return json.decode(response.body)['token'];
  } else {
    throw Exception('获取新Token失败');
  }
}

3. 关键注意事项

  • 后端生成规则:后端必须使用Agora提供的SDK,结合App ID、App Certificate、频道名、UID生成Token,确保参数和前端完全一致。
  • 临时测试方案:开发阶段可使用Agora控制台生成临时Token,但生产环境必须用后端动态生成。
  • 避免缓存过期Token:每次加入频道前,都要确认Token的有效性,不要复用过期的Token。

内容的提问来源于stack exchange,提问作者Abhisek Nayak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 19:37:02