using Newtonsoft.Json; using System.Security.Cryptography; using System.Text; using System.Threading.Channels; using YD_WeChatApplet.Api.Services.Interface; using YD_WeChatApplet.Api.Utilities; using YD_WeChatApplet.Commons; using YD_WeChatApplet.Commons.Dto.JingShiTiJiao; using YD_WeChatApplet.Commons.Utils; namespace YD_WeChatApplet.Api.Services.Impl { /// /// 京师体教接口服务 /// public class JingShiTiJiaoService : IJingShiTiJiaoService { private readonly ILogger _logger; public JingShiTiJiaoService(ILogger logger) { _logger = logger; } /// /// 根据教师获取教师年级班级信息 /// /// public async Task GetClassListByTeacher(string teacherNo) { var res = new TeacherClassData(); long timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); string nonce = SaTokenSignHelper.RandomString(20); // 1. 签名参数 var paramMap = new Dictionary { { "channel", AppSettings.JingShiTiJiao.Channel }, { "teacherNo", teacherNo }, { "timestamp", timestamp }, { "nonce", nonce } }; // 4. 构建签名 QueryString string queryStr = SaTokenSignHelper.BuildQueryString(paramMap, AppSettings.JingShiTiJiao.SecretKey); // 5. 拼接最终 URL string url = $"{AppSettings.JingShiTiJiao.BaseUrl}/api/open/class/by/teacher?{queryStr}"; string json = await HttpManager.HttpGetAsync(url); if (string.IsNullOrWhiteSpace(json)) return res; var data = JsonConvert.DeserializeObject>(json); if (data != null && data.Code == 0) { string token = JwtHelper.IssueJwt(new UserInfoDto() { User_Id = -1, UserName = data.Data.TeacherName, Role_Id = 2, PhoneNo = data.Data.TeacherNo, SchoolCode = data.Data.SchoolNo, UserNo = data.Data.TeacherNo }); data.Data.Token = token; return data.Data; } return res; } /// /// 根据班级编号获取学生列表 /// /// /// /// public async Task> GetStuListByClass(string classNo) { var res = new List(); long timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); string nonce = SaTokenSignHelper.RandomString(20); // 1. 签名参数 var paramMap = new Dictionary { { "channel", AppSettings.JingShiTiJiao.Channel }, { "classNo", classNo }, { "timestamp", timestamp }, { "nonce", nonce } }; // 4. 构建签名 QueryString string queryStr = SaTokenSignHelper.BuildQueryString(paramMap, AppSettings.JingShiTiJiao.SecretKey); // 5. 拼接最终 URL string url = $"{AppSettings.JingShiTiJiao.BaseUrl}/api/open/stu/by/class?{queryStr}"; string json = await HttpManager.HttpGetAsync(url); if (string.IsNullOrWhiteSpace(json)) return res; var data = JsonConvert.DeserializeObject>>(json); if (data != null && data.Code == 0) { return data.Data; } return res; } /// /// 根据学生编号获取学生详情 /// /// /// public async Task GetStudentInfo(string stuNo) { var res = new StudentDetailDto(); long timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); string nonce = SaTokenSignHelper.RandomString(20); // 1. 签名参数 var paramMap = new Dictionary { { "channel", AppSettings.JingShiTiJiao.Channel }, { "stuNo", stuNo }, { "timestamp", timestamp }, { "nonce", nonce } }; // 4. 构建签名 QueryString string queryStr = SaTokenSignHelper.BuildQueryString(paramMap, AppSettings.JingShiTiJiao.SecretKey); // 5. 拼接最终 URL string url = $"{AppSettings.JingShiTiJiao.BaseUrl}/api/open/stu/info?{queryStr}"; string json = await HttpManager.HttpGetAsync(url); if (string.IsNullOrWhiteSpace(json)) return res; var data = JsonConvert.DeserializeObject>(json); if (data != null && data.Code == 0) { string token = JwtHelper.IssueJwt(new UserInfoDto() { User_Id = -1, UserName = data.Data.StudentName, Role_Id = 3, PhoneNo = data.Data.TeacherNo, SchoolCode = data.Data.SchoolNo, UserNo = data.Data.StudentNo }); data.Data.Token = token; return data.Data; } return res; } /// /// 上传成绩数据 /// /// /// /// public async Task PushSportsData(List list) { long timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); string nonce = SaTokenSignHelper.RandomString(); var paramMap = new Dictionary { { "channel", AppSettings.JingShiTiJiao.Channel }, { "timestamp", timestamp }, { "nonce", nonce } }; string jsonBody = JsonConvert.SerializeObject(list); // ⭐ POST JSON 的签名 string queryStr = SaTokenSignHelper.BuildPostJsonQueryString( paramMap, AppSettings.JingShiTiJiao.SecretKey, jsonBody); string url = $"{AppSettings.JingShiTiJiao.BaseUrl}/api/sports/data/push?{queryStr}"; using var client = new HttpClient(); var content = new StringContent(jsonBody, Encoding.UTF8, "application/json"); var response = await client.PostAsync(url, content); string result = await response.Content.ReadAsStringAsync(); var res = JsonConvert.DeserializeObject>(result); return res != null && res.Code == 0; } /// /// 根据学校编码获取年级/班级接口 /// /// /// public async Task GetClassBySchoolAsync(string schoolNo) { var res = new JingShiSchoolClassDto(); long timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); string nonce = SaTokenSignHelper.RandomString(); var paramMap = new Dictionary { { "channel", AppSettings.JingShiTiJiao.Channel }, { "schoolNo", schoolNo }, { "timestamp", timestamp }, { "nonce", nonce } }; // 4. 构建签名 QueryString string queryStr = SaTokenSignHelper.BuildQueryString(paramMap, AppSettings.JingShiTiJiao.SecretKey); // 5. 拼接最终 URL string url = $"{AppSettings.JingShiTiJiao.BaseUrl}/api/open/class/by/school?{queryStr}"; string json = await HttpManager.HttpGetAsync(url); if (string.IsNullOrWhiteSpace(json)) return res; var data = JsonConvert.DeserializeObject>(json); if (data != null && data.Code == 0) { return data.Data; } return res; } } }