Exemplo n.º 1
0
        /// <summary>
        /// 获取AccessToken
        /// </summary>
        /// <param name="Now">当前日期时间</param>
        /// <param name="AppId">AppId为空时默认取配置文件appSettings节点key=WeChatAppId</param>
        /// <param name="AppSecret">AppSecret为空时默认取配置文件appSettings节点key=WeChatAppSecret</param>
        /// <param name="GetAccessTokenFromStorage">委托客户端从自定义存储库(接入者的DB、Cache、仓储源)获取AccessToken</param>
        /// <param name="UpdateAccessTokenToStorage">委托客户端将AccessToken插入或更新到自定义存储库(接入者的DB、Cache、仓储源)</param>
        /// <returns></returns>
        public static AccessTokenCacheModel GetAccessToken(DateTime Now, string AppId, string AppSecret, GetAccessTokenFromStorage GetAccessTokenFromStorage = null, UpdateAccessTokenToStorage UpdateAccessTokenToStorage = null)
        {
            AppId     = string.IsNullOrWhiteSpace(AppId) ? Privacy.AppId : AppId;
            AppSecret = string.IsNullOrWhiteSpace(AppSecret) ? Privacy.AppSecret : AppSecret;

            var tokenModel = GetAccessTokenFromStorage?.Invoke(Now, AppId);

            if (CheckAccessToken(Now, tokenModel))
            {
                return(tokenModel);
            }

            tokenModel = GetAccessTokenFromCache(AppId);
            if (CheckAccessToken(Now, tokenModel))
            {
                return(tokenModel);
            }

            var token = GetAccessTokenFromWeChat(Now, AppId, AppSecret);

            tokenModel = new AccessTokenCacheModel(token.expires_in);
            tokenModel.access_token = token.access_token;
            tokenModel.expires_in   = token.expires_in;
            tokenModel.appid        = AppId;

            UpdateAccessTokenToCache(tokenModel);
            UpdateAccessTokenToStorage?.Invoke(Now, tokenModel);

            return(tokenModel);
        }
Exemplo n.º 2
0
        private void RefreshCacheForToken(string token)
        {
            using (var context = LuckIndiaDBContext.GetContext())
            {
                var accessToken = context.AccessTokens
                                  .Include(x => x.User)
                                  // .Include(x => x.Application)
                                  .FirstOrDefault(x => x.Token == token);

                if (accessToken == null ||
                    !ExpirableValidator.IsActive(accessToken.StartDate, accessToken.EndDate))
                {
                    throw new InvalidAccessTokenException();
                }

                var accessTokenCache = new AccessTokenCacheModel
                {
                    AccessToken   = accessToken,
                    ApplicationId = accessToken.ApplicationId,
                    UserId        = accessToken.UserId
                };

                _cache.TryAdd(token, accessTokenCache);
            }
        }
Exemplo n.º 3
0
 private static bool UpdateAccessTokenToCache(AccessTokenCacheModel Token)
 {
     if (null != Token)
     {
         CacheHelper.SetCache(key(Token.appid), Token, Token.expires_in / 60);
         return(true);
     }
     return(false);
 }
Exemplo n.º 4
0
 /// <summary>
 /// 检查AccessToken是否有效
 /// </summary>
 /// <param name="Now">当前日期时间</param>
 /// <param name="Token">AccessTokenCacheModel</param>
 /// <returns></returns>
 public static bool CheckAccessToken(DateTime Now, AccessTokenCacheModel Token)
 {
     if (null == Token)
     {
         return(false);
     }
     if (string.IsNullOrWhiteSpace(Token.access_token) || Token.expires_in < 1 || string.IsNullOrWhiteSpace(Token.expires_time))
     {
         return(false);
     }
     return(DateTime.Compare(Now.AddMinutes(5), DateTime.SpecifyKind(DateTime.Parse(Token.expires_time), Now.Kind)) < 0);
 }
Exemplo n.º 5
0
        /// <summary>
        /// 用户自定义获取AccessToken
        /// </summary>
        /// <returns></returns>
        public static AccessTokenCacheModel GetAccessToken()
        {
            AccessToken.GetAccessTokenFromStorage get = delegate(DateTime Now, string AppId)
            {
                /* 根据AppId从自定义存储库(接入者的DB、Cache、仓储源)获取AccessToken
                 * return GetAccessTokenByCache(AppId);
                 * return GetAccessTokenByRedis(AppId);
                 * return GetAccessTokenByMemcache(AppId);
                 * return GetAccessTokenByMongodb(AppId);
                 * return GetAccessTokenByDB(AppId);
                 * ……
                 */

                /***** 示例·开始 *****/
                AccessTokenCacheModel AccessToken = null;
                /* 先从自己系统的快速获取已存在的票据(Cache、Redis,Memcache等)*/
                object TokenFromCache = CacheHelper.GetCache("WeChatAccessToken_" + AppId);
                AccessToken = null != TokenFromCache ? (AccessTokenCacheModel)TokenFromCache : null;
                if (WeChatHelper4Net.AccessToken.CheckAccessToken(Now, AccessToken))
                {
                    return(AccessToken);
                }
                /* 如果快速数据没有,再从自己系统的稳定数据库获取已存在的票据(MySQL,SQLServer,Oracle等)*/
                //var TokenFromDB = BLLRepository.wechatManageBLL.GetTokenOrTicket(AppId, "AccessToken");
                //if(null != TokenFromDB)
                //{
                //    AccessToken = new AccessTokenCacheModel()
                //    {
                //        appid = TokenFromDB.appid,
                //        access_token = TokenFromDB.access_token,
                //        expires_in = TokenFromDB.expires_in,
                //        expires_time = TokenFromDB.expires_time,
                //        errcode = TokenFromDB.errcode,
                //        errmsg = TokenFromDB.errmsg
                //    };
                //    if(WeChatHelper4Net.AccessToken.CheckAccessToken(Now, AccessToken))
                //    {
                //        CacheHelper.SetCache("WeChatAccessToken_" + AccessToken.appid, AccessToken, AccessToken.expires_in / 60);
                //        return AccessToken;
                //    }
                //}
                /***** 示例·结束 *****/

                return(null);
            };
            AccessToken.UpdateAccessTokenToStorage update = delegate(DateTime now, AccessTokenCacheModel Token)
            {
                bool result = false;

                /* 根据Token.appid将AccessToken插入或更新到自定义存储库(接入者的DB、Cache、仓储源)
                 * result = UpdateAccessTokenToCache(Token.appid, Token);
                 * result = UpdateAccessTokenToRedis(Token.appid, Token);
                 * result = UpdateAccessTokenToMemcache(Token.appid, Token);
                 * result = UpdateAccessTokenToMongodb(Token.appid, Token);
                 * result = UpdateAccessTokenToDB(Token.appid, Token);
                 * ……
                 */

                /***** 示例·开始 *****/
                if (null != Token && !string.IsNullOrWhiteSpace(Token.appid) && Token.expires_in > 60)
                {
                    /* 先将票据存到自己系统的快速获取已存在的票据(Cache、Redis,Memcache等)*/
                    CacheHelper.SetCache("WeChatAccessToken_" + Token.appid, Token, Token.expires_in / 60);

                    //var entity = new TbWeChatTokenOrTicketModel()
                    //{
                    //    appid = Token.appid,
                    //    access_token = Token.access_token,
                    //    expires_in = Token.expires_in,
                    //    expires_time = Token.expires_time,
                    //    errcode = Token.errcode,
                    //    errmsg = Token.errmsg,
                    //    type = "AccessToken",
                    //    UpdateTime = DateTime.Now
                    //};
                    ///* 为了避免快速数据丢失,再将票据存到自己系统的稳定数据库获取已存在的票据(MySQL,SQLServer,Oracle等)*/
                    //result = BLLRepository.wechatManageBLL.UpdateTokenOrTicket(entity);
                }
                /***** 示例·结束 *****/

                return(result);
            };

            string appId     = ConfigurationManager.AppSettings["WeChatAppId"].ToString();     //AppId为空时默认取配置文件appSettings节点key=WeChatAppId
            string appSecret = ConfigurationManager.AppSettings["WeChatAppSecret"].ToString(); //AppSecret为空时默认取配置文件appSettings节点key=WeChatAppSecret

            var token = AccessToken.GetAccessToken(DateTime.Now, appId, appSecret, get, update);

            if (null != token)
            {
                return(token);
            }
            else
            {
                return(default(AccessTokenCacheModel));
            }
        }