| 
					
				 | 
			
			
				@@ -11,10 +11,263 @@ namespace SmartBowSDK 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         public SmartBowHelper smartBowHelper; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        private const string serverURL = "https://xmjssvr.cn/SmartBowBusinessServer"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 本地 IP 地址(只在本地环境下生效) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        static string localIPAddress = "192.168.0.108"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //是否使用本地环境 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        static bool isLocal = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 服务器路径 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        static string serverPath = "/SmartBowBusinessServer"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 最终服务器地址 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        static string serverURL => isLocal 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ? $"http://{localIPAddress}:11432{serverPath}" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            : $"https://xmjssvr.cn{serverPath}"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //private string serverURL = "https://xmjssvr.cn/SmartBowBusinessServer"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         //private const string serverURL = "http://127.0.0.1:11332/SmartBowBusinessServer"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         private string loginToken; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// 运行时设置本地 IP 并启用本地环境 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// </summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public static void SetLocal(string ip) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            isLocal = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            localIPAddress = ip; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Debug.Log($"[SmartBowNetwork] 设置IP: {ip}"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// 发送手机验证码 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// </summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void SendPhoneValidateCode(string phone, int language, Action<RequestResult> callback) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            string url = $"{serverURL}/phoneValidate/sendPhoneValidateCode" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                         $"?phone={UnityWebRequest.EscapeURL(phone)}&language={language}"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            StartCoroutine(Post(url, new WWWForm(), callback)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// 验证手机验证码 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// </summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void ValidatePhoneCode(string phone, int code, Action<RequestResult> callback) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            string url = $"{serverURL}/phoneValidate/validatePhone" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                         $"?phone={UnityWebRequest.EscapeURL(phone)}&code={code}"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            StartCoroutine(Post(url, new WWWForm(), callback)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// 发送邮箱验证码 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// </summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void SendEmailValidateCode(string email, int language, Action<RequestResult> callback) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            string url = $"{serverURL}/emailValidate/sendEmailValidateCode" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                         $"?email={UnityWebRequest.EscapeURL(email)}&language={language}"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            StartCoroutine(Post(url, new WWWForm(), callback)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// 验证邮箱验证码 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// </summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void ValidateEmailCode(string email, int code, Action<RequestResult> callback) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            string url = $"{serverURL}/emailValidate/validateEmail" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                         $"?email={UnityWebRequest.EscapeURL(email)}&code={code}"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            StartCoroutine(Post(url, new WWWForm(), callback)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// 用户注册 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// </summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="serverIndex">服务器索引</param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="username">用户名</param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="password">密码</param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="email">邮箱</param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="phone">手机号</param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="code">当前接收的code,海外用邮箱 serverIndex = 1,国内 serverIndex = 0用手机号</param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="callback">回调</param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void RegisterByCode(int serverIndex, string username, string password, string email, string phone,int code, Action<RequestResult> callback) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            string url = $"{serverURL}/gameLogin/registerByCode" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                         $"?serverIndex={serverIndex}" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                         $"&username={UnityWebRequest.EscapeURL(username)}" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                         $"&password={UnityWebRequest.EscapeURL(password)}" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                         $"&email={UnityWebRequest.EscapeURL(email)}" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                         $"&phone={UnityWebRequest.EscapeURL(phone)}" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                         $"&code={code}"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            StartCoroutine(Post(url, new WWWForm(), callback)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //public IEnumerator ListUsernamesByEmail(string email, long timestamp, string sign, Action<RequestResult> callback) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //    string url = serverURL + "/gameLogin/listUsernamesByEmail"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //    WWWForm form = new WWWForm(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //    form.AddField("email", email); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //    form.AddField("timestamp", timestamp.ToString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //    form.AddField("sign", sign); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //    using (UnityWebRequest request = UnityWebRequest.Post(url, form)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //        yield return request.SendWebRequest(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //        RequestResult requestResult = JsonConvert.DeserializeObject<RequestResult>(request.downloadHandler.text); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //        if (callback != null) callback(requestResult); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //public IEnumerator ListUsernamesByPhone(string phone, long timestamp, string sign, Action<RequestResult> callback) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //    string url = serverURL + "/gameLogin/listUsernamesByPhone"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //    WWWForm form = new WWWForm(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //    form.AddField("phone", phone); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //    form.AddField("timestamp", timestamp.ToString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //    form.AddField("sign", sign); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //    using (UnityWebRequest request = UnityWebRequest.Post(url, form)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //        yield return request.SendWebRequest(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //        RequestResult requestResult = JsonConvert.DeserializeObject<RequestResult>(request.downloadHandler.text); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //        if (callback != null) callback(requestResult); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //public IEnumerator ResetPassword(string sign, long timestamp, string username, string password, Action<RequestResult> callback) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //    string url = serverURL + "/gameLogin/resetPassword"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //    WWWForm form = new WWWForm(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //    form.AddField("sign", sign); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //    form.AddField("timestamp", timestamp.ToString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //    form.AddField("username", username); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //    form.AddField("password", password); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //    using (UnityWebRequest request = UnityWebRequest.Post(url, form)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //        yield return request.SendWebRequest(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //        RequestResult requestResult = JsonConvert.DeserializeObject<RequestResult>(request.downloadHandler.text); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //        if (callback != null) callback(requestResult); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //重置密码 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void ResetPasswordByAccount(int serverIndex,string account, string codeAccount, int code, string newPassword, Action<RequestResult> callback) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            StartCoroutine(ResetPasswordByAccountCoroutine(serverIndex,account, codeAccount, code, newPassword,  callback)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// 重置密码流程,先验证Code,在获取list,再重置对应的账号。 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// 基本和弓箭app流程一样 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// </summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="serverIndex"></param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="account"></param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="codeAccount"></param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="code"></param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="newPassword"></param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="callback"></param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <returns></returns> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private IEnumerator ResetPasswordByAccountCoroutine(int serverIndex,string account,string codeAccount, int code, string newPassword, Action<RequestResult> callback) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            RequestResult validateResult = null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (!(serverIndex >= 0 && serverIndex <= 2)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                callback?.Invoke(new RequestResult 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    code = -10, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    msg = "serverIndex 错误!", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                yield break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            bool isPhone = serverIndex == 0 ? true : false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // 1. 验证验证码 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            string validateUrl = isPhone 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ? $"{serverURL}/phoneValidate/validatePhone?phone={UnityWebRequest.EscapeURL(codeAccount)}&code={code}" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                : $"{serverURL}/emailValidate/validateEmail?email={UnityWebRequest.EscapeURL(codeAccount)}&code={code}"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            yield return Post(validateUrl, new WWWForm(), result => validateResult = result); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (validateResult == null || validateResult.code != 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                callback?.Invoke(new RequestResult 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    code = -10, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    msg = isPhone ? "手机号验证码验证失败" : "邮箱验证码验证失败" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                yield break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // 2. 提取验证信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            JObject data = validateResult.data as JObject; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            string verifiedAccount = data.Value<string>(isPhone ? "phone" : "email"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            long timestamp = data.Value<long>("timestamp"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            string sign = data.Value<string>("sign"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // 3. 查询用户名 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            RequestResult listResult = null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            string listUrl = isPhone 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ? $"{serverURL}/gameLogin/listUsernamesByPhone" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                : $"{serverURL}/gameLogin/listUsernamesByEmail"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            WWWForm listForm = new WWWForm(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            listForm.AddField(isPhone ? "phone" : "email", verifiedAccount); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            listForm.AddField("timestamp", timestamp.ToString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            listForm.AddField("sign", sign); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            yield return Post(listUrl, listForm, result => listResult = result); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (listResult == null || listResult.code != 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                callback?.Invoke(new RequestResult { code = -11, msg = "未找到绑定的账号" }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                yield break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // 4. 精确匹配账号名再重置密码 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            JArray users = listResult.data as JArray; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            bool matched = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            foreach (var item in users) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                string username = item.Value<string>("username"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                long ts = item.Value<long>("timestamp"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                string sgn = item.Value<string>("sign"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                SmartBowLogger.Log(this,$"server: {username} vs account: {account}"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (account.ToLower() == username.ToLower()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    matched = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    SmartBowLogger.Log(this,"匹配成功:" + username.ToLower()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    // 5. 请求重置密码 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    string resetUrl = $"{serverURL}/gameLogin/resetPassword"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    WWWForm resetForm = new WWWForm(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    resetForm.AddField("sign", sgn); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    resetForm.AddField("timestamp", ts.ToString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    resetForm.AddField("username", username); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    resetForm.AddField("password", newPassword); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    yield return Post(resetUrl, resetForm, callback); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // 6. 如果没有匹配账号,提示 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (!matched) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                callback?.Invoke(new RequestResult { code = -12, msg = "未找到对应账号绑定" }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// 登录  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// gameID和channelID请询问插件给予者给予 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// </summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="gameID"></param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="channelID"></param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="username"></param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="password"></param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="callback"></param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         public void Login(string gameID, string channelID, string username, string password, Action<LoginResult> callback) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             WWWForm form = new WWWForm(); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -32,13 +285,19 @@ namespace SmartBowSDK 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 callback?.Invoke(loginResult); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             })); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// 登出 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// </summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="callback"></param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         public void Logout(Action<bool> callback) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             loginToken = null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             callback?.Invoke(true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// 获取用户信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// </summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="callback"></param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         public void GetUserInfo(Action<GetUserInfoResult> callback) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             GetUserInfoResult getUserInfoResult = new GetUserInfoResult(); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -62,6 +321,240 @@ namespace SmartBowSDK 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 callback?.Invoke(getUserInfoResult); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             })); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// 设置用户名 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// </summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="nickname">用户名字</param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="callback"></param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void SaveUserName(string nickname, Action<RequestResult> callback) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (loginToken == null) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                callback?.Invoke(new RequestResult { msg = "尚未登录" }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            string url = $"{serverURL}/SmartBowSDK/saveUserName?token={loginToken}&nickname={UnityWebRequest.EscapeURL(nickname)}"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            StartCoroutine(Post(url, new WWWForm(), callback)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// 设置用户的多个信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// </summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="userInfo">用户信息对象</param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="callback"></param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void SaveUserInfo(UserInfoExtended userInfo, Action<RequestResult> callback) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (loginToken == null) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                callback?.Invoke(new RequestResult { msg = "尚未登录" }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            string json = JsonConvert.SerializeObject(userInfo); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            UnityWebRequest request = new UnityWebRequest($"{serverURL}/SmartBowSDK/saveUserInfo?token={loginToken}", "POST"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            byte[] bodyRaw = System.Text.Encoding.UTF8.GetBytes(json); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            request.uploadHandler = new UploadHandlerRaw(bodyRaw); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            request.downloadHandler = new DownloadHandlerBuffer(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            request.SetRequestHeader("Content-Type", "application/json"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            StartCoroutine(SendRequest(request, callback)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// 根据密钥上传分数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// </summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="secret"></param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="score"></param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="callback"></param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void UploadSeasonSinglePlayerGameRes(string secret, int score, Action<RequestResult> callback) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (loginToken == null) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                callback?.Invoke(new RequestResult { msg = "尚未登录" }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            string url = $"{serverURL}/SmartBowSDK/UploadSeasonSinglePlayerGameRes?token={loginToken}&secret={UnityWebRequest.EscapeURL(secret)}&score={score}"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            StartCoroutine(Post(url, new WWWForm(), callback)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// 上传赛季PK分数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// </summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="roomKey">PK房间ID</param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="secret">密钥,游戏类型(解析得到)</param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="p2ID">对手ID</param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="gameRes">结果(0:我赢;1:他赢;2:平局)</param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="callback">回调</param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void UploadSeasonPKGameRes(string roomKey, string secret, int p2ID, int gameRes, Action<RequestResult> callback) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (loginToken == null) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                callback?.Invoke(new RequestResult { msg = "尚未登录" }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            string url = $"{serverURL}/SmartBowSDK/UploadSeasonPKGameRes" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                         $"?token={loginToken}" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                         $"&roomKey={UnityWebRequest.EscapeURL(roomKey)}" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                         $"&secret={UnityWebRequest.EscapeURL(secret)}" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                         $"&p2ID={p2ID}" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                         $"&gameRes={gameRes}"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            StartCoroutine(Post(url, new WWWForm(), callback)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// 根据密钥获取排行榜 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// </summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="secret">密钥</param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="rankArea">排行区域 3:国,1:省,2市,其他:全球</param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="country">国家</param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="state">省</param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="city">城市</param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="callback"></param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void GetSeasonRankListByGameType(string secret, int rankArea, string country, string state, string city, Action<RequestResult> callback) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (loginToken == null) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                callback?.Invoke(new RequestResult { msg = "尚未登录" }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            string url = $"{serverURL}/SmartBowSDK/GetSeasonRankListByGameType?" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                $"token={loginToken}" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                $"&rankArea={rankArea}" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                $"&secret={UnityWebRequest.EscapeURL(secret)}" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                $"&countryCode={UnityWebRequest.EscapeURL(country)}" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                $"&stateCode={UnityWebRequest.EscapeURL(state)}" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                $"&cityCode={UnityWebRequest.EscapeURL(city)}"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            StartCoroutine(Post(url, new WWWForm(), callback)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// 根据密钥获取自定义排行榜 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// </summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="secret">密钥</param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="rankArea">排行区域 3:国,1:省,2市,其他:全球</param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="country">国家</param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="state">省</param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="city">市</param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="rankType">1是降序,其他是升序(不能小于0)</param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="count">数量:不能小于0</param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="callback"></param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void GetSeasonRankListByCustom(string secret, int rankArea, string country, string state, string city, int rankType, int count, Action<RequestResult> callback) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (loginToken == null) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                callback?.Invoke(new RequestResult { msg = "尚未登录" }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            string url = $"{serverURL}/SmartBowSDK/GetSeasonRankListByCustom?" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              $"token={loginToken}" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              $"&rankArea={rankArea}" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              $"&secret={UnityWebRequest.EscapeURL(secret)}" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              $"&countryCode={UnityWebRequest.EscapeURL(country)}" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              $"&stateCode={UnityWebRequest.EscapeURL(state)}" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              $"&cityCode={UnityWebRequest.EscapeURL(city)}" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              $"&rankType={rankType}" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              $"&count={count}"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            StartCoroutine(Post(url, new WWWForm(), callback)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// 获取自己的用户信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// </summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="secret">密钥</param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="rankArea">排行区域 3:国,1:省,2市,其他:全球</param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="country">国家</param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="state">省</param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="city">市</param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="rankType">1是降序,其他是升序(不能小于0)</param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="count">数量:不能小于0</param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="callback"></param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void GetUserRankByGameType(string secret, int rankArea, string country, string state, string city, int rankType, int count, Action<RequestResult> callback) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (loginToken == null) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                callback?.Invoke(new RequestResult { msg = "尚未登录" }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            string url = $"{serverURL}/SmartBowSDK/getUserRankByGameType?" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+               $"token={loginToken}" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+               $"&rankArea={rankArea}" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+               $"&secret={UnityWebRequest.EscapeURL(secret)}" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+               $"&countryCode={UnityWebRequest.EscapeURL(country)}" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+               $"&stateCode={UnityWebRequest.EscapeURL(state)}" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+               $"&cityCode={UnityWebRequest.EscapeURL(city)}" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+               $"&rankType={rankType}" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+               $"&count={count}"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            StartCoroutine(Post(url, new WWWForm(), callback)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// 上传排行榜分数(定制) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// </summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="secret">密钥</param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="taskId">任务类型</param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="difficultType">难度</param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="modeType">模式</param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="deviceType">设备类型</param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="score">分数(>=0)</param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="callback">回调</param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void UploadCustomLeaderboardScore(string secret, int taskId, int difficultType, int modeType, int deviceType, int score, Action<RequestResult> callback) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (loginToken == null) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                callback?.Invoke(new RequestResult { msg = "尚未登录" }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (score < 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                callback?.Invoke(new RequestResult { msg = "分数不能小于0" }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            string url = $"{serverURL}/SmartBowSDK/UploadCustomLeaderboardScore"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            WWWForm form = new WWWForm(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            form.AddField("token", loginToken); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            form.AddField("secret", secret); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            form.AddField("taskId", taskId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            form.AddField("difficultType", difficultType); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            form.AddField("modeType", modeType); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            form.AddField("deviceType", deviceType); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            form.AddField("score", score); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            StartCoroutine(Post(url, form, callback)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// 获取排行榜(自定义) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// </summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="secret">密钥</param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="taskId">任务类型</param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="difficultType">难度</param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="modeType">模式</param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="deviceType">设备类型</param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="timeType">时间维度</param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <param name="callback">回调</param> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void GetCustomLeaderboard(string secret, int taskId, int difficultType, int modeType, int deviceType, int timeType, Action<RequestResult> callback) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (loginToken == null) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                callback?.Invoke(new RequestResult { msg = "尚未登录" }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            string url = $"{serverURL}/SmartBowSDK/GetCustomLeaderboard"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            WWWForm form = new WWWForm(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            form.AddField("token", loginToken); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            form.AddField("secret", secret); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            form.AddField("taskId", taskId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            form.AddField("difficultType", difficultType); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            form.AddField("modeType", modeType); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            form.AddField("deviceType", deviceType); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            form.AddField("timeType", timeType); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            StartCoroutine(Post(url, form, callback)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         private string GetCalibrateDataStorageLocalKey(string mac) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -126,6 +619,15 @@ namespace SmartBowSDK 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 callback?.Invoke(sprite); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private IEnumerator SendRequest(UnityWebRequest request, Action<RequestResult> callback) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            yield return request.SendWebRequest(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (request.result == UnityWebRequest.Result.Success) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                callback?.Invoke(JsonConvert.DeserializeObject<RequestResult>(request.downloadHandler.text)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                callback?.Invoke(new RequestResult()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     public class RequestResult 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -178,4 +680,39 @@ namespace SmartBowSDK 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         /// </summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         public int gender; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /// <summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /// 用户数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /// </summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public class UserInfoExtended 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// //头像url 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// </summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public string avatarUrl; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ///  //名字 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// </summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public string nickname; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// //性别 1 男,2女 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// </summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public int gender; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// 生日 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// </summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public string birthday; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// 国家 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// </summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public string country; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// 省 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// </summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public string state; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// 城市 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// </summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public string city; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 |