/// <summary> /// 获取微信授权登录地址 /// </summary> public void GetOAuthUrl() { string returnurl = Query <string>("returnurl"); string redirectUri = _domianName + "/WeiXinApi/WxOAuth?returnurl=" + returnurl; //你的回调地址,通过returnurl参数携带其他参数 string url = WxHelper.GetAuthorizeUrl(redirectUri); //微信授权登录地址,会携带code跳转到回调 Write(url, true); }
public async Task OnAuthorizationAsync(AuthorizationFilterContext context) { IServiceProvider serviceProvider = context.HttpContext.RequestServices; ILogger <WxPublicAccountOAuthFilter> logger = serviceProvider.GetRequiredService <ILogger <WxPublicAccountOAuthFilter> >(); //通过判断Cookie(网页授权Token【115】分钟)是否存在发起跳转获得code logger.LogDebug($"WeChatOAuthFilter Begin {context.HttpContext.Request.Path}"); switch (OAuthLevel) { case OAuthLevels.OpenId: if (context.HttpContext.Request.Cookies.ContainsKey(WxConsts.COOKIE_WX_OPENID)) { return; } break; case OAuthLevels.OpenIdAndToken: case OAuthLevels.OpenIdAndUserInfo: if (context.HttpContext.Request.Cookies.ContainsKey(WxConsts.COOKIE_WX_OPENID) && context.HttpContext.Request.Cookies.ContainsKey(WxConsts.COOKIE_WX_WEBTOKEN)) { return; } break; default: break; } HttpRequest request = context.HttpContext.Request; string code = request.Query["code"].ToString(); string state = request.Query["state"].ToString(); //TODO:验证Token,过期自动刷新 #region 如果是从微信验证页面跳转回来,根据Code和State拿到OpenId等信息 if (!string.IsNullOrEmpty(code) && !string.IsNullOrEmpty(state)) { logger.LogDebug($"从微信验证页面跳转回来... code:{code}\tstate:{state}"); WxFuncs weChatFuncs = serviceProvider.GetRequiredService <WxFuncs>(); IOauth2Api oauth2Api = serviceProvider.GetRequiredService <IOauth2Api>(); WxPublicAccountOption option = weChatFuncs.GetWeChatOptions(); //通过code换取access_token,Code只能用一次 //网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同 OAuthAccessTokenApiResult result = await oauth2Api.GetAccessTokenAsync(option.AppId, option.AppSecret, code); result.EnsureSuccess(); logger.LogDebug($"AccessToken:{result.AccessToken}"); IResponseCookies cookies = context.HttpContext.Response.Cookies; cookies.Append(WxConsts.COOKIE_WX_OPENID, result.OpenId, new CookieOptions() { Path = "/", Expires = DateTimeOffset.Now.AddDays(30), HttpOnly = true, IsEssential = true, }); cookies.Append(WxConsts.COOKIE_WX_WEBTOKEN, result.AccessToken, new CookieOptions() { Path = "/", Expires = DateTimeOffset.Now.AddMinutes(115), HttpOnly = true, IsEssential = true, }); context.HttpContext.Items[WxConsts.COOKIE_WX_OPENID] = result.OpenId; context.HttpContext.Items[WxConsts.COOKIE_WX_WEBTOKEN] = result.AccessToken; logger.LogDebug("微信网页授权完成..."); return; } #endregion 如果是从微信验证页面跳转回来,根据Code和State拿到OpenId等信息 else if (!context.HttpContext.Request.Cookies.ContainsKey(WxConsts.COOKIE_WX_OPENID) || !context.HttpContext.Request.Cookies.ContainsKey(WxConsts.COOKIE_WX_WEBTOKEN)) { string redirectUrl = UriHelper.GetDisplayUrl(request); WxFuncs weChatFuncs = serviceProvider.GetRequiredService <WxFuncs>(); WxPublicAccountOption option = weChatFuncs.GetWeChatOptions(); //获取授权Url string url = WxHelper.GetAuthorizeUrl(redirectUrl, _state, option.AppId, OAuthLevel == OAuthLevels.OpenIdAndUserInfo ? OAuthScopes.snsapi_userinfo : OAuthScopes.snsapi_base); logger.LogDebug($"跳转至微信服务器获取授权...{Environment.NewLine}RedirectUrl:{redirectUrl}{Environment.NewLine}AuthUrl:{url}"); context.Result = new RedirectResult(url); } else { logger.LogError($"授权出错,请检查...{request.Path}"); context.Result = new ContentResult { Content = "授权出错,请检查!" }; } }