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) {
}
}
}