微信公众号开发网页授权获取用户基本信息

广告:宝塔Linux面板高效运维的服务器管理软件 点击【 https://www.bt.cn/p/uNLv1L 】立即购买

微信公众号开发网页授权获取用户基本信息

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

注意:网页授权两种方式

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

静默授权

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

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

 /// <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 ==
登录后复制
       return tm.GenerateContent(); }
登录后复制

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

/// <summary>        /// 根据OpenId将此条粉丝记录插入数据库中        /// </summary>        /// <param name="FromUserName"></param>        /// <param name="ToUserName"></param>        public void ShowUserInfo(string FromUserName, string ToUserName)        {            try            {                Models.Users user = new Models.Users();                DAL.User userInfo = new DAL.User();                //获取accesstoken,获取用户基本信息需要Openid和accesstoken即可         accesstoken = Utility.Context.AccessToken;         string url = string.Format("https://api.weixin.qq.com/cgi-bin/user/info?access_token={0}&openid={1}&lang=zh_CN", accesstoken, FromUserName);               string result = HttpUtility.GetData(url);               XDocument doc = XmlUtility.ParseJson(result, "root");               XElement root = doc.Root;               if (root != null)               {                    #region 取值/存值                                        subscribe = root.Element("subscribe").Value;//是否关注 1 是关注                     nickname = root.Element("nickname").Value; //昵称                    sex = root.Element("sex").Value; //性别什么                    headimgurl = root.Element("headimgurl").Value; //头像url                    province = root.Element("province").Value;//地区                     country = root.Element("country").Value;                    language = root.Element("language").Value;                    subscribe_time = root.Element("subscribe_time").Value;                    DateTime create_time = Common.GetTime(subscribe_time);//将时间戳转换为当前时间                    city = root.Element("city").Value;                    user.OpenID = FromUserName;//OpenID即粉丝ID                    user.PublicId = ToUserName;                    user.UserID = FromUserName;                    user.NickName = nickname;                    user.Sex = int.Parse(sex);                    user.Subscribe = int.Parse(subscribe);                    user.Country = country;                    user.Province = province;                    user.City = city;                    user.CreateDate = create_time;                    user.HeadimgUrl = headimgurl;                    //将user实体存入数据库中                    bool show = _user.Add(user);                    #endregion                }            }            catch            {                throw (new ArgumentNullException());            }        }
登录后复制

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

/// <summary>        /// 发送请求        /// </summary>        /// <param name="url">Url地址</param>        /// <param name="data">数据</param>        public static string SendHttpRequest(string url, string data)        {            return SendPostHttpRequest(url, "application/x-www-form-urlencoded", data);        }        /// <summary>        ///         /// </summary>        /// <param name="url"></param>        /// <returns></returns>        public static string GetData(string url)        {            return SendGetHttpRequest(url, "application/x-www-form-urlencoded");        }        /// <summary>        /// 发送请求        /// </summary>        /// <param name="url">Url地址</param>        /// <param name="method">方法(post或get)</param>        /// <param name="method">数据类型</param>        /// <param name="requestData">数据</param>        public static string SendPostHttpRequest(string url, string contentType, string requestData)        {            WebRequest request = (WebRequest)HttpWebRequest.Create(url);            request.Method = "POST";            byte[] postBytes = null;            request.ContentType = contentType;            postBytes = Encoding.UTF8.GetBytes(requestData);            request.ContentLength = postBytes.Length;            using (Stream outstream = request.GetRequestStream())            {                outstream.Write(postBytes, 0, postBytes.Length);            }            string result = string.Empty;            using (WebResponse response = request.GetResponse())            {                if (response != null)                {                    using (Stream stream = response.GetResponseStream())                    {                        using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))                        {                            result = reader.ReadToEnd();                        }                    }                }            }            return result;        }        /// <summary>        /// 发送请求        /// </summary>        /// <param name="url">Url地址</param>        /// <param name="method">方法(post或get)</param>        /// <param name="method">数据类型</param>        /// <param name="requestData">数据</param>        public static string SendGetHttpRequest(string url, string contentType)        {            WebRequest request = (WebRequest)HttpWebRequest.Create(url);            request.Method = "GET";            request.ContentType = contentType;            string result = string.Empty;            using (WebResponse response = request.GetResponse())            {                if (response != null)                {                    using (Stream stream = response.GetResponseStream())                    {                        using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))                        {                            result = reader.ReadToEnd();                        }                    }                }            }            return result;        }
登录后复制

View Code

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

                                                 WeChat.Messages.TextMessage tm = = em.FromUserName;            tm.FromUserName = em.ToUserName;            tm.CreateTime ==0
登录后复制

演示效果

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

网页授权流程

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

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

核心代码

                                                 WeChat.Messages.TextMessage tm = = em.FromUserName;            tm.FromUserName = em.ToUserName;            tm.CreateTime ==1
登录后复制

其中,用户授权的code方法如下:

                                                 WeChat.Messages.TextMessage tm = = em.FromUserName;            tm.FromUserName = em.ToUserName;            tm.CreateTime ==2
登录后复制

其中ShouQuanAccessToken方法

                                                 WeChat.Messages.TextMessage tm = = em.FromUserName;            tm.FromUserName = em.ToUserName;            tm.CreateTime ==3
登录后复制

用户实体

                                                 WeChat.Messages.TextMessage tm = = em.FromUserName;            tm.FromUserName = em.ToUserName;            tm.CreateTime ==4
登录后复制

其中用到的MyHttpHelper公众类如下

                                                 WeChat.Messages.TextMessage tm = = em.FromUserName;            tm.FromUserName = em.ToUserName;            tm.CreateTime ==5
登录后复制

View Code

封装的JsonHelpers类如下

                                                 WeChat.Messages.TextMessage tm = = em.FromUserName;            tm.FromUserName = em.ToUserName;            tm.CreateTime ==6
登录后复制

View Code

其中,如果是VS2015以下的,可以将url字符串改成string.format("")方式

调用取值的方式

效果展示

点击公众号链接效果如下:

更多微信公众号开发网页授权获取用户基本信息 相关文章请关注PHP中文网!

广告:SSL证书一年128.66元起,点击购买~~~

9543建站博客
一个专注于网站开发、微信开发的技术类纯净博客。

作者头像
admin创始人

肥猫,知名SEO博客站长,14年SEO经验。

上一篇:nginx不支持yii怎么办
下一篇:已是最新文章

发表评论

关闭广告
关闭广告