using System; using System.Collections.Generic; using System.Reflection; using System.Threading.Tasks; using TapSDK.Compliance.Internal.Http; using TapSDK.Compliance.Model; using TapSDK.Core; using TapSDK.Login; using TapSDK.Login.Internal; using System.Net; using TapSDK.Core.Internal.Log; namespace TapSDK.Compliance.Internal { public static class Network { static readonly string ChinaHost = "https://tapsdk.tapapis.cn"; private static ComplianceHttpClient HttpClient = new ComplianceHttpClient(ChinaHost); private static string gameId; private static string clientToken; internal static void SetGameInfo(string gameId, string clientToken) { Network.gameId = gameId; Network.clientToken = clientToken; } internal static void InitSetting() { HttpClient.ChangeAddtionalHeader("Accept-Language","zh-CN"); string host = ChinaHost; if (HttpClient != null) { Type httpClientType = typeof(ComplianceHttpClient); var hostFieldInfo = httpClientType.GetField("serverUrl", BindingFlags.NonPublic | BindingFlags.Instance); hostFieldInfo?.SetValue(HttpClient, host); } } /// /// 拉取配置并缓存在内存 /// 没有持久化的原因是无法判断 SDK 自带与本地持久化版本的高低 /// /// internal static async Task FetchConfig(string userId) { string path = $"real-name/v1/get-global-config"; var headers = GetAuthHeaders(); var queryParams = new Dictionary{ ["client_id"] = gameId, ["user_identifier"] = userId }; RealNameConfigResult response = await HttpClient.Get(path, headers, queryParams); return response; } /// /// 拉取实名认证数据 /// /// internal static async Task FetchVerification(string userId) { string path = $"real-name/v1/anti-addiction-token"; var headers = GetAuthHeaders(); var queryParams = new Dictionary{ ["client_id"] = gameId, ["user_identifier"] = userId }; VerificationResult response = await HttpClient.Get(path, headers, queryParams); return response; } /// /// V1 升级 v2 token internal static async Task UpgradeToken(string userId, string oldToken) { string path = $"real-name/v1/anti-addiction-token-upgrade"; var param = new Dictionary { ["anti_addiction_token_v1"] = oldToken, ["user_identifier"] = userId }; var queryParams = new Dictionary{ ["client_id"] = gameId }; var headers = GetAuthHeaders(); VerificationResult response = await HttpClient.Post(path, headers, data:param, queryParams); return response; } /// /// 使用 TapToken 获取实名 token /// public static async Task FetchVerificationByTapToken(string userId, AccessToken token, long timestamp = 0) { // 这里手动拼 query 是为了进行 Tap 的签算 string path = $"real-name/v1/anti-addiction-token-taptap?client_id={gameId}&user_identifier={WebUtility.UrlEncode(userId)}"; var httpClientType = typeof(ComplianceHttpClient); var hostFieldInfo = httpClientType.GetField("serverUrl", BindingFlags.NonPublic | BindingFlags.Instance); string host = hostFieldInfo?.GetValue(HttpClient) as string; var uri = new Uri(host + "/" + path); var sign = GetMacToken(token, uri, timestamp); var headers = GetAuthHeaders(); headers.Add("Authorization", sign); var queryParams = new Dictionary{ ["client_id"] = gameId, ["user_identifier"] = userId }; VerificationResult response = await HttpClient.Get(path, headers:headers, queryParams); return response; } private static string GetMacToken(AccessToken token, Uri uri, long timestamp = 0) { TapLog.Log(" uri = " + uri.Host + " path = " + uri.PathAndQuery + " token mac = " + token.macKey); int ts = (int)timestamp; if (ts == 0) { var dt = DateTime.UtcNow - new DateTime(1970, 1, 1); ts = (int)dt.TotalSeconds; } TapLog.Log(" GetMacToken ts = " + ts); var sign = "MAC " + LoginService.GetAuthorizationHeader(token.kid, token.macKey, token.macAlgorithm, "GET", uri.PathAndQuery, uri.Host, "443", ts); return sign; } /// /// 检测身份信息是否通过 /// /// 用户名 /// 身份证信息 /// internal static async Task FetchVerificationManual(string userName, string idCard) { var tcs = new TaskCompletionSource(); string path = $"real-name/v1/anti-addiction-token-manual"; Dictionary data = new Dictionary { ["name"] = userName, ["idcard"] = idCard, ["user_identifier"] = TapTapComplianceManager.UserId }; var headers = GetAuthHeaders(); var queryParams = new Dictionary{ ["client_id"] = gameId }; VerificationResult response = await HttpClient.Post(path, headers, data, queryParams); tcs.TrySetResult(response); return await tcs.Task; } /// /// 获取用户配置 /// /// internal static async Task CheckUserConfig() { string path = $"anti-addiction/v1/get-config-by-token"; Dictionary headers = GetAuthHeaders(); var queryParams = new Dictionary{ ["client_id"] = gameId, ["user_identifier"] = TapTapComplianceManager.UserId, ["platform"] = "pc" }; UserComplianceConfigResult response = await HttpClient.Get(path, headers, queryParams); #if UNITY_EDITOR TapLog.Log($"检查用户状态: ageLimit: {response.userState.ageLimit} ageCheck: {response.ageCheckResult.allow} IsAdult: {response.userState.isAdult} "); #endif return response; } /// /// 检测是否可玩 /// /// internal static async Task CheckPlayable() { string path = $"anti-addiction/v1/heartbeat"; Dictionary data = new Dictionary{ ["session_id"] = TapTapComplianceManager.CurrentSession, ["user_identifier"] = TapTapComplianceManager.UserId }; Dictionary headers = GetAuthHeaders(); var queryParams = new Dictionary{ ["client_id"] = gameId }; PlayableResult response = await HttpClient.Post(path, headers, data, queryParams); #if UNITY_EDITOR TapLog.Log($"检查是否可玩结果: remainTime: {response.RemainTime} Content: {response.Content}"); #endif return response; } /// /// 检测是否可充值 /// /// /// internal static async Task CheckPayable(long amount) { string path = $"anti-addiction/v1/payable"; Dictionary headers = GetAuthHeaders(); var queryParams = new Dictionary{ ["client_id"] = gameId, ["user_identifier"] = TapTapComplianceManager.UserId, ["amount"] = amount }; PayableResult response = await HttpClient.Get(path, headers, queryParams); return response; } /// /// 上传充值操作 /// /// /// internal static async Task SubmitPayment(long amount) { string path = $"anti-addiction/v1/payment-submit"; Dictionary data = new Dictionary { { "amount", amount }, {"user_identifier", TapTapComplianceManager.UserId} }; Dictionary headers = GetAuthHeaders(); var queryParams = new Dictionary{ ["client_id"] = gameId }; await HttpClient.Post(path, headers, data, queryParams); } // internal static Dictionary GetAuthHeaders(){ // return new Dictionary{}; // } internal static Dictionary GetAuthHeaders() { var headers = new Dictionary(); string token = Verification.GetCurrentToken(); if (!string.IsNullOrEmpty(token)) { headers.Add("X-Tap-Anti-Addiction-Token", token); } return headers; } internal static void SetTestEnvironment(bool enable) { } } }