在19年出開始接觸微信的開發,OAuth認證是我遇到的第一個難題,邊學習邊記錄
首先在微信公眾平臺配置網頁授權域名

需要用到的DLL
Senparc.Weixin.dll
Senparc.Weixin.MP.dll
Senparc.Weixin.WxOpen.dll
首先創建一個身份認證的特性 放在所有Controller里面

OAuth2AuthorizeAttribute.cs 代碼如下
public class OAuth2AuthorizeAttribute : AuthorizeAttribute { /// <summary> /// 驗證是否已存用戶的wxopenid /// </summary> /// <param name="filterContext"></param> public override void OnAuthorization(AuthorizationContext filterContext) { try { var request = filterContext.HttpContext.Request;//獲取http請求 var req = filterContext.HttpContext.Request.RawUrl.ToString();//拿到完整url
var d = HttpContext.Current.Request.Url.ToString();//這個也是拿到完整的url 只不過這個可以拿到路由里面的引數 上面則不可以 Common.Logs._StrUrl = d;//存到一個常量里面 //判斷cookie里面有沒有存這個用戶的wxopenid if (string.IsNullOrWhiteSpace(TUser.GetUserOpenId())) { //如果cookie里面沒有用戶的wxopenid則重定向 filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "OAuth2", action = "index", strurl = Common.Logs._StrUrl, })); } } catch (Exception ex) { } } }
TUser.cs
public static class TUser { #region 變數區域 #region Cookie Keys /// <summary> /// UserPwd Cookie Key /// </summary> public static string UserOpenIdKey = "577355724964"; /// <summary> /// ValueExt /// </summary> public static string ValueExt = "_isoks"; /// <summary> /// CookieName /// </summary> public static string CookieName = "596f727a696b752e576562"; #endregion #endregion #region+GetUserOpenId 獲取UserOpenId public static string GetUserOpenId() { try { var cookie = GetCookie(); if (cookie == null) return string.Empty; var userOpenId = cookie.Values[UserOpenIdKey]; return userOpenId; } catch { return string.Empty; } return string.Empty; } #endregion #region +SetCookie 設定登錄的cookie /// <summary> /// 設定登錄的cookie /// </summary> /// <param name="id">id</param> /// <param name="name">用戶名</param> public static void SetUserOpenId(string userOpenId) { var cookie = new HttpCookie(CookieName) { HttpOnly = true }; cookie.Values.Add(UserOpenIdKey, userOpenId); //cookie.Expires = DateTime.Now.AddDays(30); HttpContext.Current.Response.SetCookie(cookie); } #endregion #region +GetCookie 獲取Cookie實體 /// <summary> /// 獲取Cookie實體 /// </summary> /// <returns></returns> public static HttpCookie GetCookie() { try { var key = CookieName; var cookie = HttpContext.Current.Request.Cookies[key]; return cookie; } catch { return null; } } #endregion }
OAuth2Controller 代碼
/// <summary> /// 呼叫微信API換取WXOpenid /// </summary> public class OAuth2Controller : BaseController { /// <summary> /// 定義一個常量用來存盤需要請求的路徑 /// </summary> public static string PrevUrl = string.Empty; public ActionResult Index(string strurl = "") { //給常量賦值 PrevUrl = strurl; //呼叫微信API介面 BAPPID=公眾號的APPID BREDIRECTURL=接收微信回傳結果的路由 例:http://localhost/OAuth2/RedirectUrl var uri = OAuthApi.GetAuthorizeUrl(BAPPID, BREDIRECTURL, "0", OAuthScope.snsapi_userinfo); //重定向訪問微信授權地址 return Redirect(uri); } /// <summary> /// 微信OAuthApi回呼 /// </summary> /// <param name="code">狀態碼</param> /// <param name="state"></param> /// <returns></returns> public ActionResult RedirectUrl(string code, string state) { try { //判斷狀態碼是否為空 if (string.IsNullOrEmpty(code)) { return Json(new { State = false, Msg = "哎呀,出錯了!" }); } //定義一個接收Tokoen的result OAuthAccessTokenResult result = null; try { result = OAuthApi.GetAccessToken(BAPPID, BSECRET, code); } catch (Exception ex) { return Json(new { State = false, Msg = "哎呀,出錯了!" }); } if (result.errcode != ReturnCode.請求成功) { return Json(new { State = false, Msg = "哎呀,出錯了!" }); } //拿到token以后呼叫微信介面 用token和openid換去用戶資訊 var userinfo = OAuthApi.GetUserInfo(result.access_token, result.openid); //拿到用戶資訊后創建或修改自己專案中的用戶表 if (userinfo != null) { var user = UserRepository.GetUserByWxOpenId(result.openid); if (user != null) { user.NickName = userinfo.nickname; user.HeadImg = userinfo.headimgurl; user.UserSex = (UserSex)Enum.Parse(typeof(UserSex), userinfo.sex.ToString()); UserRepository.SaveOrUpdate(user); } else { //create user User guser = new User(); guser.WxOpenId = result.openid; guser.HeadImg = userinfo.headimgurl; guser.NickName = userinfo.nickname; guser.State = true; guser.UserSex = (UserSex)Enum.Parse(typeof(UserSex), userinfo.sex.ToString()); guser.AddTime = DateTime.Now; guser.UserType = UserType.游客; guser.GuId = Guid.NewGuid().ToString(); UserRepository.SaveOrUpdate(guser); } } //將用戶的openid存起來 TUser.SetUserOpenId(result.openid); //跳轉程式原來要跳轉的路由 if (IsoksIsNullOrWhiteSpace(PrevUrl)) { return Redirect(PrevUrl); } return Redirect("~/home/index"); } catch (Exception ex) { log(ex.Message, "出錯啦"); } return Error500cshtml(); } }
總體思路:客戶端發來請求,通過過濾器拿到要請求的路徑,判斷cookie里面有沒有存當前用戶的wxopenid,如果存了直接跳轉正常要請求的路徑,如果wxopenid為空 則重定向到OAuth2Controll 根據配置的APPID和BREDIRECTURL=重定向url跟微信API進行互動獲取用戶的微信資訊進行創建或更新用戶并在cookie里面存盤用戶資訊
本文來自博客園,作者:康Sir7,轉載請注明原文鏈接:https://www.cnblogs.com/kangsir7/p/15741437.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/396008.html
標籤:ASP.NET
