using System.IdentityModel.Tokens.Jwt; using System.Net.Http.Headers; using System.Security.Claims; using System.Text; using Dlhis.ScheduledTask.SyncSapInfo.Response; using Kurisu.AspNetCore.Utils.Extensions; using Microsoft.IdentityModel.Tokens; using Newtonsoft.Json.Linq; namespace Dlhis.ScheduledTask.SyncSapInfo.Services.Implements; public class JinkoJIPService : IJinkoJIPService { private readonly IHttpClientFactory _httpClientFactory; private readonly ILogger _logger; private readonly IConfiguration _configuration; public JinkoJIPService(IHttpClientFactory httpClientFactory, ILogger logger, IConfiguration configuration) { _httpClientFactory = httpClientFactory; _logger = logger; _configuration = configuration; } private HttpClient GetHttpClient() { var httpClient = _httpClientFactory.CreateClient(); httpClient.BaseAddress = new Uri(_configuration.GetSection("JinkoOptions:Jip:BaseUrl").Value); httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", IssueToken()); return httpClient; } public async Task UploadAttendancesAsync(List requests) { var requestUrl = "/JIP/HCM/HCM_SWIPE_DATA_SAVE"; var body = new { T_DATA = requests, }; var json = body.ToJson(); //_logger.LogInformation("上传考勤记录请求:{json}", json); var content = new StringContent(json, Encoding.UTF8, "application/json"); var response = await GetHttpClient().PostAsync(requestUrl, content); var responseJson = await response.Content.ReadAsStringAsync(); _logger.LogInformation("上传考勤记录响应:{json}", responseJson); var r = responseJson.ToObject(); return r; } public async Task SyncMealSupplementRecordsAsync(List requests) { var requestUrl = "/JIP/DHR/DHR_DL_CALLBACK_UAT"; var json = requests.ToJson(Kurisu.AspNetCore.Utils.Extensions.JsonExtensions.DefaultSetting); var content = new StringContent(json, Encoding.UTF8, "application/json"); var response = await GetHttpClient().PostAsync(requestUrl, content); var responseJson = await response.Content.ReadAsStringAsync(); _logger.LogInformation("餐补状态同步响应:{json}", responseJson); var jobj = JObject.Parse(responseJson); if (jobj.TryGetValue("exp", out var exp)) { true.ThrowIfTrue(exp.Value()); } if (jobj.TryGetValue("message", out var message) && !jobj.ContainsKey("code")) { true.ThrowIfTrue(message.Value()); } (jobj.GetValue("code").Value() != 200).ThrowIfTrue(jobj.GetValue("message").Value()); return responseJson; } public string IssueToken() { var jwtKey = _configuration.GetSection("JinkoOptions:Jip:Key").Value; var jwtSecret = _configuration.GetSection("JinkoOptions:Jip:Secret").Value; var mins = 5; var now = DateTime.Now.AddMinutes(-mins); var expires = DateTime.Now.AddMinutes(mins); var claims = new List { new (JwtRegisteredClaimNames.Nbf,$"{new DateTimeOffset(now).ToUnixTimeSeconds()}"), new (JwtRegisteredClaimNames.Exp,$"{new DateTimeOffset(expires).ToUnixTimeSeconds()}"), new (JwtRegisteredClaimNames.Iss,jwtKey), }; var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSecret)); var descriptor = new SecurityTokenDescriptor { Subject = new ClaimsIdentity(claims), Issuer = jwtKey, IssuedAt = now, NotBefore = now, Expires = expires, SigningCredentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256) }; var jwtHandler = new JwtSecurityTokenHandler(); var securityToken = jwtHandler.CreateToken(descriptor); return jwtHandler.WriteToken(securityToken); } }