protected string GetOpenId(AppAccountInfo appAccount, string code)
        {
            var extend = new Dictionary <string, string>
            {
                { TemplateConst.ExtendCode, code },
                { TemplateConst.ExtendToken, ProviderGateway.TokenProvider.GetToken(appAccount) }
            };

            var requestTemplate = new DefaultApiTemplate(appAccount, TemplateConst.GetOpenId, extend);
            //TODO:这块会出现空引用需要加一下判断
            var openId = requestTemplate.GetResponse()[TemplateConst.OpenId];

            if (string.IsNullOrWhiteSpace(openId))
            {
                var message = string.Format("未获取到OpenId:tenantId={0},appAccountId={1},code={2}", appAccount.TenantId, appAccount.Id, code);
                AppConnectLogHelper.Error(message);
                throw new SDKResultException(message);
            }

            var cookie = CookieHelper.GetCookie();

            if (cookie.OpenIds == null)
            {
                cookie.OpenIds = new Dictionary <string, string>();
            }
            cookie.OpenIds.Add(appAccount.AppId, openId);
            CookieHelper.SetCookie(cookie);

            return(openId);
        }
示例#2
0
        internal override string GetRedirectUrl(CallbackContentInfo contentInfo, string code, string state)
        {
            var appAccountPublic = ProviderGateway.AppAccountProvider.Get(contentInfo.AppAccountPublic);

            GetOpenId(appAccountPublic, code);

            var appAccountPrivate = ProviderGateway.AppAccountProvider.Get(contentInfo.AppAccountPrivate);
            var extend            = new Dictionary <string, string>
            {
                { TemplateConst.ExtendState, state },
                { TemplateConst.ExtendBatch, contentInfo.BatchId }
            };
            var requestTemplate = new DefaultApiTemplate(appAccountPrivate, TemplateConst.AuthorizeUrl, extend);

            SetNextState(contentInfo.BatchId, CallbackContentState.Private);

            //跳转获取私有身份
            return(requestTemplate.GetRequestUrl());
        }
        /// <summary>
        /// 获取开放平台授权URL
        /// </summary>
        /// <param name="appAccountId"></param>
        /// <param name="redirectUrl"></param>
        /// <param name="type">公共服务号类型。12:微信服务号,21:钉钉</param>
        /// <param name="cookie"></param>
        /// <returns></returns>
        public string GetAuthorizeUrl(string appAccountId, string redirectUrl, int type, UserCookie cookie, string loginType = null)
        {
            //Log 信息
            //  AppConnectLogHelper.ErrorFormat("进入GetAuthorizeUrl方法!appAccountId:{0},redirectUrl:{1},type:{2}", appAccountId, redirectUrl, type);
            ArgumentHelper.AssertIsTrue(!string.IsNullOrWhiteSpace(redirectUrl), "redirectUrl is null or empty");

            AppAccountInfo       appAccountPublic;
            AppAccountInfo       appAccountPrivate;
            AppAccountInfo       appAccountAuthorize;
            string               appAccountPublicId;
            string               appAccountPrivateId = null;
            CallbackContentState callbackState;
            var tenantId = 0;

            //根据类型初始化信息
            if (string.IsNullOrWhiteSpace(appAccountId))
            {
                //公共账户方式
                AppConnectLogHelper.Debug("进入GetAuthorizeUrl方法->公共账户方式!");
                appAccountPublic = ProviderGateway.AppAccountProvider.GetPublicByType(type);

                if (!string.IsNullOrWhiteSpace(CookieHelper.GetOpenId(cookie, appAccountPublic.AppId)))
                {
                    return(null);
                }

                appAccountPublicId  = appAccountPublic.AppAccountId;
                callbackState       = CallbackContentState.Public;
                appAccountAuthorize = appAccountPublic;
            }
            else
            {
                //私有账户类型
                AppConnectLogHelper.Debug("进入GetAuthorizeUrl方法->私有账户方式!");
                appAccountPrivate = ProviderGateway.AppAccountProvider.Get(appAccountId);
                if (appAccountPrivate == null)
                {
                    AppConnectLogHelper.Error("AppAccountProvider-GetByAppAccountId 为 null");
                    return(null);
                }
                appAccountPrivateId = appAccountPrivate.AppAccountId;
                tenantId            = appAccountPrivate.TenantId;

                switch (appAccountPrivate.Type)
                {
                case 11:
                case 12:
                    AppConnectLogHelper.Debug("进入GetAuthorizeUrl方法->私有账户方式!->Case11,12");
                    appAccountPublic   = ProviderGateway.AppAccountProvider.GetPublicByType(appAccountPrivate.Type);
                    appAccountPublicId = appAccountPublic.AppAccountId;

                    if (!string.IsNullOrWhiteSpace(CookieHelper.GetOpenId(cookie, appAccountPublic.AppId)) && !string.IsNullOrWhiteSpace(CookieHelper.GetOpenId(cookie, appAccountPrivate.AppId)))
                    {
                        return(null);
                    }

                    if (!string.IsNullOrWhiteSpace(CookieHelper.GetOpenId(cookie, appAccountPublic.AppId)))
                    {
                        callbackState       = CallbackContentState.Private;
                        appAccountAuthorize = appAccountPrivate;
                    }
                    else if (!string.IsNullOrWhiteSpace(CookieHelper.GetOpenId(cookie, appAccountPrivate.AppId)))
                    {
                        callbackState       = CallbackContentState.Public;
                        appAccountAuthorize = appAccountPublic;
                    }
                    else
                    {
                        callbackState       = CallbackContentState.PrivateAndPublic;
                        appAccountAuthorize = appAccountPublic;
                    }
                    break;

                default:
                    AppConnectLogHelper.Debug("进入GetAuthorizeUrl方法->私有账户方式!->CaseDefault");
                    if (string.IsNullOrWhiteSpace(CookieHelper.GetOpenId(cookie, appAccountPrivate.AppId)))
                    {
                        callbackState       = CallbackContentState.Private;
                        appAccountAuthorize = appAccountPrivate;
                        appAccountPublicId  = appAccountPrivate.AppAccountId;
                    }
                    else
                    {
                        AppConnectLogHelper.Debug("进入GetAuthorizeUrl方法->私有账户方式!->CaseDefault->Cookie有值返回Null");
                        return(null);
                    }
                    break;
                }
            }
            AppConnectLogHelper.Debug("进入GetAuthorizeUrl方法->私有账户方式!->Case->记录回调信息");
            //记录回调信息
            var batchId         = Guid.NewGuid().ToString();
            var callbackContent = new CallbackContentInfo
            {
                BatchId           = batchId,
                TenantId          = tenantId,
                AppAccountPublic  = appAccountPublicId,
                AppAccountPrivate = appAccountPrivateId,
                Content           = redirectUrl,
                State             = callbackState
            };

            ProviderGateway.CallbackContentProvider.Add(callbackContent);

            var state = Guid.NewGuid().ToString("N");

            AppConnectLogHelper.Debug("进入GetAuthorizeUrl方法->私有账户方式!->Case->记录回调信息->记录Cookie");
            try
            {
                AppConnectLogHelper.Debug("进入GetAuthorizeUrl方法->私有账户方式!->Case->记录回调信息->记录Cookie前->State:" + state);

                CookieHelper.SetState(state);
                var getCookieState = CookieHelper.GetState();
                AppConnectLogHelper.Debug("进入GetAuthorizeUrl方法->私有账户方式!->Case->记录回调信息->记录Cookie后获取->State:" + getCookieState);
            }
            catch (System.Exception ex)
            {
                AppConnectLogHelper.Debug("SetState加日志发生了错误!!!!!");
            }

            //生成授权Url
            var extend = new Dictionary <string, string>
            {
                { TemplateConst.ExtendState, state },
                { TemplateConst.ExtendBatch, batchId }
            };

            string url = null;

            //钉钉的PC登录
            if (!string.IsNullOrEmpty(loginType) && loginType == "0")
            {
                var requestTemplate = new DefaultApiTemplate(appAccountAuthorize, TemplateConst.AuthorizePCUrl, extend);
                url = requestTemplate.GetRequestUrl();
            }
            else
            {
                var requestTemplate = new DefaultApiTemplate(appAccountAuthorize, TemplateConst.AuthorizeUrl, extend);
                url = requestTemplate.GetRequestUrl();
            }
            AppConnectLogHelper.Debug("进入GetAuthorizeUrl方法->私有账户方式!->Case->记录回调信息->记录Cookie后获取->State->Url" + url);
            return(url);
        }