WeChat 공개 계정 개발 웹페이지는 사용자 기본 정보 획득 권한을 부여합니다.

高洛峰
풀어 주다: 2017-02-24 16:54:48
원래의
2962명이 탐색했습니다.

사용자가 WeChat 클라이언트에서 제3자 웹페이지에 액세스하는 경우 공식 계정은 WeChat 웹페이지 인증 메커니즘을 통해 사용자의 기본 정보를 얻은 후 비즈니스 로직을 구현할 수 있습니다.

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

참고: 웹페이지를 인증하는 방법에는 두 가지가 있습니다.

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

자세한 웹 승인은 공식 웹사이트 문서를 참조하세요. 웹 승인

자동 승인

자동 승인은 사용자가 결제할 때 사용자의 기본 정보를 얻을 수 있습니다. 사용자가 이 프로세스를 수행할 필요가 없습니다.

첫 번째 단계는 팩토리 클래스를 통해 요청을 전달하는 것입니다


 /// <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;
        }
로그인 후 복사


두 번째 단계는 user를 작성하는 것입니다. -집중 이벤트


 
         
         
         
         
            WeChat.Messages.TextMessage tm = = em.FromUserName;
            tm.FromUserName = em.ToUserName;
            tm.CreateTime ==
로그인 후 복사
<span style="color: #000000;">       </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> tm.GenerateContent();<br/> }</span>
로그인 후 복사


세 번째 단계는 획득한 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;
        }
로그인 후 복사


세 번째 단계와 관련하여 HttpUtility 클래스에 몇 가지 다른 공개 도우미 메서드가 있으며 여기에 공개되어


<이라고 할 수 있습니다. 🎜>

GetData的实现
로그인 후 복사


코드 보기

그런데 위 글에서 사용한 User 클래스는 다음과 같습니다


     public static string GetData(string url)
        {            return SendGetHttpRequest(url, "application/x-www-form-urlencoded");
        }
로그인 후 복사


실증효과

현재 데이터베이스에 10개의 데이터가 있습니다. 이 공식 계정을 클릭하면, 이 사용자의 기본 정보는 데이터베이스에 저장되며 데이터베이스를 새로 고치면 11개의 데이터로 변경됩니다.

웹 페이지 인증 프로세스

자세한 소개는 아직 제공됩니다. 공식 웹 사이트 문서를 참조하세요: 웹 인증

첫 번째 단계는 사용자가 인증되었는지 확인하는 것입니다. .그렇지 않은 경우 승인 페이지로 이동하여

핵심코드

ParseJson的实现
로그인 후 복사

중에서 확인하세요. 사용자 인증을 위한 코드 방법은 다음과 같습니다:

     public static XDocument ParseJson(string json, string rootName)
        {            return JsonConvert.DeserializeXNode(json, rootName);
        }
로그인 후 복사


여기서 ShouQuanAccessToken 방법

/// <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;
        }
로그인 후 복사


사용자 엔터티

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; }
    }
로그인 후 복사


사용되는 MyHttpHelper 공용 클래스는 다음과 같습니다.

        /// <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|| HttpContext.Current.Session["ShouquanCode"].ToString()=="")
            {
                HttpContext.Current.Session["ShouquanCode"] = "123";                //用户授权的Code                GetShouQuanCodeUrl(HttpContext.Current.Request.Url.AbsoluteUri);
            }            else if(HttpContext.Current.Request.QueryString["code"] == null || HttpContext.Current.Request.QueryString["code"] == "")
            {                //用户授权的Code                GetShouQuanCodeUrl(HttpContext.Current.Request.Url.AbsoluteUri);
            }            else
            {                var model = ShouQuanAccessToken(HttpContext.Current.Request.QueryString["code"]);                var url =
                    $"//m.sbmmt.com/{model.access_token}&openid={model.openid}&lang=zh_CN";                string gethtml = MyHttpHelper.HttpGet(url);                var ac = JsonHelpers.ToObject<ShouQuanWeiXinUserInfo>(gethtml);                return ac;
            }            return null;
        }
로그인 후 복사



코드로 캡슐화된 JsonHelpers 클래스 보기

는 다음과 같습니다

아아앙



코드 보기

그 중 VS2015 이하라면 url 문자열을 string.format("") 메소드로 변경하시면 됩니다

값 호출 방법

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

공식 계정 링크 클릭 시 효과는 다음과 같습니다.

WeChat 공개 계정 개발 웹페이지는 사용자 기본 정보 획득 권한을 부여합니다.

더 많은 WeChat 공개 계정 개발 웹 페이지가 사용자 기본 정보를 얻을 수 있도록 승인되었습니다. 관련 기사는 PHP 중국어 웹 사이트에 주목하세요! 微信公众号开发网页授权获取用户基本信息

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿