/// <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); }