using Cysharp.Threading.Tasks; using Framework; using System; using System.Collections.Generic; using System.Linq; using System.Security.Cryptography; using System.Text; using TMPro; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.Networking; [RequireComponent(typeof(TMP_Text))] public class LinkText : MonoBehaviour, IPointerClickHandler { public void OnPointerClick(PointerEventData eventData) { TMP_Text pTextMeshPro = GetComponent(); int linkIndex = TMP_TextUtilities.FindIntersectingLink(pTextMeshPro, eventData.position, eventData.pressEventCamera); // If you are not in a Canvas using Screen Overlay, put your camera instead of null if (linkIndex != -1) { TMP_LinkInfo linkInfo = pTextMeshPro.textInfo.linkInfo[linkIndex]; DebugUtil.Log("OnPointerClick called."); DebugUtil.Log("Link ID: \"" + linkInfo.GetLinkID() + "\" Link Text: \"" + linkInfo.GetLinkText()); //Application.OpenURL(linkInfo.GetLinkID()); Action(linkInfo.GetLinkID()); } } void Action(string linkID) { DebugUtil.Log("Action called."); DebugUtil.Log("Link ID: " + linkID); if(linkID == "api_01") { var headData = PostHeader.PostHeaderInfo(new Dictionary { {"timestamp", DateTimeOffset.UtcNow.ToUnixTimeSeconds().ToString() } }); UnityWebRequest www = new UnityWebRequest("http://192.168.3.90:19999/api/v1/agreements", UnityWebRequest.kHttpVerbPOST) { downloadHandler = new DownloadHandlerBuffer(), }; www.SetRequestHeader("signature", headData["signature"]); www.SetRequestHeader("timestamp", headData["timestamp"]); try { //await www.SendWebRequest(); if (www.result != UnityWebRequest.Result.Success) { DebugUtil.LogError(www.downloadHandler.text); } else { DebugUtil.Log("http消息请求成功!\n返回内容:" + www.downloadHandler.text); //WebRequestResult result = JsonConvert.DeserializeObject(www.downloadHandler.text); //if (result.code == 0) //{ // //send success msg // DebugUtil.Log("短信验证码请求成功"); //} //else //{ // //send fail msg // EventManager.Instance.Send(EventManager.EventName.PhoneCodeRequsetFail, "请求失败!" + result.message); // DebugUtil.LogError("请求失败!" + result.message); //} //callback?.Invoke(result.code, result.message); } } catch (UnityWebRequestException e) { DebugUtil.LogError(e); EventManager.Instance.Send(EventManager.EventName.PhoneCodeRequsetFail, "请求失败!"); //callback?.Invoke(-1, e.Message); } } else if(linkID == "api_02") { var headData = PostHeader.PostHeaderInfo(new Dictionary { {"timestamp", DateTimeOffset.UtcNow.ToUnixTimeSeconds().ToString() } }); //post data //var jsonData = JsonUtility.ToJson(sendData); //byte[] bytes = Encoding.UTF8.GetBytes(jsonData); UnityWebRequest www = new UnityWebRequest("http://192.168.3.90:19999/api/v1/agreements", UnityWebRequest.kHttpVerbPOST) { //uploadHandler = new UploadHandlerRaw(bytes), downloadHandler = new DownloadHandlerBuffer(), }; //www.SetRequestHeader("Content-Type", "application/json;charset=utf-8");//为了保证客户端发送的json格式在后端能解析 www.SetRequestHeader("signature", headData["signature"]); www.SetRequestHeader("timestamp", headData["timestamp"]); try { //await www.SendWebRequest(); if (www.result != UnityWebRequest.Result.Success) { DebugUtil.LogError(www.downloadHandler); //DebugUtil.LogError(www.downloadHandler.text); } else { DebugUtil.Log("http消息请求成功!\n返回内容:" + www.downloadHandler.text); //WebRequestResult result = JsonConvert.DeserializeObject(www.downloadHandler.text); //if (result.code == 0) //{ // //send success msg // DebugUtil.Log("短信验证码请求成功"); //} //else //{ // //send fail msg // EventManager.Instance.Send(EventManager.EventName.PhoneCodeRequsetFail, "请求失败!" + result.message); // DebugUtil.LogError("请求失败!" + result.message); //} //callback?.Invoke(result.code, result.message); } } catch (UnityWebRequestException e) { DebugUtil.LogError(e); EventManager.Instance.Send(EventManager.EventName.PhoneCodeRequsetFail, "请求失败!"); //callback?.Invoke(-1, e.Message); } } else { DebugUtil.Log("Unknown link clicked."); } } } /// /// 头部加密 /// public class PostHeader { /// /// 加密拼接密钥 /// static string key = "OfqCL-_jJa9Sm1Nl-TPXvm3drI9td1RPoWn3eLjTe18="; /// /// 头部加密信息 /// /// /// public static Dictionary PostHeaderInfo(Dictionary param) { DateTimeOffset now = DateTimeOffset.UtcNow; string timeStamp = now.ToUnixTimeSeconds().ToString(); var encodeData = new EncodeData(param); string encodeStr = encodeData.GetEncodeData(); var md5 = EncodeData.GetMd5Hash(encodeStr); string linkStr = md5 + key; string sign = EncodeData.GetSha256Hash(linkStr); Dictionary header = new(); header["signature"] = sign; header["timestamp"] = timeStamp; return header; } public class EncodeData { Dictionary data = new Dictionary(); public EncodeData(Dictionary data) { this.data = data; } public string GetEncodeData() { List key = data.Keys.Where(k => k != "signature").ToList(); key.Sort(); List keyValuePairs = key.Select(k => k + "=" + data[k]).ToList(); string concatenate = string.Join("&", keyValuePairs); //DebugUtil.Log("排序结果:" + concatenate); return concatenate; } public static string GetMd5Hash(string input) { using (MD5 md5 = MD5.Create()) { byte[] inputBytes = Encoding.UTF8.GetBytes(input); byte[] hashBytes = md5.ComputeHash(inputBytes); StringBuilder sb = new StringBuilder(); for (int i = 0; i < hashBytes.Length; i++) { sb.Append(hashBytes[i].ToString("x2")); } return sb.ToString(); } } public static string GetSha256Hash(string input) { using (SHA256 sha256 = SHA256.Create()) { byte[] inputBytes = Encoding.UTF8.GetBytes(input); byte[] hashBytes = sha256.ComputeHash(inputBytes); StringBuilder sb = new StringBuilder(); for (int i = 0; i < hashBytes.Length; i++) { sb.Append(hashBytes[i].ToString("x2")); } return sb.ToString(); } } } }