【第二十一篇】C# MVC 微信授权登录 OAuth2.0授权登录
首先一定要熟读,最起码过一遍微信开发者文档
文档写的很清楚
授权登录四步走
在正文开始前,我得讲清楚一个事情
敲黑板,划重点:微信一共有两个 access_token
一个是7200就过期的,一个是登录用的。这两个有本质区别,授权登录只会用到后者
======================正文开始======================
/// <summary> /// 微信登录 /// </summary> /// <returns></returns> public ActionResult WechatLogin() { if (!string.IsNullOrEmpty(Request["code"])) { //根据appid,secret,code取到用户的全部信息 Dictionary<string, object> dic = GetUserInfoByCode(AppId, AppSecret, Request["code"].ToString()); if (dic.ContainsKey("errcode")) { return Redirect("/WError/Index?Msg=" + dic["errmsg"].ToString()); } string openid = dic["openid"].ToString(); //根据微信唯一标识openid 去数据库判断是否存在 //1.不存在就新增 Model.TBase_UserInfo u = BLL.TBase_UserInfo.Instence.GetUserByOpenId(openid); if (u == null) { u = new Model.TBase_UserInfo(); u.Code = GetCode<Model.TBase_UserInfo>(); u.NickName = dic["nickname"].ToString(); u.HeadImage = dic["headimgurl"].ToString(); u.OpenId = openid; u.IsOrder = 0; u.Status = 1; u.State = 1; u.AddDate = DateTime.Now; int id = BLL.TBase_UserInfo.Instence.Add(u); u.ID = id; } Session[Esluo.Basic.Config.SESSION_KEY_FOR_USER] = u; return Redirect("/WHome/Index"); } else { string redirect_uri = HttpUtility.UrlEncode("http://" + Request.Url.Authority + Request.Url.PathAndQuery); return Redirect(string.Format("https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&redirect_uri={1}&response_type=code&scope={2}&state=STATE#wechat_redirect", AppId, redirect_uri, "snsapi_userinfo")); } }
/// <summary> /// 获得Code /// </summary> /// <typeparam name="T">表</typeparam> /// <returns></returns> protected long GetCode<T>() { Type type = typeof(T); return BLL.TSYS_Code.Instence.GetCode(type.Name); } /// <summary> ///用code换取获取用户信息(包括非关注用户的)(此access_token是网页授权的和普通无关) /// </summary> /// <param name="Appid"></param> /// <param name="Appsecret"></param> /// <param name="Code">回调页面带的code参数</param> /// <returns>获取用户信息(json格式)</returns> public Dictionary<string, object> GetUserInfoByCode(string Appid, string Appsecret, string Code) { JavaScriptSerializer Jss = new JavaScriptSerializer(); string url = string.Format("https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code", Appid, Appsecret, Code); string ReText = WebRequestPostOrGet(url, "");//post/get方法获取信息 Dictionary<string, object> DicText = (Dictionary<string, object>)Jss.DeserializeObject(ReText); if (!DicText.ContainsKey("openid")) { return DicText; } else { Dictionary<string, object> respDic = (Dictionary<string, object>)Jss.DeserializeObject(WebRequestPostOrGet("https://api.weixin.qq.com/sns/userinfo?access_token=" + DicText["access_token"] + "&openid=" + DicText["openid"] + "&lang=zh_CN", "")); return respDic; } } #region Post/Get提交调用抓取 /// <summary> /// Post/get 提交调用抓取 /// </summary> /// <param name="url">提交地址</param> /// <param name="param">参数</param> /// <returns>string</returns> public static string WebRequestPostOrGet(string sUrl, string sParam) { byte[] bt = System.Text.Encoding.UTF8.GetBytes(sParam); Uri uriurl = new Uri(sUrl); HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(uriurl);//HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url + (url.IndexOf("?") > -1 ? "" : "?") + param); req.Method = "Post"; req.Timeout = 120 * 1000; req.ContentType = "application/x-www-form-urlencoded;"; req.ContentLength = bt.Length; using (Stream reqStream = req.GetRequestStream())//using 使用可以释放using段内的内存 { reqStream.Write(bt, 0, bt.Length); reqStream.Flush(); } try { using (WebResponse res = req.GetResponse()) { //在这里对接收到的页面内容进行处理 Stream resStream = res.GetResponseStream(); StreamReader resStreamReader = new StreamReader(resStream, System.Text.Encoding.UTF8); string resLine; System.Text.StringBuilder resStringBuilder = new System.Text.StringBuilder(); while ((resLine = resStreamReader.ReadLine()) != null) { resStringBuilder.Append(resLine + System.Environment.NewLine); } resStream.Close(); resStreamReader.Close(); return resStringBuilder.ToString(); } } catch (Exception ex) { return ex.Message;//url错误时候回报错 } } #endregion Post/Get提交调用抓取
没了
没错,就是这么简单,只有这么点内容就已经完成了整个微信授权登录的事情
---------------------------------------------------------------------------------------------------------
转载请记得说明作者和出处哦-.-
作者:KingDuDu
原文出处:https://www.cnblogs.com/kingdudu/articles/8795928.html
---------------------------------------------------------------------------------------------------------