跳到主要内容

登录(启动)

一、后端对接

请完成后端登录的接入,在后端实现 AUTH_KEY 接口后,再执行下一步操作。

若未实现 AUTH_KEY 接口就进行启动对接,启动游戏时,游戏平台的页面会提示 AUTH_KEY 接口错误,而不会启动端游。

二、客户端对接

用户在平台客户端点击启动 Windows 端游,平台客户端会以 Windows 命令行方式启动游戏方的 exe 文件,同时携带与游戏用户相关的启动参数

启动命令行示例

"D:\Thunder\gamebox\clientgame\190032113\CPLauncher.exe"
userId=c9f1f97b211d4b8a78b903d3e34d82b0
authKey=xBTBDx1pG9GAKNbLseY70UpeX5d9NLC3
ext=extdata
xlData=eyJhbnRpX2FkZGljdGlvbiI6eyJhcHBpZCI6IiIsImJpemlkIjoiIn0sImF1ZCI6IjE0MzI5MTQxOTk1MDMxNzk3NzYiLCJleHAiOjE2MzUwMzM2MDAsImlhdCI6MTYzMjgzNzA0MSwiaXNzIjoiaHR0cHM6Ly95b3V4aS54dW5sZWkuY29tIiwibmJmIjoxNjMyODM3MDQxLCJzdWIiOiJjOWYxZjk3YjIxMWQ0YjhhNzhiOTAzZDNlMzRkODJiMCIsInVzZXJfaW5mbyI6eyJhdmF0YXIiOiJodHRwczovL3hmaWxlMi5hLjg4Y2RuLmNvbS9maWxlL2svNTAxL2F2YXRhci8xNTM2NzI3NDQxLmpwZyIsIm5pY2tuYW1lIjoienpoaCIsInVuaWNrbmFtZSI6Inp6aGgifSwidmlwX2luZm8iOnsibGV2ZWwiOjZ9LCJhbGciOiJIUzI1NiJ9.e30.vLhAfaap8Zz3zCeHmpNxoYe6uK179swVRNTfaluDAv8
extinfo=eyJyZWZlcmZyb20iOiJ0ZXN0MTExIiwiYWlkZnJvbSI6InRlc3QxMTEiLCJhY3Rmcm9tIjoidGVzdDMzMyJ9

启动参数说明

参数类型说明
authKeystring游戏方提供的用户访问令牌,用于作身份校验(authKey 后端来源
userIdstring平台的用户 ID(由平台提供)
extstring游戏方的透传数据(ext 后端来源
xlDatastring平台的用户数据(由平台提供),查看数据结构
extinfostring平台提供的额外数据。extinfo 是一个 base64 的字符串,可以解析得到一个 JSON 字符串,JSON 示例:{"referfrom":"test111","aidfrom":"test111","actfrom":"test333"}

查看启动参数

查看 Windows 系统进程启动参数的方法很多,以下提供 2 种方式供参考:

# 在 PowerShell 中使用下方命令,下方的 "XLGame.exe" 需要替换为游戏方的 exe 文件名
Get-CimInstance -ClassName Win32_Process | Where-Object { $_.Name -eq "XLGame.exe" } | ForEach-Object { Write-Host "$($_.Name) (PID:$($_.ProcessId)) 启动命令行:$($_.CommandLine)" `n }
:: 在 Cmd 中使用以下命令,下方的 "XLGame.exe" 需要替换为游戏方的 exe 文件名
wmic process where caption="XLGame.exe" get caption,commandline /value

Unity C# 解析示例

using System;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 迅雷游戏启动参数解析工具
/// </summary>
public class XLLaunchParams
{
/// <summary>
/// 用户 ID(由平台提供)
/// </summary>
public string UserId { get; private set; }

/// <summary>
/// 认证密钥(用于作身份校验)
/// </summary>
public string AuthKey { get; private set; }

/// <summary>
/// 透传数据(游戏方提供)
/// </summary>
public string Ext { get; private set; }

/// <summary>
/// 平台用户数据(Base64 编码的 JSON)
/// </summary>
public string XlData { get; private set; }

/// <summary>
/// 额外数据(Base64 编码的 JSON)
/// </summary>
public string ExtInfo { get; private set; }

/// <summary>
/// 从命令行参数解析启动参数
/// </summary>
/// <returns>解析后的参数对象</returns>
public static XLLaunchParams ParseFromCommandLine()
{
XLLaunchParams result = new XLLaunchParams();
string[] args = Environment.GetCommandLineArgs();

Dictionary<string, string> paramMap = new Dictionary<string, string>();

foreach (string arg in args)
{
// 参数格式为 "key=value"
int equalIndex = arg.IndexOf('=');
if (equalIndex >= 0)
{
string key = arg.Substring(0, equalIndex);
string value = arg.Substring(equalIndex + 1);
if (!paramMap.ContainsKey(key))
{
paramMap[key] = value;
}
}
}

// 提取参数
if (paramMap.ContainsKey("userId"))
{
result.UserId = paramMap["userId"];
}

if (paramMap.ContainsKey("authKey"))
{
result.AuthKey = paramMap["authKey"];
}

if (paramMap.ContainsKey("ext"))
{
result.Ext = paramMap["ext"];
}

if (paramMap.ContainsKey("xlData"))
{
result.XlData = paramMap["xlData"];
}

if (paramMap.ContainsKey("extinfo"))
{
result.ExtInfo = paramMap["extinfo"];
}

// 输出解析结果日志
Debug.Log($"[XLLaunchParams] 解析到启动参数:");
Debug.Log($"[XLLaunchParams] userId = {result.UserId}");
Debug.Log($"[XLLaunchParams] authKey = {result.AuthKey}");
Debug.Log($"[XLLaunchParams] ext = {result.Ext}");
Debug.Log($"[XLLaunchParams] xlData = {result.XlData}");
Debug.Log($"[XLLaunchParams] extinfo = {result.ExtInfo}");

return result;
}

/// <summary>
/// 解析 extinfo JSON
/// </summary>
/// <returns>解析后的字典,如果解析失败返回 null</returns>
public Dictionary<string, object> DecodeExtInfo()
{
return DecodeBase64Json(ExtInfo);
}

/// <summary>
/// 对 Base64 编码的 JSON 进行解码
/// </summary>
private Dictionary<string, object> DecodeBase64Json(string base64Str)
{
if (string.IsNullOrEmpty(base64Str))
{
return null;
}

try
{
byte[] bytes = Convert.FromBase64String(base64Str);
string json = System.Text.Encoding.UTF8.GetString(bytes);

// 使用 Unity 的 JsonUtility 进行解析
// 如果使用 Newtonsoft.Json,可以直接 JsonConvert.DeserializeObject<Dictionary<string, object>>(json)
Debug.Log($"[XLLaunchParams] 解码 JSON: {json}");

// 这里返回简单字典,实际项目中根据需要使用具体类型解析
return new Dictionary<string, object>();
}
catch (Exception ex)
{
Debug.LogError($"[XLLaunchParams] Base64 JSON 解码失败: {ex.Message}");
return null;
}
}

/// <summary>
/// 检查是否获取到了必要的登录参数
/// </summary>
public bool HasRequiredParams()
{
return !string.IsNullOrEmpty(UserId) && !string.IsNullOrEmpty(AuthKey);
}
}

// 使用示例:
// void Start()
// {
// XLLaunchParams launchParams = XLLaunchParams.ParseFromCommandLine();
// if (!launchParams.HasRequiredParams())
// {
// Debug.LogError("[XLLaunchParams] 缺少必要的启动参数,请从迅雷游戏客户端启动游戏");
// // 处理错误情况,如退出游戏
// return;
// }
// // 使用 userId 和 authKey 进行后端登录校验
// // ...
// }