首先一定要熟读, 最起码过一遍微信开发者文档
微信开发者文档
文档写的很清楚
授权登录四步走
在正文开始前, 我得讲清楚一个事情
敲黑板, 划重点: 微信一共有两个 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 提交调用抓取
没了
没错, 就是这么简单, 只有这么点内容就已经完成了整个微信授权登录的事情
---------------------------------------------------------------------------------------------------------
来源: https://www.cnblogs.com/kingdudu/p/8795928.html