瀏覽代碼

添加新的sdk访问接口

slambb 6 月之前
父節點
當前提交
6e851418b1
共有 2 個文件被更改,包括 697 次插入3 次删除
  1. 157 0
      SmartBowSDK/SmartBowHelper.cs
  2. 540 3
      SmartBowSDK/SmartBowNetwork.cs

+ 157 - 0
SmartBowSDK/SmartBowHelper.cs

@@ -54,8 +54,82 @@ namespace SmartBowSDK
 
             return bluetoothAim.CreateWindowBLE();
         }
+        #region 手机验证
+
+        /// <summary>
+        /// 发送手机验证码
+        /// </summary>
+        public void SendPhoneValidateCode(string phone, int language, Action<RequestResult> callback)
+        {
+            smartBowNetwork.SendPhoneValidateCode(phone, language, callback);
+        }
+
+        /// <summary>
+        /// 验证手机验证码
+        /// </summary>
+        public void ValidatePhone(string phone, int code, Action<RequestResult> callback)
+        {
+            smartBowNetwork.ValidatePhoneCode(phone, code, callback);
+        }
+
+        #endregion
+
+        #region 邮箱验证
+
+        /// <summary>
+        /// 发送邮箱验证码
+        /// </summary>
+        public void SendEmailValidateCode(string email, int language, Action<RequestResult> callback)
+        {
+            smartBowNetwork.SendEmailValidateCode(email, language, callback);
+        }
+
+        /// <summary>
+        /// 验证邮箱验证码
+        /// </summary>
+        public void ValidateEmail(string email, int code, Action<RequestResult> callback)
+        {
+            smartBowNetwork.SendEmailValidateCode(email, code, callback);
+        }
+
+        #endregion
+
+        #region 注册
+
+        /// <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 Register(int serverIndex, string username, string password, string email, string phone,int code, Action<RequestResult> callback)
+        {
+            smartBowNetwork.RegisterByCode(serverIndex, username, password, email, phone, code, callback);
+        }
+
+        /// <summary>
+        /// 重置密码(支持邮箱或手机号)
+        /// </summary>
+        /// <param name="serverIndex">服务器索引</param>
+        /// <param name="account">账号(邮箱或手机号,现在国内用手机,海外用邮箱)</param>
+        /// <param name="code">验证码</param>
+        /// <param name="newPassword">新密码</param>
+        /// <param name="callback">回调结果</param>
+        public void ResetPassword(int serverIndex,string account, string codeAccount, int code, string newPassword, Action<RequestResult> callback)
+        {
+            smartBowNetwork.ResetPasswordByAccount(serverIndex, account, codeAccount, code, newPassword, callback);
+        }
+
+
+
+        #endregion
 
         #region 登录
+
         /// <summary>
         /// 用户登录
         /// </summary>
@@ -86,8 +160,91 @@ namespace SmartBowSDK
         {
             smartBowNetwork.GetUserInfo(callback);
         }
+        /// <summary>
+        /// 设置用户名
+        /// </summary>
+        public void SaveUserName(string nickname, Action<RequestResult> callback)
+        {
+            smartBowNetwork.SaveUserName(nickname, callback);
+        }
+
+        /// <summary>
+        /// 设置用户扩展信息
+        /// </summary>
+        public void SaveUserInfo(UserInfoExtended userInfo, Action<RequestResult> callback)
+        {
+            smartBowNetwork.SaveUserInfo(userInfo, callback);
+        }
+        #endregion
+
+        #region 分数上传
+
+        /// <summary>
+        /// 上传单人赛季成绩
+        /// </summary>
+        public void UploadSeasonSinglePlayerGameRes(string secret, int score, Action<RequestResult> callback)
+        {
+            smartBowNetwork.UploadSeasonSinglePlayerGameRes(secret, score, callback);
+        }
+
+        /// <summary>
+        /// 上传PK赛季成绩
+        /// </summary>
+        public void UploadSeasonPKGameRes(string roomKey, string secret, int p2ID, int gameRes, Action<RequestResult> callback)
+        {
+            smartBowNetwork.UploadSeasonPKGameRes(roomKey, secret, p2ID, gameRes, callback);
+        }
+
         #endregion
 
+        #region 排行榜
+
+        /// <summary>
+        /// 获取排行榜(按游戏类型)
+        /// </summary>
+        public void GetSeasonRankListByGameType(string secret, int rankArea, string country, string state, string city, Action<RequestResult> callback)
+        {
+            smartBowNetwork.GetSeasonRankListByGameType(secret, rankArea, country, state, city, callback);
+        }
+
+        /// <summary>
+        /// 获取自定义排行榜
+        /// </summary>
+        public void GetSeasonRankListByCustom(string secret, int rankArea, string country, string state, string city, int rankType, int count, Action<RequestResult> callback)
+        {
+            smartBowNetwork.GetSeasonRankListByCustom(secret, rankArea, country, state, city, rankType, count, callback);
+        }
+
+        /// <summary>
+        /// 获取当前用户的排名信息
+        /// </summary>
+        public void GetUserRankByGameType(string secret, int rankArea, string country, string state, string city, int rankType, int count, Action<RequestResult> callback)
+        {
+            smartBowNetwork.GetUserRankByGameType(secret, rankArea, country, state, city, rankType, count, callback);
+        }
+
+        #endregion
+
+        #region 定制游戏上传接口
+        /// <summary>
+        /// 上传自定义排行榜分数
+        /// </summary>
+        public void UploadCustomLeaderboardScore(string secret, int taskId, int difficultType, int modeType, int deviceType, int score, Action<RequestResult> callback)
+        {
+            smartBowNetwork.UploadCustomLeaderboardScore(secret, taskId, difficultType, modeType, deviceType, score, callback);
+        }
+
+        /// <summary>
+        /// 获取自定义排行榜数据
+        /// </summary>
+        public void GetCustomLeaderboard(string secret, int taskId, int difficultType, int modeType, int deviceType, int timeType, Action<RequestResult> callback)
+        {
+            smartBowNetwork.GetCustomLeaderboard(secret, taskId, difficultType, modeType, deviceType, timeType, callback);
+        }
+
+        #endregion
+
+
         #region 蓝牙:蓝牙部分新增修改,添加当前判断设备mac
         ///// <summary>
         ///// 连接蓝牙模块

+ 540 - 3
SmartBowSDK/SmartBowNetwork.cs

@@ -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;
+    }
 }