118 lines
4.1 KiB
C#
118 lines
4.1 KiB
C#
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<JinkoJIPService> _logger;
|
|
private readonly IConfiguration _configuration;
|
|
|
|
public JinkoJIPService(IHttpClientFactory httpClientFactory, ILogger<JinkoJIPService> 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<UploadAttendanceResponse> UploadAttendancesAsync(List<UploadAttendanceRequest> 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<UploadAttendanceResponse>();
|
|
return r;
|
|
}
|
|
|
|
|
|
public async Task<string> SyncMealSupplementRecordsAsync(List<SyncMealSupplementRecordRequest> 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<string>());
|
|
}
|
|
if (jobj.TryGetValue("message", out var message) && !jobj.ContainsKey("code"))
|
|
{
|
|
true.ThrowIfTrue(message.Value<string>());
|
|
}
|
|
|
|
(jobj.GetValue("code").Value<int>() != 200).ThrowIfTrue(jobj.GetValue("message").Value<string>());
|
|
|
|
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<Claim>
|
|
{
|
|
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);
|
|
}
|
|
}
|