using LifePayment.Application.Contracts; using LifePayment.Domain.Shared; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Newtonsoft.Json; using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net.Http; using System.Reflection; using System.Security.Cryptography; using System.Security.Policy; using System.Text; using System.Threading.Tasks; using System.Web; using Volo.Abp.Application.Services; using Volo.Abp.Domain.Services; using ZeroD.Util; using ZeroD.Util.Fadd; namespace LifePayment.Domain { public class ACOOLYClient : DomainService { private const string ACOOLYClientName = "ACOOLYClientName"; private readonly ILogger _logger; private readonly ACOOLYOption options; private readonly JsonSerializerSettings jsonSetting = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }; public ACOOLYClient(ILogger logger, IOptionsMonitor optionsMonitor) { _logger = logger; options = optionsMonitor.CurrentValue; } protected IHttpClientFactory HttpClientFactory => LazyServiceProvider.LazyGetRequiredService(); public async Task PostAsync(TInput input) { try { var client = HttpClientFactory.CreateClient(ACOOLYClientName); client.DefaultRequestHeaders.Add("x-api-accesskey", options.Accesskey); client.DefaultRequestHeaders.Add("x-api-signType", "MD5"); // ToDo 参数可能存在排序后再加密,需要联调确认 var body = JsonConvert.SerializeObject(input, jsonSetting); if (body.Length < 2000) { _logger.LogError("请求ACOOLY接口:" + body); } var data = new StringContent(body, Encoding.UTF8, "application/json"); data.Headers.Add("x-api-sign", GetMD5Data(body)); var responseMessage = await client.PostAsync(options.ServerHost, data); var str = await responseMessage.Content.ReadAsStringAsync(); if (!body.Contains(ACOOLYConstant.Sevice.ElectricSupportArea)) { _logger.LogError("ACOOLY接口返回:" + str); } var result = JsonConvert.DeserializeObject(str); return result; } catch (Exception ex) { _logger.LogError("ACOOLY接口错误:" + ex.Message); return default(TResult); } } public string GetMD5Data(string jsonData) //POST请求接口,使用此方法计算签名 { string dataMD5 = ""; if (!string.IsNullOrEmpty(jsonData)) { var str = jsonData + options.SecrtKey; dataMD5 = CreateMD5Hash(str); } return dataMD5; } #region 私有方法 private string CreateMD5Hash(string input) { MD5 md5 = System.Security.Cryptography.MD5.Create(); byte[] inputBytes = System.Text.Encoding.UTF8.GetBytes(input); byte[] hashBytes = md5.ComputeHash(inputBytes); StringBuilder sb = new StringBuilder(); for (int i = 0; i < hashBytes.Length; i++) { sb.Append(hashBytes[i].ToString("x2")); } return sb.ToString(); } #endregion } }