WechatSharp/Services/WeChatAccessTokenService.cs

66 lines
2.1 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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,
};
}
}