Example #1
0
        /// <summary>
        /// 根据授权码开始维护一个新的公众号Token
        /// 如果指定的公众号之前授权给其它domain了,将解除之前的授权关联
        /// </summary>
        /// <returns></returns>
        public ActionResult CreateAuthorizer(string domainId, string authCode)
        {
            RequestApiResult <WeixinThirdPartyGetAuthorizationInfoResult> createResult =
                _thirdPartyManager.CreateAuthorizer(Guid.Parse(domainId), authCode);

            ApiResult <CreateAuthorizerResult> result = new ApiResult <CreateAuthorizerResult>();

            result.Success = createResult.Success;
            result.Message = createResult.Message;

            if (createResult.Success)
            {
                WeixinThirdPartyAuthorizationInfo info = createResult.ApiResult.AuthorizationInfo;

                //开始维持accessToken
                _accessTokenPool.Add(info.AppId, info.AccessToken, info.ExpiresIn, info.RefreshToken);

                result.Data       = new CreateAuthorizerResult();
                result.Data.AppId = info.AppId;
            }

            return(RespondResult(result));
        }
        /// <summary>
        /// 根据授权码开始维护一个新的公众号Token
        /// 此方法在 Container 中调用
        /// </summary>
        /// <param name="domainId"></param>
        /// <param name="authCode"></param>
        /// <returns></returns>
        public RequestApiResult <WeixinThirdPartyGetAuthorizationInfoResult> CreateAuthorizer(Guid domainId, string authCode)
        {
            RequestApiResult <WeixinThirdPartyGetAuthorizationInfoResult> authorizationInfoResult =
                ThirdPartyApiWrapper.GetAuthorizationInfo(authCode);

            if (authorizationInfoResult.Success == false)
            {
                return(authorizationInfoResult);
            }

            WeixinThirdPartyAuthorizationInfo info = authorizationInfoResult.ApiResult.AuthorizationInfo;

            //一个公众号不能同时授权给两个帐户,因为微信在推送数据时只带一个APPID,我无法判断其属于哪个Domain
            //但是允许其在解除授权后得新授权给另一个帐户
            //所以首先判断有没有已经授权过的且online的domain,如果有,先解除原有授权
            //解除的办法直接更新原domain的lastDockingDate,并把Online置为0,
            List <CommandParameter> parameterList = new List <CommandParameter>();

            parameterList.Add(new CommandParameter("@domainId", domainId));
            parameterList.Add(new CommandParameter("@appId", info.AppId));

            DataTable dt = _dataBase.ExecuteDataSet(
                "SELECT [Domain] FROM [Authorizer] WHERE [Online] = 1 AND [AppId] = @appId AND [Domain] <> @domainId",
                parameterList, new string[] { "table" }).Tables[0];

            foreach (DataRow dr in dt.Rows)
            {
                //解除授权
                Unauthorized(Guid.Parse(dr["Domain"].ToString()), info.AppId);
            }


            //还有可能是同一个Domain以前授权过的,这种情况直接更新即可
            AuthorizerEntity entity = new AuthorizerEntity();

            entity.AppId  = info.AppId;
            entity.Domain = domainId;

            bool exist = _dataBase.Fill <AuthorizerEntity>(entity);

            //保存RefreshToken到数据库
            //非常重要,一旦丢失则需要公众号重新授权
            entity.AccessToken           = info.AccessToken;
            entity.AccessTokenExpiryTime = DateTime.Now.AddSeconds(info.ExpiresIn);
            entity.RefreshToken          = info.RefreshToken;
            entity.RefreshTokenGetTime   = DateTime.Now;
            ////////////

            entity.AuthorizationTime = DateTime.Now;
            entity.Online            = true;
            entity.FuncScopeCategory = info.FuncScopeCategoryList.ToString();

            if (exist)
            {
                _dataBase.Update(entity);
            }
            else
            {
                _dataBase.Insert(entity);
            }

            //更新LastDockingTime
            DomainManager.Instance.UpdateLastDockingTime(domainId);

            return(authorizationInfoResult);
        }