HttpClientService.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. using DFS.Infrastructure.Extension.SM;
  2. using Edge.Core.Core.database;
  3. using Microsoft.Extensions.DependencyInjection;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Text.Json;
  9. using System.Threading.Tasks;
  10. namespace Edge.Core.HttpClient
  11. {
  12. public class HttpClientService:IHttpClient
  13. {
  14. private static NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger();
  15. private readonly string signMethod = "HMAC_SM4";
  16. private string acesskey = "";
  17. private string secretId = "";
  18. private string baseUrl = "";
  19. private readonly MysqlDbContext mysqlDbContext = new MysqlDbContext();
  20. private IHttpClientFactory _httpContextFactory;
  21. [ActivatorUtilitiesConstructor]
  22. public HttpClientService(IHttpClientFactory httpClientFactory)
  23. {
  24. _httpContextFactory = httpClientFactory;
  25. getHttpInfo();
  26. }
  27. private void getHttpInfo()
  28. {
  29. var fccStationInfo = mysqlDbContext.FccStationInfos.FirstOrDefault();
  30. if(fccStationInfo == null)
  31. {
  32. Logger.Info($"http client get station info fail");
  33. return;
  34. }
  35. secretId = fccStationInfo?.SecretId;
  36. acesskey = fccStationInfo?.AcessKey;
  37. baseUrl = fccStationInfo?.CloudService;
  38. }
  39. public async Task<HttpResponseMessage> GetAsync(string api, Dictionary<string,string> parmas)
  40. {
  41. string nonceStr = GenerateUniqueString();
  42. string timeStampStr = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds().ToString();
  43. var httpClient = _httpContextFactory.CreateClient();
  44. httpClient.BaseAddress = new Uri(baseUrl);
  45. httpClient.DefaultRequestHeaders.Add("sign_method", signMethod);
  46. httpClient.DefaultRequestHeaders.Add("secret_id", secretId);
  47. httpClient.DefaultRequestHeaders.Add("nonce", nonceStr);
  48. httpClient.DefaultRequestHeaders.Add("timestamp", timeStampStr);
  49. httpClient.DefaultRequestHeaders.Add("signature", SignStr(nonceStr,timeStampStr,null,parmas));
  50. return await httpClient.GetAsync(api);
  51. }
  52. public async Task<HttpResponseMessage> PostAsync(string api, StringContent? parmaJson)
  53. {
  54. string nonceStr = GenerateUniqueString();
  55. string timeStampStr = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds().ToString();
  56. string? json = null;
  57. if (parmaJson != null)
  58. {
  59. json = await parmaJson.ReadAsStringAsync();
  60. }
  61. var httpClient = _httpContextFactory.CreateClient();
  62. httpClient.BaseAddress = new Uri(baseUrl);
  63. httpClient.DefaultRequestHeaders.Add("sign_method", signMethod);
  64. httpClient.DefaultRequestHeaders.Add("secret_id", secretId);
  65. httpClient.DefaultRequestHeaders.Add("nonce", nonceStr);
  66. httpClient.DefaultRequestHeaders.Add("timestamp", timeStampStr);
  67. httpClient.DefaultRequestHeaders.Add("signature", SignStr(nonceStr, timeStampStr, json,null));
  68. return await httpClient.PostAsync(api, parmaJson);
  69. }
  70. private string GenerateUniqueString()
  71. {
  72. // 生成 GUID 并去掉 "-"
  73. string guid = Guid.NewGuid().ToString("N");
  74. // 截取前 7 位
  75. return guid.Substring(0, 7);
  76. }
  77. private string SignStr(string nonce,string timestamp, string? parmaJson,Dictionary<string,string>? parmas)
  78. {
  79. string sign = $"sign_method={signMethod}&secret_id={secretId}&nonce={nonce}&timestamp={timestamp}";
  80. if(parmaJson != null)
  81. {
  82. sign += $"&{parmaJson}";
  83. }
  84. if (parmas != null)
  85. {
  86. foreach (var item in parmas)
  87. {
  88. sign += $"&{item.Key}={item.Value}";
  89. }
  90. }
  91. string encrySign = sign.SM4Encrypt_ECB(acesskey);
  92. byte[] encrySignBytes = Encoding.UTF8.GetBytes(encrySign);
  93. string encryBase64 = Convert.ToBase64String(encrySignBytes);
  94. return encryBase64;
  95. }
  96. }
  97. }