WechatSharp/Src/Services/WeChatAccessTokenService.cs

66 lines
2.1 KiB
C#
Raw Normal View History

2024-07-12 19:32:02 +08:00
using System.Timers;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Timer = System.Timers.Timer;
namespace WeChatSharp.Services;
public class WeChatAccessTokenService
{
public const string _AccessToken = "access_token";
private readonly HttpClient _httpClient;
private readonly IWeChatSettings _weChatSettings;
private readonly Timer _timer=new();
private readonly ILogger<WeChatAccessTokenService> _logger;
private string AccessToken { get; set; }=string.Empty;
public WeChatAccessTokenService(HttpClient httpClient, IWeChatSettings weChatSettings, ILogger<WeChatAccessTokenService> logger)
{
_httpClient = httpClient;
_weChatSettings = weChatSettings;
_logger = logger;
_timer.AutoReset = true;
_timer.Interval = 3600 * 1000;
_timer.Elapsed+=_GetAccessToken;
}
private async void _GetAccessToken(object? sender, ElapsedEventArgs? e)
{
AccessToken = await GetAccessTokenAsync();
}
public async Task<string> GetAccessTokenAsync()
{
var newAccessToken = AccessToken;
if (!string.IsNullOrEmpty(newAccessToken)) return newAccessToken;
var url =
$"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={_weChatSettings.AppId}&secret={_weChatSettings.AppSecret}&token={_weChatSettings.Token}";
var json = await _httpClient.GetStringAsync(url);
var jObject = JsonConvert.DeserializeObject<JObject>(json);
if (jObject is null)
{
_logger.LogWarning(json);
throw new NullReferenceException("json为空值");
}
if (jObject.TryGetValue("errcode", out var errcode) && jObject.TryGetValue("errmsg",out var errmsg))
{
switch (errcode.ToObject<int>())
{
case 40164:
_logger.LogWarning("调用接口的IP地址不在白名单中请在接口IP白名单中进行设置。");
break;
}
throw new Exception(errmsg.ToObject<string>());
}
if (jObject.TryGetValue("access_token", out var token))
{
return newAccessToken = token.ToObject<string>() ?? string.Empty;
}
_logger.LogWarning(json);
throw new InvalidOperationException("获取AccessToken失败")
{
Source = json,
};
}
}