前言
如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑。
注意:网页授权两种方式
更多网页授权请查阅官网文档:网页授权
静默授权
静默授权即可以在用户关注的的时候,获取用户基本信息,此过程用户无感知。
第一步,通过工厂类 转发请求
/// <returns></returns> public string HandleRequest() { string response = string.Empty; EventMessage em = EventMessage.LoadFromXml(RequestXml); if (em != null) { switch (em.Event.ToLower()) { case ("subscribe"): response = SubscribeEventHandler(em);//通过工厂类分发过来的请求,匹配到关注事件 break; case ("unsubscribe"): response = Un_SubscribeEventHandler(em); break; case "click": response = ClickEventHandler(em); break; } } return response; }
第二步,写用户关注事件
WeChat.Messages.TextMessage tm = = em.FromUserName; tm.FromUserName = em.ToUserName; tm.CreateTime ==
第三步,根据得到的OpenId及accesstoken,即可获取用户基本信息(此处演示是将该用户存入数据库中)
ShowUserInfo( FromUserName, = = accesstoken = url = .Format( result == XmlUtility.ParseJson(result, = (root != 取值/存值= root.Element().Value; nickname = root.Element().Value; sex = root.Element().Value; headimgurl = root.Element().Value; province = root.Element().Value; country = root.Element(= root.Element(= root.Element(= Common.GetTime(subscribe_time); city = root.Element(= FromUserName; user.PublicId = user.NickName == = ===== show = (
上面代码中 AccessToken的实现,新建一个Context类即可
private static DateTime GetAccessToken_Time; /// <summary> /// 过期时间为7200秒 /// </summary> private static int Expires_Period = 7200; /// <summary> /// /// </summary> private static string mAccessToken; public static string AppID = "换成相应公众号的即可"; public static string AppSecret = "换成相应公众号的即可"; /// <summary> /// 调用获取ACCESS_TOKEN,包含判断是否过期 /// </summary> public static string AccessToken { get { //如果为空,或者过期,需要重新获取 if (string.IsNullOrEmpty(mAccessToken) || HasExpired()) { //获取access_token mAccessToken = GetAccessToken(AppID, AppSecret); } return mAccessToken; } } /// <summary> /// 获取ACCESS_TOKEN方法 /// </summary> /// <param name="appId"></param> /// <param name="appSecret"></param> /// <returns></returns> private static string GetAccessToken(string appId, string appSecret) { string url = string.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}", appId, appSecret); string result = HttpUtility.GetData(url); XDocument doc = XmlUtility.ParseJson(result, "root"); XElement root = doc.Root; if (root != null) { XElement access_token = root.Element("access_token"); if (access_token != null) { GetAccessToken_Time = DateTime.Now; if (root.Element("expires_in") != null) { Expires_Period = int.Parse(root.Element("expires_in").Value); } return access_token.Value; } else { GetAccessToken_Time = DateTime.MinValue; } } return null; } /// <summary> /// 判断Access_token是否过期 /// </summary> /// <returns>bool</returns> private static bool HasExpired() { if (GetAccessToken_Time != null) { //过期时间,允许有一定的误差,一分钟。获取时间消耗 if (DateTime.Now > GetAccessToken_Time.AddSeconds(Expires_Period).AddSeconds(-60)) { return true; } } return false; }
GetData的实现
public static string GetData(string url) { return SendGetHttpRequest(url, "application/x-www-form-urlencoded"); }
ParseJson的实现
public static XDocument ParseJson(string json, string rootName) { return JsonConvert.DeserializeXNode(json, rootName); }
关于第三步的 HttpUtility类中还有一些其他公用帮助方法,在这里一并放出,调用即可
View Code
顺便提下上文中用到的User类如下
public class Users { /// <summary> /// 全局凭证唯一Id /// </summary> public string OpenID { get; set; } /// <summary> /// 公众号Id /// </summary> public string PublicId { get; set; } /// <summary> /// 用户Id /// </summary> public string UserID { get; set; } /// <summary> /// 昵称 /// </summary> public string NickName { get; set; } /// <summary> /// 性别 1是男 0是女 /// </summary> public int Sex { get; set; } /// <summary> /// 是否关注 1是关注 /// </summary> public int Subscribe { get; set; } /// <summary> /// 国家 /// </summary> public string Country { get; set; } /// <summary> /// 地区 /// </summary> public string Province { get; set; } /// <summary> /// 城市 /// </summary> public string City { get; set; } /// <summary> /// 关注时间 /// </summary> public DateTime CreateDate { get; set; } /// <summary> /// 用户头像 /// </summary> public string HeadimgUrl { get; set; } /// <summary> /// 第三方平台Id,可为空 /// </summary> public string UnionID { get; set; } /// <summary> /// 用户取消关注时间 /// </summary> public DateTime Un_Subscribe_Time { get; set; } }
演示效果
数据库中此时是存在10条数据的,当点击关注此公众号的时候,就将此用户的基本信息存入数据库了,数据库刷新后变成11条数据
网页授权流程
具体介绍依然可参考官网文档:网页授权
第一步,判断该用户是否获取授权,若没有授权,则跳转至授权页面,若授权,则获取基本信息
核心代码
/// <summary> /// 获取授权用户的基本信息,包括头像,姓名,等等(推荐方法) /// </summary> /// <param name="accessToken">用户授权之后的accessToken</param> /// <param name="openid">用户授权之后的openid</param> /// <returns></returns> public static ShouQuanWeiXinUserInfo GetShouQuanMessage() { //先判断是否有获取到用户授权的Code,HttpContext.Current.Session["ShouquanCode"] if (HttpContext.Current.Session["ShouquanCode"] == null||