本文展示如何使用 anyRTC 提供的代码在服务端生成 RTC Token。

RTC Token 在你的业务服务端生成。用户登录 RTC 系统时,客户端需要向服务端申请 RTC Token;服务器生成 RTC Token 后,再将其传给客户端。
前提条件
- 注册开发者。
- 创建项目。
- 项目在控制台已开启权限认证。详见 RTC Token 鉴权
生成 RTC Token
请参考 anyRTC 在 GitHub 的Demo ARDynamicKey ,支持使用 C++、Java、Python、PHP、Node.js、Go 语言在你的服务端部署生成 RTM Token。下图以 C++ 为例,展示生成 RTM Token 代码的文件结构:
./sample/RtcTokenBuilderSample.cpp 文件包含用于生成 RTC Token 的示例代码。

./src/RtcTokenBuilder.h 文件包含用于生成 RTC Token 的 API 源代码。

C++
int main(int argc, char const *argv[]) {
  // 请填入你的项目 App ID
  std::string appID  = "xxxxxxxxxxxxxxxxxxxxxxxx";
  // 请填入你的项目权限密钥
  std::string  appCertificate = "xxxxxxxxxxxxxxxxxxxxxxxx";
  // 请填入频道名称
  std::string channelName= "123456";
  // 请填入用户 ID
  std::string userAccount = "test_user_id";
  uint32_t expirationTimeInSeconds = 3600;
  uint32_t currentTimeStamp = time(NULL);
  uint32_t privilegeExpiredTs = currentTimeStamp + expirationTimeInSeconds;
  std::string result;
  result = RtcTokenBuilder::buildTokenWithUserAccount(
      appID, appCertificate, channelName, userAccount, UserRole::Role_Publisher,
      privilegeExpiredTs);
  std::cout << "Token With UserAccount:" << result << std::endl;
  return 0;
}
参考步骤
开始前请确保已安装 openssl 库。
- 
将 ARDynamicKey 仓库下载或克隆至本地。 
- 
打开 ARDynamicKey/cpp/sample/RtcTokenBuilderSample.cpp文件,使用自己的 App ID、权限密钥、频道名称、用户 ID 替换示例代码中的值。
- 
进入 RtcTokenBuilderSample.cpp所在路径,然后运行如下命令行。运行结束后,相同文件夹下会生成一个可执行文件RtcTokenBuilderSample。g++ -std=c++0x -O0 -I../../ -L. RtcTokenBuilderSample.cpp -lz -lcrypto -o RtcTokenBuilderSample
- 
运行如下命令行生成 RTC Token。生成的 RTC Token 会显示在 Terminal 中。 ./RtcTokenBuilderSample
Java
    public class RtcTokenBuilderSample {
    // 请填入你的项目 App ID   
    static String appId = "xxxxxxxxxxxxxxxxxxxxxxxx";
    // 请填入你的项目权限密钥
    static String appCertificate = "xxxxxxxxxxxxxxxxxxxxxxxx";
    // 请填入频道名称
    static String channelName = "123456";
    // 请填入用户 ID
    static String userAccount = "test_user_id";
    // Token 服务过期时间
    static int expirationTimeInSeconds = 3600; 
    public static void main(String[] args) throws Exception {
        RtcTokenBuilder token = new RtcTokenBuilder();
        int timestamp = (int)(System.currentTimeMillis() / 1000 + expirationTimeInSeconds);
        String result = token.buildTokenWithUserAccount(appId, appCertificate,  
                 channelName, userAccount, Role.Role_Publisher, timestamp);
        System.out.println(result);
    }
参考步骤
- 
将 ARDynamicKey 仓库下载或克隆至本地。 
- 
在你的 Java IDE 中打开 ARDynamicKey/java文件。
- 
打开 ARDynamicKey/java/src/main/java/io/ar/sample/RtcTokenBuilderSample.java文件。使用自己的 App ID、权限密钥、用户 ID 、频道名称替换示例代码中的值。
- 
在你的 Java IDE 中运行项目。生成的 RTC Token 会显示在 IDE 中。 
Python
    // 请填入你的项目 App ID
    appID = "xxxxxxxxxxxxxxxxxxxxxxxx"
    // 请填入你的项目权限密钥
    appCertificate = "xxxxxxxxxxxxxxxxxxxxxxxx"
    // 请填入频道名称
    channelName = "123456"
    // 请填入用户 ID
    userAccount = "test_user_id"
    // Token 服务过期时间
    expireTimeInSeconds = 3600
    currentTimestamp = int(time.time())
    privilegeExpiredTs = currentTimestamp + expireTimeInSeconds
    def main():
        token = RtcTokenBuilder.buildTokenWithAccount(appID, appCertificate, channelName, userAccount, Role_Attendee, privilegeExpiredTs)
        print("Token with user account: {}".format(token))
    if __name__ == "__main__":
        main()
参考步骤
- 
将 ARDynamicKey 仓库下载或克隆至本地。 
- 
打开 ARDynamicKey/python/sample/RtmTokenBuilderSample.py文件。使用自己的 App ID、权限密钥、用户 ID、频道名称替换示例代码中的值。
- 
进入 RtcTokenBuilderSample.py所在路径,然后运行如下命令行生成 RTC Token。 生成的 RTC Token 会显示在 Terminal 中。
- 
python RtcTokenBuilderSample.py
Python3
    // 请填入你的项目 App ID
    appID = "xxxxxxxxxxxxxxxxxxxxxxxx"
    // 请填入你的项目权限密钥
    appCertificate = "xxxxxxxxxxxxxxxxxxxxxxxx"
    // 请填入频道名称
    channelName = "123456"
    // 请填入用户 ID
    userAccount = "test_user_id"
    // Token 服务过期时间
    expireTimeInSeconds = 3600
    currentTimestamp = int(time.time())
    privilegeExpiredTs = currentTimestamp + expireTimeInSeconds
    def main():
        token = RtcTokenBuilder.buildTokenWithAccount(appID, appCertificate, channelName, userAccount, Role_Attendee, privilegeExpiredTs)
        print("Token with user account: {}".format(token))
    if __name__ == "__main__":
        main()
开始前请确保已安装 Python 3,且运行环境为 Python 3。你可以运行如下命令行查询当前 Python 版本。
参考步骤
- 
将 ARDynamicKey 仓库下载或克隆至本地。 
- 
打开 ARDynamicKey/python3/sample/RtcTokenBuilderSample.py文件。使用自己的 App ID、权限密钥、用户 ID、频道名称替换示例代码中的值。
- 
进入 RtcTokenBuilderSample.py所在路径,然后运行如下命令行生成 RTC Token。 生成的 RTC Token 会显示在 Terminal 中。
- 
python RtcTokenBuilderSample.py
PHP
    // 请填入你的项目 App ID
    $appID = "xxxxxxxxxxxxxxxxxxxxxxxx";
    // 请填入你的项目权限密钥
    $appCertificate = "xxxxxxxxxxxxxxxxxxxxxxxx";
    // 频道名称
    $channelName = "123456";
    // 请填入用户 ID
    $uidStr = "test_user_id";
    $role = RtcTokenBuilder::RoleSubscriber;
    // Token 服务过期时间
    $expireTimeInSeconds = 3600;
    $currentTimestamp = (new DateTime("now", new DateTimeZone('UTC')))->getTimestamp();
    $privilegeExpiredTs = $currentTimestamp + $expireTimeInSeconds;
    $token = RtcTokenBuilder::buildTokenWithUserAccount($appID, $appCertificate, $channelName, $uidStr, $role, $privilegeExpiredTs);
    echo 'Token with user account: ' . $token . PHP_EOL;
开始前请确保已安装最新版本的 PHP。
参考步骤
- 
将 ARDynamicKey 仓库下载或克隆至本地。 
- 
打开 ARDynamicKey/sample/RtcTokenBuilderSample.php文件。使用自己的 App ID、权限密钥、用户 ID、频道名称替换示例代码中的值。
- 
进入 RtcTokenBuilderSample.php所在路径,然后运行如下命令行生成 RTC Token。 生成的 RTC Token 会显示在 Terminal 中。
- 
php RtcTokenBuilderSample.php<
Node.js
    // 请填入你的项目 App ID
    const appID = 'xxxxxxxxxxxxxxxxxxxxxxxx';
    // 请填入你的项目权限密钥
    const appCertificate = 'xxxxxxxxxxxxxxxxxxxxxxxx';
    // 频道名称
    const channelName = '123456';
    // 请填入用户 ID
    const account = "2882341273";
    const role = RtcRole.PUBLISHER;
    // Token 服务过期时间
    const expirationTimeInSeconds = 3600
    const currentTimestamp = Math.floor(Date.now() / 1000)
    const privilegeExpiredTs = currentTimestamp + expirationTimeInSeconds
    // IMPORTANT! Build token with either the uid or with the user account. Comment out the option you do not want to use below.
    // Build token with user account
    const tokenB = RtcTokenBuilder.buildTokenWithAccount(appID, appCertificate, channelName, account, role, privilegeExpiredTs);
    console.log("Token With UserAccount: " + tokenB);
开始前请确保已安装最新版本的 Node.js LTS 版本。
参考步骤
- 
将 ARDynamicKey 仓库下载或克隆至本地。 
- 
打开 ARDynamicKey/nodejs/sample/RtcTokenBuilderSample.js文件。使用自己的 App ID、权限密钥、用户 ID 替换示例代码中的值。
- 
进入 RtcTokenBuilderSample.js所在路径,然后运行如下命令行生成 RTC Token。 生成的 RTC Token 会显示在 Terminal 中。
- 
node RtcTokenBuilderSample.js
Go
    // 请填入你的项目 App ID
    appID := "xxxxxxxxxxxxxxxxxxxxxxxx"
    // 请填入你的项目权限密钥
    appCertificate := "xxxxxxxxxxxxxxxxxxxxxxxx"
    // 频道名称
    channelName := "123456"
    // 请填入用户 ID
    uidStr := "test_user_id"
    // Token 服务过期时间
    expireTimeInSeconds := uint32(3600)
    currentTimestamp := uint32(time.Now().UTC().Unix())
    expireTimestamp := currentTimestamp + expireTimeInSeconds
    result, err = rtctokenbuilder.BuildTokenWithUserAccount(appID, appCertificate, channelName, uidStr, rtctokenbuilder.RoleAttendee, expireTimestamp)
    if err != nil {
        fmt.Println(err)
    } else {
        fmt.Printf("Token with userAccount: %s\n", result)
    }
开始前请确保已安装最新版本的 Golang。
参考步骤
- 
将 ARDynamicKey 仓库下载或克隆至本地。 
- 
打开 ARDynamicKey/go/sample/RtcTokenBuilder/sample.go文件。使用自己的 App ID、权限密钥、用户 ID、频道名称替换示例代码中的值。
- 
进入 sample.go所在路径,然后运行如下命令行。 运行结束后,相同文件夹下会生成一个可执行文件RtcTokenBuilder。go build
- 
运行如下命令行生成 Token。生成的 Token 会显示在 Terminal 中。 ./RtcTokenBuilder
参数说明
下文以 C++ 的 API 为例,介绍生成 RTM Token 的 API 参数含义。具体参数解释也适用于其他语言。
 static std::string buildTokenWithUserAccount(
        const std::string& appId,
        const std::string& appCertificate,
        const std::string& channelName,
        const std::string& userAccount,
        UserRole role,
        uint32_t privilegeExpiredTs = 0);
 
| 参数 | 描述 | 
|---|---|
| appId | 项目 App ID。 | 
| appCertificate | 项目权限密钥。 | 
| channelName | 字符串长度不可超过 64 字节。不可设为空、null 或 "null"。支持以下字符集范围: | 
| userAccount | 用户 ID,64位字符串类型。如果不填或设置为nil,SDK 会自动分配一个。 规则同 channelName 。 | 
| userRole | 用户角色。暂时只支持一种角色,请使用默认值 Role_Publisher = 1。 注:使用php生成 Token 时请勿携带。 | 
| privilegeExpiredTs | Token 过期的 Unix 时间戳,单位为秒。该值为当前时间戳和 Token 有效期的总和。 例如,如果你将 privilegeExpiredTs 设为当前时间戳再加 600 秒,则 Token 会在 10 分钟内过期。 Token 的最大有效期为 24 小时。 如果你将此参数设为 0,或时间长度超过 24 小时,Token 有效期依然为 24 小时。 | 
注意事项
参数匹配
生成 RTC Token 时填入的参数,需要加入频道时填入的参数一致。
权限密钥与 RTC Token
生成 RTC Token 需要先在控制台启用对应项目的权限密钥。项目一旦开启了权限密钥功能,就必须使用 RTC Token 鉴权。
RTC Token 过期
Token 的最大有效期为 24 小时。为保证通信体验,anyRTC 会在 Token 即将过期或已经过期时,分别触发以下回调:
- onTokenPrivilegeWillExpire:该回调表示 Token 即将失效。
- onRequestToken(Web 平台为- onTokenPrivilegeDidExpire):该回调表示 Token 已经失效。
收到任一回调后,你需要在服务端重新生成 Token,然后调用 renewToken 方法更新 Token。

