361 lines
13 KiB
C#
361 lines
13 KiB
C#
|
using System;
|
|||
|
using BestHTTP;
|
|||
|
using UnityEngine;
|
|||
|
using System.Linq;
|
|||
|
using System.Text;
|
|||
|
using Framework.Event;
|
|||
|
using LC.Newtonsoft.Json;
|
|||
|
using LC.Newtonsoft.Json.Linq;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Security.Cryptography;
|
|||
|
|
|||
|
public enum NetRequestStatus
|
|||
|
{
|
|||
|
None = 0,
|
|||
|
Start,
|
|||
|
Wait,
|
|||
|
Success,
|
|||
|
}
|
|||
|
|
|||
|
public class AppNetConfig : MonoBehaviour
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
/// 请求服务器返回信息类
|
|||
|
/// </summary>
|
|||
|
private class ServerResponseInfo
|
|||
|
{
|
|||
|
public int code = -1;
|
|||
|
public string message;
|
|||
|
public string data;
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 请求获取数据类
|
|||
|
/// </summary>
|
|||
|
private class PostData
|
|||
|
{
|
|||
|
public string action;
|
|||
|
public string time;
|
|||
|
public string sign;
|
|||
|
public string client_id;
|
|||
|
public string client_type;
|
|||
|
public string game_data;
|
|||
|
}
|
|||
|
/// <summary>
|
|||
|
/// 请求上传数据类
|
|||
|
/// </summary>
|
|||
|
private class UploadPostData
|
|||
|
{
|
|||
|
public string action;
|
|||
|
public string time;
|
|||
|
public string sign;
|
|||
|
public string client_id;
|
|||
|
public string third_id;
|
|||
|
public string game_data;
|
|||
|
}
|
|||
|
|
|||
|
public static NetRequestStatus State = NetRequestStatus.None;
|
|||
|
|
|||
|
//private static readonly string URL = "http://192.168.3.90:8000/web_api/server_update.php";
|
|||
|
|
|||
|
private static readonly string URL = "http://170.106.198.9/web_api/server_update.php";
|
|||
|
|
|||
|
private static readonly string Sign = "oxZsw7oTruE7wAWFZxzk6M3CUCAi3m6b";
|
|||
|
|
|||
|
private static string _createSign;
|
|||
|
private static string _myTime;
|
|||
|
private static string _getData;
|
|||
|
private static string _saveData;
|
|||
|
private bool _upload;
|
|||
|
|
|||
|
private static ServerResponseInfo _serverData;
|
|||
|
private PostData _postData;
|
|||
|
private UploadPostData _uploadPostData;
|
|||
|
|
|||
|
private static bool _thirdLoginSuccess;
|
|||
|
private static bool _deviceLoginSuccess;
|
|||
|
private bool _isNewUser;
|
|||
|
|
|||
|
void Start()
|
|||
|
{
|
|||
|
_postData = new PostData();
|
|||
|
_serverData = new ServerResponseInfo();
|
|||
|
_uploadPostData = new UploadPostData();
|
|||
|
EventManager.Instance.Register<string>(EventManager.EventName.UploadToRemote, StartUpload);
|
|||
|
EventManager.Instance.Register(EventManager.EventName.NewUserLogin, SaveNewUserData);
|
|||
|
}
|
|||
|
|
|||
|
private void OnDestroy()
|
|||
|
{
|
|||
|
EventManager.Instance.Unregister<string>(EventManager.EventName.UploadToRemote, StartUpload);
|
|||
|
EventManager.Instance.Unregister(EventManager.EventName.NewUserLogin, SaveNewUserData);
|
|||
|
}
|
|||
|
|
|||
|
private void StartUpload(string jsonData)
|
|||
|
{
|
|||
|
_saveData = jsonData;
|
|||
|
_upload = true;
|
|||
|
}
|
|||
|
|
|||
|
private void SaveNewUserData()
|
|||
|
{
|
|||
|
DebugUtil.LogWarning("新玩家");
|
|||
|
var jsonData = JsonConvert.SerializeObject(AppInfoManager.Instance.RemoteAppUserInfo);
|
|||
|
UploadDataToServer(jsonData);
|
|||
|
}
|
|||
|
|
|||
|
private void BindThirdID()
|
|||
|
{
|
|||
|
var jsonData = JsonConvert.SerializeObject(AppInfoManager.Instance.AppUserInfo);
|
|||
|
UploadDataToServer(jsonData);
|
|||
|
}
|
|||
|
|
|||
|
private void Update()
|
|||
|
{
|
|||
|
if (State == NetRequestStatus.Start)
|
|||
|
{
|
|||
|
State = NetRequestStatus.Wait;
|
|||
|
GetDataFromServer();
|
|||
|
}
|
|||
|
|
|||
|
if (_upload && !string.IsNullOrEmpty(_saveData))
|
|||
|
{
|
|||
|
_upload = false;
|
|||
|
UploadDataToServer(_saveData);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private void GetDataFromServer()
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
var uniqueID = AppInfoManager.Instance.GetUniqueID();
|
|||
|
var uniqueType = AppInfoManager.Instance.GetUniqueType();
|
|||
|
DebugUtil.Log("使用{0}获取数据, ID:{1}", AppInfoManager.Instance.CurLoginState, uniqueID);
|
|||
|
HTTPRequest request = new HTTPRequest(new Uri(URL), HTTPMethods.Post, OnGetFinished);
|
|||
|
request.SetHeader("Content-Type", "application/json");
|
|||
|
_createSign = GenerateHash("get_data", uniqueID);
|
|||
|
_postData = new PostData
|
|||
|
{
|
|||
|
action = "get_data",
|
|||
|
time = _myTime,
|
|||
|
sign = _createSign,
|
|||
|
client_id = uniqueID,
|
|||
|
client_type = uniqueType,
|
|||
|
game_data = "None"
|
|||
|
};
|
|||
|
|
|||
|
var jsonData = JsonConvert.SerializeObject(_postData);
|
|||
|
if (string.IsNullOrEmpty(jsonData))
|
|||
|
DebugUtil.LogError("Json转化后,postDataJson为空");
|
|||
|
|
|||
|
var bytes = Encoding.UTF8.GetBytes(jsonData);
|
|||
|
request.RawData = bytes;
|
|||
|
request.Send();
|
|||
|
}
|
|||
|
catch (Exception e)
|
|||
|
{
|
|||
|
DebugUtil.LogError("AppNetConfig.GetDataFromServer Error: {0}", e);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private void OnGetFinished(HTTPRequest request, HTTPResponse response)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
var loginIDState = AppInfoManager.Instance.CurLoginState;
|
|||
|
switch (request.State)
|
|||
|
{
|
|||
|
case HTTPRequestStates.Finished:
|
|||
|
{
|
|||
|
var jsonData = response.DataAsText;
|
|||
|
JObject jObj = JObject.Parse(jsonData);
|
|||
|
_serverData.code = (int)jObj["code"];
|
|||
|
_serverData.message = jObj["message"]?.ToString();
|
|||
|
//找不到用户信息
|
|||
|
if (_serverData.code == 1)
|
|||
|
{
|
|||
|
//查不到第三方信息 但是本地有 绑定
|
|||
|
if (loginIDState == AppInfoManager.NetConfigID.ThirdID && _deviceLoginSuccess)
|
|||
|
{
|
|||
|
DebugUtil.Log("查不到第三方信息 但是本地有, 保存数据, 服务器返回消息:{0}", jsonData);
|
|||
|
BindThirdID();
|
|||
|
_thirdLoginSuccess = true;
|
|||
|
}
|
|||
|
//其余情况以设备id注册新玩家
|
|||
|
else
|
|||
|
{
|
|||
|
DebugUtil.Log("无设备ID和第三方ID, 新玩家, 先保存数据");
|
|||
|
_isNewUser = true;
|
|||
|
EventManager.Instance.Send(EventManager.EventName.NewUserLogin);
|
|||
|
}
|
|||
|
}
|
|||
|
else if (_serverData.code == 0)
|
|||
|
{
|
|||
|
var data = jObj["data"];
|
|||
|
if (data != null)
|
|||
|
{
|
|||
|
_serverData.data = data["game_data"]?.ToString();
|
|||
|
if (!string.IsNullOrEmpty(_serverData.data))
|
|||
|
{
|
|||
|
if (loginIDState == AppInfoManager.NetConfigID.ThirdID && !_deviceLoginSuccess)
|
|||
|
{
|
|||
|
_thirdLoginSuccess = true;
|
|||
|
AppInfoManager.Instance.ThirdIdGetSuccess(_serverData.data);
|
|||
|
DebugUtil.Log("第一次使用第三方id获取成功,设备id无登录");
|
|||
|
}
|
|||
|
//后续登录 和 设备id获取得到第三方id的情况
|
|||
|
else if (loginIDState == AppInfoManager.NetConfigID.ThirdID && _deviceLoginSuccess)
|
|||
|
{
|
|||
|
_thirdLoginSuccess = true;
|
|||
|
AppInfoManager.Instance.ThirdIdGetSuccessWithDevice(_serverData.data);
|
|||
|
DebugUtil.Log("使用第三方id获取成功");
|
|||
|
}
|
|||
|
//本地有设备id缓存 并且没登录过第三方
|
|||
|
else if (loginIDState == AppInfoManager.NetConfigID.DeviceID && !_thirdLoginSuccess)
|
|||
|
{
|
|||
|
_deviceLoginSuccess = true;
|
|||
|
AppInfoManager.Instance.DeviceIdGetSuccess(_serverData.data);
|
|||
|
DebugUtil.Log("使用设备id获取成功,进行有无第三方id判断");
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
DebugUtil.Log("设备id获取成功但是第三方也成功登录的情况");
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
DebugUtil.LogError("Sever Get Error, code: {0}, message: {1}", _serverData.code,
|
|||
|
_serverData.message);
|
|||
|
}
|
|||
|
|
|||
|
break;
|
|||
|
}
|
|||
|
default:
|
|||
|
string text = "Request Finished with Error! " + (request.Exception != null
|
|||
|
? (request.Exception.Message + "\n" + request.Exception.StackTrace)
|
|||
|
: "No Exception");
|
|||
|
DebugUtil.LogError(text);
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
catch (JsonReaderException jsonEx)
|
|||
|
{
|
|||
|
DebugUtil.LogError("GetData JSON parsing error: {0}\nRaw response: {1}", jsonEx.Message,
|
|||
|
response.DataAsText);
|
|||
|
}
|
|||
|
catch (Exception e)
|
|||
|
{
|
|||
|
DebugUtil.LogError("AppNetConfig.GetDataFromBestHttp Error: {0}", e);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private void UploadDataToServer(string data)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
var clientID = AppInfoManager.Instance.AppUserInfo.UserInfo.UserID;
|
|||
|
var thirdID = AppInfoManager.Instance.AppUserInfo.UserInfo.ThirdId;
|
|||
|
DebugUtil.Log("上传的玩家数据, clientID:{0}, thirdID: {1},gameData:{2}", clientID, thirdID, data);
|
|||
|
|
|||
|
var request = new HTTPRequest(new Uri(URL), HTTPMethods.Post, NewOnUploadFinished);
|
|||
|
request.SetHeader("Content-Type", "application/json");
|
|||
|
_createSign = GenerateHash("save_third_data", clientID);
|
|||
|
_uploadPostData = new UploadPostData
|
|||
|
{
|
|||
|
action = "save_third_data",
|
|||
|
time = _myTime,
|
|||
|
sign = _createSign,
|
|||
|
client_id = clientID,
|
|||
|
third_id = thirdID,
|
|||
|
game_data = data,
|
|||
|
};
|
|||
|
string jsonData = JsonConvert.SerializeObject(_uploadPostData);
|
|||
|
if (string.IsNullOrEmpty(jsonData))
|
|||
|
DebugUtil.LogError("Json转化后, uploadPostDat为空");
|
|||
|
DebugUtil.Log("UploadData.Post信息:{0}", jsonData);
|
|||
|
var bytes = Encoding.UTF8.GetBytes(jsonData);
|
|||
|
request.RawData = bytes;
|
|||
|
request.Send();
|
|||
|
}
|
|||
|
catch (Exception e)
|
|||
|
{
|
|||
|
DebugUtil.LogError("AppNetConfig.UploadDataToServer Error: {0}", e);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private void NewOnUploadFinished(HTTPRequest request, HTTPResponse response)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
switch (request.State)
|
|||
|
{
|
|||
|
case HTTPRequestStates.Finished:
|
|||
|
{
|
|||
|
var jsonData = response.DataAsText;
|
|||
|
DebugUtil.Log("Upload从服务器获取到的数据:{0}", jsonData);
|
|||
|
JObject jObj = JObject.Parse(jsonData);
|
|||
|
_serverData.code = (int)jObj["code"];
|
|||
|
_serverData.message = jObj["message"]?.ToString();
|
|||
|
if (_serverData.code == 0)
|
|||
|
{
|
|||
|
DebugUtil.Log("服务器保存数据成功 !!!!");
|
|||
|
if (_isNewUser)
|
|||
|
GetDataFromServer();
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
DebugUtil.LogError("Sever Save Error, code: {0}, message: {1}", _serverData.code,
|
|||
|
_serverData.message);
|
|||
|
}
|
|||
|
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
default:
|
|||
|
string text = "Request Finished with Error! " + (request.Exception != null
|
|||
|
? (request.Exception.Message + "\n" + request.Exception.StackTrace)
|
|||
|
: "No Exception");
|
|||
|
DebugUtil.LogError(text);
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
catch (JsonReaderException jsonEx)
|
|||
|
{
|
|||
|
DebugUtil.LogError("Upload JSON parsing error: {0}\nRaw response: {1}", jsonEx.Message,
|
|||
|
response.DataAsText);
|
|||
|
}
|
|||
|
catch (Exception e)
|
|||
|
{
|
|||
|
DebugUtil.LogError("AppNetConfig.OnUploadFinished Error: {0}", e);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private static string GenerateHash(string action, string uniqueID)
|
|||
|
{
|
|||
|
DateTime currentTimeUtc = DateTime.UtcNow;
|
|||
|
var timeStamp = ((DateTimeOffset)currentTimeUtc).ToUnixTimeSeconds();
|
|||
|
_myTime = timeStamp.ToString();
|
|||
|
|
|||
|
Dictionary<string, string> signData = new Dictionary<string, string>
|
|||
|
{
|
|||
|
{ "time", _myTime },
|
|||
|
{ "action", action },
|
|||
|
{ "client_id", uniqueID }
|
|||
|
};
|
|||
|
|
|||
|
SortedDictionary<string, string> sortedData = new SortedDictionary<string, string>(signData);
|
|||
|
string concatenatedData =
|
|||
|
string.Join("&", sortedData.Select(kv => $"{kv.Key}={Uri.EscapeDataString(kv.Value)}"));
|
|||
|
byte[] keyBytes = System.Text.Encoding.UTF8.GetBytes(Sign);
|
|||
|
byte[] dataBytes = System.Text.Encoding.UTF8.GetBytes(concatenatedData);
|
|||
|
using (HMACSHA256 hmac = new HMACSHA256(keyBytes))
|
|||
|
{
|
|||
|
byte[] hashBytes = hmac.ComputeHash(dataBytes);
|
|||
|
string hash = BitConverter.ToString(hashBytes).Replace("-", "").ToLowerInvariant();
|
|||
|
return hash;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|