Files
Yi.Framework/Yi.Furion.Net6/Yi.Framework.Module/WeChat/Token/RedisWeChatToken.cs

73 lines
2.5 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;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http.Json;
using System.Text;
using System.Threading.Tasks;
using Furion.DependencyInjection;
using Microsoft.Extensions.Options;
using Yi.Framework.Module.Caching;
using Yi.Framework.Module.WeChat.Extensions;
using Yi.Framework.Module.WeChat.Model;
namespace Yi.Framework.Module.WeChat.Token
{
public class RedisWeChatToken : IWeChatToken
{
private WeChatOptions _options;
private RedisCacheClient _cacheManager;
private const string RedisAccessTokenKey = $"WeChat:AccessTokenKey";
public RedisWeChatToken(IOptions<WeChatOptions> options, RedisCacheClient cacheManager)
{
_options = options.Value;
_cacheManager = cacheManager;
}
public async Task<string> GetTokenAsync()
{
string accessToken;
if (_cacheManager.Client.Exists(RedisAccessTokenKey))
{
accessToken = _cacheManager.Client.Get(RedisAccessTokenKey);
}
else
{
var response = await this.GetAccessToken();
accessToken = response.access_token;
_cacheManager.Client.Set(RedisAccessTokenKey, accessToken, TimeSpan.FromHours(1));
}
return accessToken;
}
/// <summary>
/// 获取微信AccessToken
/// </summary>
public async Task<AccessTokenResponse> GetAccessToken()
{
string url = "https://api.weixin.qq.com/cgi-bin/token";
var req = new AccessTokenRequest();
req.appid = _options.AppId;
req.secret = _options.AppSecret;
req.grant_type = "client_credential";
using (HttpClient httpClient = new HttpClient())
{
string queryString = req.ToQueryString();
var builder = new UriBuilder(url);
builder.Query = queryString;
HttpResponseMessage response = await httpClient.GetAsync(builder.ToString());
response.EnsureSuccessStatusCode();
var responseBody = await response.Content.ReadFromJsonAsync<AccessTokenResponse>();
if (string.IsNullOrEmpty(responseBody?.access_token))
{
throw new WeChatException($"获取accessToken异常返回结果【{await response.Content.ReadAsStringAsync()}】");
}
return responseBody;
}
}
}
}