using DSWeb.Areas.Dispatch.DB; using log4net; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Configuration; using System.IO; using System.Linq; using System.Text; using System.Web; namespace DSWeb.Areas.Storage.Helper { public class TokenHelper { private static readonly int TokenRefreshInMiniute = 5; public static bool GetMpToken(string appid, out string token, out string errorMsg) { ILog logger = LogManager.GetLogger("TokenHelper"); DataContext dataContext = new DataContext(); var config = dataContext.MpConfigs.FirstOrDefault(c => c.AppId == appid); if (config == null) { token = null; errorMsg = $"未找到指定的AppId配置:{appid}"; logger.Error(errorMsg); return false; } if (string.IsNullOrWhiteSpace(config.Token) || !config.ExpireTime.HasValue || config.ExpireTime.Value < DateTime.Now.AddMinutes(TokenRefreshInMiniute)) { int expireIn = 0; bool success = GetToken(appid, config.AppSecret, out token, out expireIn, out errorMsg); if (success) { config.Token = token; config.LastUpdate = DateTime.Now; config.ExpireTime = DateTime.Now.AddSeconds(expireIn); dataContext.SaveChanges(); return true; } else { return false; } } else { token = config.Token; errorMsg = ""; return true; } } public static string RefreshTokens() { ILog logger = LogManager.GetLogger("TokenHelper"); try { DataContext dataContext = new DataContext(); DateTime dtExpire = DateTime.Now.AddMinutes(TokenRefreshInMiniute); var list = dataContext.MpConfigs.Where(c => !c.ExpireTime.HasValue || c.ExpireTime.Value < dtExpire).ToList(); StringBuilder sbError = new StringBuilder(); foreach (var item in list) { string token = string.Empty; int expireIn = 0; string errorMsg = string.Empty; bool success = GetToken(item.AppId, item.AppSecret, out token, out expireIn, out errorMsg); if (success) { logger.Debug($"获取公众号token发送成功:{item.AppId} {token}"); item.Token = token; item.LastUpdate = DateTime.Now; item.ExpireTime = DateTime.Now.AddSeconds(expireIn); } else { sbError.AppendLine($"获取AppId为{item.AppId}的token时出错:{errorMsg}"); } } dataContext.SaveChanges(); if (sbError.Length > 0) { logger.Error($"获取公众号token发送错误:{sbError}"); } return sbError.ToString(); } catch (Exception ex) { logger.Error($"获取公众号token发送错误:{ex.Message}"); logger.Error(ex.StackTrace); return ex.Message; } } private static bool GetToken(string appid, string appsecret, out string token, out int expiresIn, out string errorMsg) { string tokenUrl = $"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={appid}&secret={appsecret}"; string tokenStr = WebRequestHelper.DoGet(tokenUrl); if (tokenStr.IndexOf("errcode") > -1) { var obj = new { errcode = 0, errmsg = "" }; var errorJson = JsonConvert.DeserializeAnonymousType(tokenStr, obj); errorMsg = errorJson.errmsg; token = null; expiresIn = 0; return false; } else { var obj = new { access_token = "", expires_in = 0 }; var tokenJson = JsonConvert.DeserializeAnonymousType(tokenStr, obj); token = tokenJson.access_token; expiresIn = tokenJson.expires_in; errorMsg = null; return true; } } } }