Пример #1
0
        /// <summary>
        /// 获取可用AccessToken
        /// </summary>
        /// <param name="componentAppId"></param>
        /// <param name="componentVerifyTicket">如果为null则自动获取</param>
        /// <param name="getNewToken">是否强制重新获取新的Token</param>
        /// <returns></returns>
        public static ComponentAccessTokenResult GetComponentAccessTokenResult(string componentAppId, string componentVerifyTicket = null, bool getNewToken = false)
        {
            if (!CheckRegistered(componentAppId))
            {
                throw new WeixinOpenException(UN_REGISTER_ALERT);
            }

            var accessTokenBag = TryGetItem(componentAppId);

            using (Cache.BeginCacheLock(LockResourceName + ".GetComponentAccessTokenResult", componentAppId))//同步锁
            {
                if (getNewToken || accessTokenBag.ComponentAccessTokenExpireTime <= DateTime.Now)
                {
                    //已过期,重新获取
                    componentVerifyTicket = componentVerifyTicket ?? TryGetComponentVerifyTicket(componentAppId);

                    var componentAccessTokenResult = ComponentApi.GetComponentAccessToken(accessTokenBag.ComponentAppId, accessTokenBag.ComponentAppSecret, componentVerifyTicket);

                    accessTokenBag.ComponentAccessTokenResult     = componentAccessTokenResult;
                    accessTokenBag.ComponentAccessTokenExpireTime = ApiUtility.GetExpireTime(componentAccessTokenResult.expires_in);
                    Update(accessTokenBag);//更新到缓存
                }
            }
            return(accessTokenBag.ComponentAccessTokenResult);
        }
Пример #2
0
        public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage)
        {
            if (requestMessage.Content == "TESTCOMPONENT_MSG_TYPE_TEXT")
            {
                var responseMessage = requestMessage.CreateResponseMessage <ResponseMessageText>();
                responseMessage.Content = requestMessage.Content + "_callback";//固定为TESTCOMPONENT_MSG_TYPE_TEXT_callback
                return(responseMessage);
            }

            if (requestMessage.Content.StartsWith("QUERY_AUTH_CODE:"))
            {
                string openTicket      = OpenTicketHelper.GetOpenTicket(componentAppId);
                var    query_auth_code = requestMessage.Content.Replace("QUERY_AUTH_CODE:", "");
                try
                {
                    var component_access_token = ComponentApi.GetComponentAccessToken(componentAppId, componentSecret, openTicket).component_access_token;
                    var oauthResult            = ComponentApi.QueryAuth(component_access_token, componentAppId, query_auth_code);

                    //调用客服接口
                    var content    = query_auth_code + "_from_api";
                    var sendResult = CustomApi.SendText(oauthResult.authorization_info.authorizer_access_token,
                                                        requestMessage.FromUserName, content);
                }
                catch (Exception ex)
                {
                    throw;
                }
            }
            return(null);
        }
Пример #3
0
 public void ComponetAccessToken(PerformContext context = null)
 {
     context.WriteLine("开始检查ComponetAccessToken...");
     if (!_redis.KeyExists(CacheKey.ComponentAccessToken) || _redis.KeyTimeToLive(CacheKey.ComponentAccessToken) < new TimeSpan(0, 30, 0))
     {
         context.WriteLine("需要更新ComponetAccessToken...");
         if (_redis.KeyExists(CacheKey.ComponentVerifyTicket))
         {
             context.WriteLine("开始更新ComponetAccessToken...");
             var resp = ComponentApi.GetComponentAccessToken(_config["Wechat:AppID"], _config["Wechat:AppSecret"], _redis.StringGet(CacheKey.ComponentVerifyTicket));
             if (resp.ErrCode == 0)
             {
                 _redis.StringSet(CacheKey.ComponentAccessToken, resp.ComponentAccessToken, new TimeSpan(0, 0, resp.ExpiresIn));
                 context.WriteLine("更新ComponetAccessToken成功...");
             }
             else
             {
                 context.WriteLine("更新ComponetAccessToken发生错误:" + resp.ErrMsg);
                 throw new ServiceException(resp.ErrCode, resp.ErrMsg);
             }
         }
         else
         {
             context.WriteLine("更新ComponetAccessToken发生错误:ComponentVerifyTicket不存在...");
             throw new ServiceException(-1, "更新ComponetAccessToken发生错误:ComponentVerifyTicket不存在...");
         }
     }
     else
     {
         context.WriteLine("检查ComponetAccessToken完毕...");
     }
 }
Пример #4
0
        public override string OnComponentVerifyTicketRequest(RequestMessageComponentVerifyTicket requestMessage)
        {
            ComponentTokenService cts = new ComponentTokenService();
            var componentToken        = cts.GetToken();

            componentToken.ComponentVerifyTicketCreateOn = DateTime.Now;
            componentToken.ComponentVerifyTicket         = requestMessage.ComponentVerifyTicket;
            cts.SaveVerifyToken(componentToken);


            var expiredTime =
                componentToken.ComponentAccessTokenCreateOn.AddSeconds(componentToken.ComponentAccessTokenExpiresIn);

            if (ExpiresIn(expiredTime, 1200))
            { //Refresh the token before 1200 seconds when it expired
                try
                {
                    var updatedToken = ComponentApi.GetComponentAccessToken(ConfigurationManager.AppSettings["AppId"],
                                                                            ConfigurationManager.AppSettings["AppSecret"],
                                                                            componentToken.ComponentVerifyTicket);
                    componentToken.ComponentAccessTokenCreateOn  = DateTime.Now;
                    componentToken.ComponentAccessTokenExpiresIn = updatedToken.expires_in;
                    componentToken.ComponentAccessToken          = updatedToken.component_access_token;
                    cts.SaveAccessToken(componentToken);
                    Log("update access token to " + JsonConvert.SerializeObject(componentToken));
                }
                catch (Exception e)
                {
                    Log(e.ToString(), true);
                }
            }

            expiredTime = componentToken.PreAuthCodeCreateOn.AddSeconds(componentToken.PreAuthCodeExpiresIn);
            if (ExpiresIn(expiredTime, 1200))
            {
                try
                {
                    var updatedCode = ComponentApi.GetPreAuthCode(ConfigurationManager.AppSettings["AppId"],
                                                                  componentToken.ComponentAccessToken);
                    componentToken.PreAuthCodeExpiresIn = updatedCode.expires_in;
                    componentToken.PreAuthCode          = updatedCode.pre_auth_code;
                    componentToken.PreAuthCodeCreateOn  = DateTime.Now;
                    cts.SavePreAuthCode(componentToken);
                    Log("update preauth to " + JsonConvert.SerializeObject(componentToken));
                }
                catch (Exception e2)
                {
                    Log(e2.ToString(), true);
                }
            }



            return(base.OnComponentVerifyTicketRequest(requestMessage));
        }
Пример #5
0
        public void UpdateAccessData()
        {
            var ad    = ComponentKeys.GetInstance().AccessData;
            var atRlt = ComponentApi.GetComponentAccessToken(_wxConfig.AppId, _wxConfig.AppSecret,
                                                             ComponentKeys.GetInstance().VerifyData.Ticket);

            ad.AccessCode = atRlt.component_access_token;
            ad.ExpiresIn  = atRlt.expires_in;
            ad.RefreshOn  = DateTime.Now;

            //store to db
            basicToken.AccessToken          = ad.AccessCode;
            basicToken.AccessTokenRefreshOn = ad.RefreshOn;
            basicToken.AccessTokenExpiresIn = ad.ExpiresIn;
        }
Пример #6
0
 public ComponentToken ForceRefresh()
 {
     using (ApplicationDbContext _context = new ApplicationDbContext())
     {
         var componentToken = _context.ComponentTokens.OrderByDescending(c => c.Id).First();
         try
         {
             var updatedToken = ComponentApi.GetComponentAccessToken(ConfigurationManager.AppSettings["AppId"],
                                                                     ConfigurationManager.AppSettings["AppSecret"],
                                                                     componentToken.ComponentVerifyTicket);
             componentToken.ComponentAccessTokenCreateOn  = DateTime.Now;
             componentToken.ComponentAccessTokenExpiresIn = updatedToken.expires_in;
             componentToken.ComponentAccessToken          = updatedToken.component_access_token;
             _context.SaveChanges();
         }
         catch (Exception e)
         {
             Log(e.ToString());
         }
         return(componentToken);
     }
 }