流程圖 我們需要判斷是否存在OPENID 首先我們得先定義一個全局的OPENID 類似於普通賬號密碼登錄系統的 當前登錄用戶ID 因為我是MVC 框架 我這裡定義一個控制器基類 BaseController 然後將OPENID定義在BaseController中 然後定義一個HomeControll ...
流程圖
我們需要判斷是否存在OPENID 首先我們得先定義一個全局的OPENID 類似於普通賬號密碼登錄系統的 當前登錄用戶ID 因為我是MVC 框架 我這裡定義一個控制器基類 BaseController 然後將OPENID定義在BaseController中
1 public class BaseController : Controller 2 { 3 public string openid 4 { 5 get { 6 return Session["openid"].ToString(); 7 } 8 set { 9 Session["openid"] = value; 10 } 11 } 12 13 }
然後定義一個HomeController 寫一個 測試登錄功能
1 public class HomeController : BaseController 2 { 3 // GET: Home 4 public ActionResult Login() 5 { 6 if (string.IsNullOrEmpty(openid)) //openid不存在 跳轉授權 7 { 8 //此處忽略10萬行授權相關代碼 9 } 10 //此處忽略3000行獲取用戶信息相關 11 return View(); 12 } 13 }
以上為一個大概 忽略大部分無關緊要代碼後的微信授權登錄功能代碼 當然很多人要的都不是這些 接下來 是一些更詳細的代碼 大概分為2個大模塊
- 獲取OPENID
- 獲取用戶信息
這裡我將這2個模塊寫成2個方法定義在WXHelper類中
public class WXHelper { public string GetOpenID() { return "openid"; } public User_UserInfo GetUserInfo() { User_UserInfo model_UserInfo = new User_UserInfo(); return model_UserInfo; } }
然後之前的Login Action 可以改成這樣
public ActionResult Login() { if (string.IsNullOrEmpty(openid)) //openid不存在 跳轉授權 { openid = WXHelper.GetOpenID(); } //LoginUserInfo 是我當前登錄用戶信息 你們自行找方式存 Session 或者全局變數之類的 LoginUserInfo = WXHelper.GetUserInfo(); return View(); }
下麵我們開始實現第一個方法 GetOpenID 官方API
這裡具體請求我就不 多說了 主意 幾個地方 這裡我是採用的 方式為 scope=snsapi_base
因為這裡回調地址 無法寫本地地址進行調試 所以我採用 手動記錄code 併在有效期內手動在本地寫入code 繼續往下調試
不情願的貼上代碼
/// <summary> /// 獲取code 方法 /// </summary> private static void GetWeChat_Code() { string urlhead = "https://"; string rediretUrl = "https%3a%2f%2fxxxx.com%2fHome%2fLoadCode"; string strUrl = $"{urlhead}open.weixin.qq.com/connect/oauth2/authorize?appid={appid}&redirect_uri={rediretUrl}&response_type=code&scope=snsapi_base&state=qwe12e12e#wechat_redirect"; //此處省略n行get請求方法 }
細心的朋友可能會發現上面的redireUrl 地址指向的是Home 控制器下麵 LoadCode 這個 方法 SO
#region 微信授權回調 public ActionResult LoadCode(string code, string state) { return View(); } #endregion
因為MVC 的參數映射 所以我只需要把 code 和state 寫成方法參數即可 這裡我就可以獲取到code方法了 然後我們直接通過code 獲取OPENID
#region 獲取OpenID public static string GetOpenId(string code) { string urlhead = "https://"; string strUrl = $"{urlhead}api.weixin.qq.com/sns/oauth2/access_token?appid={appid}&secret={secret}&code={code}&grant_type=authorization_code"; Access_openid token = new Access_openid(); HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(strUrl); //用GET形式請求指定的地址 req.Method = "GET"; using (WebResponse wr = req.GetResponse()) { //HttpWebResponse myResponse = (HttpWebResponse)req.GetResponse(); StreamReader reader = new StreamReader(wr.GetResponseStream(), Encoding.UTF8); string content = reader.ReadToEnd(); reader.Close(); reader.Dispose(); //在這裡對Access_token 賦值 token = JsonConvert.DeserializeObject<Access_openid>(content); } return token.openid; } #endregion
如果有人對這個Access_openid 對象感到懵逼的話 這裡說一下 這個對象就是下圖中 紅框 獲取到的JSON數據 的對象 這裡我們是 snsapi_base 所以只需要 openid 切 整個授權過程到次結束