客户端入会失败常见原因

本章节为您介绍了客户端入会失败常见原因及解决办法。

加入频道所需参数如何获取

加入频道所需参数需要从AppServer获取,获取参数请参见使用Token鉴权

常见问题一:Windows端userName参数非UTF-8编码导致入会失败

1. 问题说明

通过 Windows API 或者某些不指定编码的文件读写操作来获取字符串,默认可能使用的是系统的 ANSI 编码;对于简体中文版的 Windows,通常是 GBK 或 GB2312;对于繁体中文版,则可能是 Big5。Windows SDK 的JoinChannel接口规定输入的userName必须为UTF-8,如果传入非UTF-8,会导致字符串解析失败导致无法入会。

2. UTF-8字符串转换示例代码

#include <windows.h>
#include <string>
#include <iostream>

// 转换多字节字符串到wideChar字符串
std::wstring MultiByteToWideChar(const std::string& mbStr, UINT codePage) {
    if (mbStr.empty()) return L"";

    int wlen = MultiByteToWideChar(codePage, 0, &mbStr[0], (int)mbStr.size(), NULL, 0);
    wchar_t* wszGBK = new wchar_t[wlen + 1];
    memset(wszGBK, 0, (wlen + 1) * sizeof(wchar_t));
    MultiByteToWideChar(codePage, 0, &mbStr[0], (int)mbStr.size(), wszGBK, wlen);

    std::wstring result(wszGBK);
    delete[] wszGBK;
    return result;
}

// 转换wideChar字符串到UTF-8
std::string WideCharToMultiByte(const std::wstring& wstr) {
    if (wstr.empty()) return "";

    int mblen = WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), NULL, 0, NULL, NULL);
    char* pMB = new char[mblen + 1];
    memset(pMB, 0, (mblen + 1) * sizeof(char));
    WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), pMB, mblen, NULL, NULL);

    std::string result(pMB);
    delete[] pMB;
    return result;
}

// 主函数
int main() {
    // 假设用户输入
    std::string input = "你好,世界";  // 这里应替换为实际获取用户输入的方法

    // 获取当前系统的ANSI代码页
    UINT ansiCodePage = GetACP();

    // 将输入转换为宽字符
    std::wstring wideInput = MultiByteToWideChar(input, ansiCodePage);

    // 再将宽字符转换回UTF-8编码
    std::string utf8Output = WideCharToMultiByte(wideInput);

    // 输出结果
    std::cout << "Original: " << input << "\n";
    std::cout << "UTF-8: " << utf8Output << "\n";

    return 0;
}

常见问题二:Token错误导致入会失败

1. 控制台生成临时Token并进行验证

image

  • 将新生成的Token,以及相关字段填写到客户端代码中。以 Android 代码为例:

DingRtcAuthInfo auth = new DingRtcAuthInfo();
auth.channelId = /* 频道ID */;
auth.appId = /* 应用ID */;
auth.token = /* 频道鉴权令牌Token */;
auth.userId = /* 用户ID */;
  • 执行joinChannel,检查onJoinChannelResult回调函数通知

    result 为0 表示入会成功。开发人员在Token问题没解决之前,可以使用临时Token继续开发调试本端功能。接下来,按照步骤2 继续排查。

    result 为非0 表示入户失败。这个时候请重点确认AppKey是否搞错,检查appId、channelId、userId、token是否在复制的时候发生了变化,比如:添加了空格字符等。如果仍未发现原因,那么按照步骤3提取客户端日志文件,并请咨询客户经理或提交工单进一步排查。

2. 服务端代码生成Token并进行验证

  • 记录代码生成的AppID、频道ID、用户ID、Token。

以下代码以Java语言的Token生成的示例代码为例

image

备注:

1)Java代码地址:https://gitee.com/dingrtc/AliRTCSample/blob/master/Server/java/src/main/java/com/company/apptoken/model/AppToken.java

2)其他语言访问:https://gitee.com/dingrtc/AliRTCSample/tree/master/Server ,按照语言找到AppToken文件。

image

image

如果验证通过,说明服务端生成的Token正确。不能入会问题请按照步骤3提取客户端日志文件,并咨询客户经理或提交工单,进一步排查。

如果验证失败,说明服务端生成的Token错误,需要服务端同学自行排查,可能的原因有:

  • 使用2.0的AppID/AppKey生成的Token,用在3.0的客户端SDK版本上。

  • AppID或AppKey错误。如:拷贝的时候多拷贝了空格或其他字符;AppID使用了其他AppID的AppKey等。

  • Token错误。如:拷贝Token的时候,被文本编辑器自动换行导致Token发生变化。

  • 时间戳设置的值超过许可的最大有效期。如:目前最大有效期为24小时,如果时间戳设置为25小时有效期就会导致Token失效((System.currentTimeMillis() / 1000) + 25 * 60 * 60)。

  • 时间戳已经过期:如:时间戳是1月1日的12点生成,有效期为12小时((System.currentTimeMillis() / 1000) + 12 * 60 * 60),那么在1月2日早上1点使用该Token会过期。

3. 提取RTC SDK日志文件提供给阿里云工程师进一步排查

如果遇到控制台生成的临时Token无法入会,服务端代码生成Token验证通过但是客户端无法入会,那么需要提交工单做进一步分析。这个时候需要业务开发同学提取RTC SDK的本地日志文件,方便阿里云工程师排查。

平台

默认路径

Android

/sdcard/Android/data/com.xxx.xxx/files/dingrtc/log

iOS

AppData/Library/Caches/dingrtc/log

Mac

可执行程序同一个目录

Windows

%homepath%/dingrc/log

备注:

具体的日志文件目录名称如:dingrtc_2024-11-25T224457218

典型入会失败错误码

错误码(十进制)

说明

16974338

服务端鉴权失败。参考上述说明进行排查。

33620485

加入频道失败:Token无效,您可以重新生成频道鉴权令牌(Token),具体操作,请参见使用Token鉴权

84148226

  • 用户欠费了。

  • 用户的Token过期了,可以通过timestamp参数判断。

  • appid, appkey不对,或者不对应,一个appid对应唯一的一个appkey。

  • 用户的鉴权参数错误。

具体操作,请参见使用Token鉴权