前言

 如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑。

万码学堂,电脑培训,计算机培训,Java培训,JavaEE开发培训,青岛软件培训,软件工程师培训

 

注意:网页授权两种方式

万码学堂,电脑培训,计算机培训,Java培训,JavaEE开发培训,青岛软件培训,软件工程师培训

更多网页授权请查阅官网文档:网页授权

静默授权

静默授权即可以在用户关注的的时候,获取用户基本信息,此过程用户无感知。

第一步,通过工厂类 转发请求

万码学堂,电脑培训,计算机培训,Java培训,JavaEE开发培训,青岛软件培训,软件工程师培训

                /// <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;         }

万码学堂,电脑培训,计算机培训,Java培训,JavaEE开发培训,青岛软件培训,软件工程师培训

第二步,写用户关注事件

万码学堂,电脑培训,计算机培训,Java培训,JavaEE开发培训,青岛软件培训,软件工程师培训

                                                      WeChat.Messages.TextMessage tm = = em.FromUserName;             tm.FromUserName = em.ToUserName;             tm.CreateTime ==
       

万码学堂,电脑培训,计算机培训,Java培训,JavaEE开发培训,青岛软件培训,软件工程师培训

第三步,根据得到的OpenId及accesstoken,即可获取用户基本信息(此处演示是将该用户存入数据库中)

万码学堂,电脑培训,计算机培训,Java培训,JavaEE开发培训,青岛软件培训,软件工程师培训

                                          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 = (

万码学堂,电脑培训,计算机培训,Java培训,JavaEE开发培训,青岛软件培训,软件工程师培训

上面代码中 AccessToken的实现,新建一个Context类即可

万码学堂,电脑培训,计算机培训,Java培训,JavaEE开发培训,青岛软件培训,软件工程师培训

    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;         }

万码学堂,电脑培训,计算机培训,Java培训,JavaEE开发培训,青岛软件培训,软件工程师培训

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类中还有一些其他公用帮助方法,在这里一并放出,调用即可

万码学堂,电脑培训,计算机培训,Java培训,JavaEE开发培训,青岛软件培训,软件工程师培训 View Code

顺便提下上文中用到的User类如下

万码学堂,电脑培训,计算机培训,Java培训,JavaEE开发培训,青岛软件培训,软件工程师培训

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; }     }

万码学堂,电脑培训,计算机培训,Java培训,JavaEE开发培训,青岛软件培训,软件工程师培训

演示效果

数据库中此时是存在10条数据的,当点击关注此公众号的时候,就将此用户的基本信息存入数据库了,数据库刷新后变成11条数据

 万码学堂,电脑培训,计算机培训,Java培训,JavaEE开发培训,青岛软件培训,软件工程师培训

万码学堂,电脑培训,计算机培训,Java培训,JavaEE开发培训,青岛软件培训,软件工程师培训

网页授权流程

万码学堂,电脑培训,计算机培训,Java培训,JavaEE开发培训,青岛软件培训,软件工程师培训

具体介绍依然可参考官网文档:网页授权

第一步,判断该用户是否获取授权,若没有授权,则跳转至授权页面,若授权,则获取基本信息

核心代码

万码学堂,电脑培训,计算机培训,Java培训,JavaEE开发培训,青岛软件培训,软件工程师培训

        /// <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||