DlgLogin.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. using AR.Core;
  2. using Cysharp.Threading.Tasks;
  3. using LitJson;
  4. using System;
  5. using System.Collections;
  6. using System.Collections.Generic;
  7. using System.IO;
  8. using System.Linq;
  9. using System.Net;
  10. using System.Net.NetworkInformation;
  11. using TMPro;
  12. using UnityEngine;
  13. using UnityEngine.Networking;
  14. using UnityEngine.UI;
  15. namespace Assets
  16. {
  17. public class DlgLogin : BasePanel
  18. {
  19. public TMP_InputField inputField;
  20. public Button confirmBtn;
  21. public GameObject inputCode;
  22. public GameObject comeBackImg;
  23. WhiteList whiteList;
  24. /// <summary>
  25. /// 白名单URL
  26. /// </summary>
  27. string urlWhiteList = "http://txcdn.starmelody.art/WhiteList.json";
  28. /// <summary>
  29. /// 是否验证Mac地址
  30. /// </summary>
  31. bool isVerify = true;
  32. public override void OnCloseWindow()
  33. {
  34. UIManager.Instance.HideUI(WindowID.DlgLoading);
  35. }
  36. public override void OnDestroyWindow()
  37. {
  38. }
  39. public override void OnInitWindow()
  40. {
  41. //PlayerPrefs.DeleteKey("account");
  42. confirmBtn.onClick.AddListener(async () =>
  43. {
  44. await UIManager.Instance.ShowUI(WindowID.DlgLoading);
  45. VerifyAccount();
  46. });
  47. OnShowWindow();
  48. }
  49. public override void OnShowWindow()
  50. {
  51. string account = PlayerPrefs.GetString("account");
  52. if (string.IsNullOrEmpty(account))
  53. {
  54. Debug.Log("没有本地保存的账号");
  55. inputCode.SetActive(true);
  56. comeBackImg.SetActive(false);
  57. }
  58. else
  59. {
  60. Debug.Log("已有本地保存的账号");
  61. Debug.Log("本地账号" + account);
  62. inputCode.SetActive(false);
  63. comeBackImg.SetActive(true);
  64. inputField.text = account;
  65. }
  66. }
  67. /// <summary>
  68. /// 请求白名单
  69. /// </summary>
  70. /// <returns></returns>
  71. //IEnumerator GetWhiteList()
  72. //{
  73. // UnityWebRequest request = UnityWebRequest.Get(urlWhiteList);
  74. // yield return request.SendWebRequest();
  75. // if (request.result == UnityWebRequest.Result.Success)
  76. // {
  77. // whiteList = JsonMapper.ToObject<WhiteList>(request.downloadHandler.text);
  78. // //StepManager.timeStamp = whiteList.TimeStamp;
  79. // VerifyAccount();
  80. // }
  81. // else
  82. // {
  83. // Debug.Log(request.error);
  84. // StepManager.requestState = StepManager.RequestState.URLFailed;
  85. // yield return UIManager.Instance.ShowUI(WindowID.DlgLoginFaild);
  86. // }
  87. //}
  88. /// <summary>
  89. /// 验证本地账号
  90. /// </summary>
  91. async void VerifyAccount()
  92. {
  93. if (isVerify)
  94. {
  95. StartCoroutine(GetSecretKey());
  96. }
  97. else
  98. {
  99. await UIManager.Instance.ShowUI(WindowID.DlgLoginFaild);
  100. }
  101. }
  102. /// <summary>
  103. /// 获取秘钥
  104. /// </summary>
  105. /// <returns></returns>
  106. IEnumerator GetSecretKey()
  107. {
  108. string url = "http://api.starmelody.art/api/Account/SecretKey";
  109. AccountMsg accountMsg = new AccountMsg();
  110. accountMsg.Account = inputField.text;
  111. string json = JsonMapper.ToJson(accountMsg);
  112. byte[] postBytes = System.Text.Encoding.Default.GetBytes(json);
  113. UnityWebRequest request = UnityWebRequest.Post(url, UnityWebRequest.kHttpVerbPOST);
  114. request.uploadHandler =new UploadHandlerRaw(postBytes);
  115. request.SetRequestHeader("Content-Type", "application/json");
  116. request.timeout = 5;
  117. yield return request.SendWebRequest();
  118. if (request.result == UnityWebRequest.Result.Success)
  119. {
  120. Debug.Log(request.downloadHandler.text);
  121. GetSecretKeyResult result = JsonMapper.ToObject<GetSecretKeyResult>(request.downloadHandler.text);
  122. if (result.code==0)
  123. {
  124. StartCoroutine(Login(result.message));
  125. }
  126. else
  127. {
  128. Debug.Log($"获取秘钥失败:{result.message}");
  129. StepManager.requestCode = result.code;
  130. yield return UIManager.Instance.ShowUI(WindowID.DlgLoginFaild);
  131. }
  132. }
  133. else
  134. {
  135. Debug.Log("密钥请求失败"+request.error);
  136. StepManager.requestCode = 1;
  137. yield return UIManager.Instance.ShowUI(WindowID.DlgLoginFaild);
  138. }
  139. }
  140. /// <summary>
  141. /// 登录请求
  142. /// </summary>
  143. /// <param name="secretKey">秘钥</param>
  144. /// <returns></returns>
  145. IEnumerator Login(string secretKey)
  146. {
  147. string url = "http://api.starmelody.art/api/Account/Login";
  148. Userdata userInfo = new Userdata();
  149. userInfo.account = inputField.text;
  150. userInfo.mac = DesEncryptHelper.Encrypt(GetMacAddress(), secretKey);
  151. string json = JsonMapper.ToJson(userInfo);
  152. byte[] postBytes = System.Text.Encoding.Default.GetBytes(json);
  153. UnityWebRequest request = UnityWebRequest.Post(url, UnityWebRequest.kHttpVerbPOST);
  154. request.uploadHandler = new UploadHandlerRaw(postBytes);
  155. request.SetRequestHeader("Content-Type", "application/json");
  156. yield return request.SendWebRequest();
  157. if (request.result == UnityWebRequest.Result.Success)
  158. {
  159. Debug.Log(request.downloadHandler.text);
  160. LoginResult loginResult = JsonMapper.ToObject<LoginResult>(request.downloadHandler.text);
  161. //switch (loginResult.code)
  162. //{
  163. // case 0:
  164. // PlayerPrefs.SetString("account", inputField.text);
  165. // PlayerPrefs.Save();
  166. // StepManager.timeStamp = loginResult.data;
  167. // UIManager.Instance.HideUI(WindowID.DlgLogin);
  168. // yield return UIManager.Instance.ShowUI(WindowID.FaceBuildPanel);
  169. // break;
  170. // case 1001:
  171. // //Mac地址错误
  172. // StepManager.requestState = StepManager.RequestState.MacFailed;
  173. // yield return UIManager.Instance.ShowUI(WindowID.DlgLoginFaild);
  174. // break;
  175. // case 1002:
  176. // //登录超时
  177. // StepManager.requestState = StepManager.RequestState.TimeOut;
  178. // yield return UIManager.Instance.ShowUI(WindowID.DlgLoginFaild);
  179. // break;
  180. // case 1003:
  181. // //频繁请求,请求超限制
  182. // StepManager.requestState = StepManager.RequestState.Frequently;
  183. // yield return UIManager.Instance.ShowUI(WindowID.DlgLoginFaild);
  184. // break;
  185. // case 1004:
  186. // //不在白名单
  187. // StepManager.requestState = StepManager.RequestState.HashFailed;
  188. // yield return UIManager.Instance.ShowUI(WindowID.DlgLoginFaild);
  189. // break;
  190. //}
  191. if (loginResult.code == 0)
  192. {
  193. PlayerPrefs.SetString("account", inputField.text);
  194. PlayerPrefs.Save();
  195. StepManager.timeStamp = loginResult.data;
  196. UIManager.Instance.HideUI(WindowID.DlgLogin);
  197. yield return UIManager.Instance.ShowUI(WindowID.FaceBuildPanel);
  198. }
  199. else
  200. {
  201. StepManager.requestCode = loginResult.code;
  202. yield return UIManager.Instance.ShowUI(WindowID.DlgLoginFaild);
  203. }
  204. }
  205. else
  206. {
  207. Debug.Log("登录请求"+request.error);
  208. //网络连接失败
  209. StepManager.requestCode = 1;
  210. yield return UIManager.Instance.ShowUI(WindowID.DlgLoginFaild);
  211. }
  212. }
  213. /// <summary>
  214. /// 获取本机Mac地址
  215. /// </summary>
  216. /// <returns></returns>
  217. private string GetMacAddress()
  218. {
  219. string physicalAddress = "";
  220. NetworkInterface[] nice = NetworkInterface.GetAllNetworkInterfaces();
  221. foreach (NetworkInterface adaper in nice)
  222. {
  223. if (adaper.Description == "en0")
  224. {
  225. physicalAddress = adaper.GetPhysicalAddress().ToString();
  226. break;
  227. }
  228. else
  229. {
  230. physicalAddress = adaper.GetPhysicalAddress().ToString();
  231. if (physicalAddress != "")
  232. {
  233. break;
  234. };
  235. }
  236. }
  237. Debug.Log("Mac地址:"+physicalAddress);
  238. #if UNITY_ANDROID
  239. return SystemInfo.deviceUniqueIdentifier;
  240. #else
  241. return physicalAddress;
  242. #endif
  243. }
  244. public async void LoadJson()
  245. {
  246. var txtAsset = await YooAssetManager.Instance.LoadAsset<TextAsset>("Assets/Bundles/Config/WhiteList");
  247. whiteList = JsonMapper.ToObject<WhiteList>(txtAsset.text);
  248. }
  249. }
  250. /// <summary>
  251. /// 账号和Mac地址
  252. /// </summary>
  253. struct Userdata
  254. {
  255. public string account;
  256. public string mac;
  257. }
  258. /// <summary>
  259. /// 输入账号
  260. /// </summary>
  261. struct AccountMsg
  262. {
  263. public string Account;
  264. }
  265. /// <summary>
  266. /// 秘钥返回值
  267. /// </summary>
  268. struct GetSecretKeyResult
  269. {
  270. public int code;
  271. public string message;
  272. public string data;
  273. }
  274. /// <summary>
  275. /// 登录返回值
  276. /// </summary>
  277. struct LoginResult
  278. {
  279. public int code;
  280. public string message;
  281. public long data;
  282. }
  283. /// <summary>
  284. /// 白名单数据
  285. /// </summary>
  286. struct WhiteList
  287. {
  288. public string[] table;
  289. public string TimeStamp;
  290. }
  291. }