ホームページ  >  記事  >  WeChat アプレット  >  WeChat パブリック アカウント開発 Web ページはユーザーの基本情報の取得を許可します

WeChat パブリック アカウント開発 Web ページはユーザーの基本情報の取得を許可します

高洛峰
高洛峰オリジナル
2017-02-24 16:54:482910ブラウズ

ユーザーが WeChat クライアントでサードパーティの Web ページにアクセスすると、公式アカウントは WeChat Web ページの承認メカニズムを通じてユーザーの基本情報を取得し、ビジネス ロジックを実装できます。

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

注: Web ページを認証するには 2 つの方法があります

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

Web 認証の詳細については、公式 Web サイトのドキュメントを確認してください: Web 認証

サイレント認証

サイレント認証は、ユーザーが注意を払ってユーザーの基本情報を取得し、ユーザーがこのプロセスに気づいていない場合に使用されます。

最初のステップは、ファクトリークラスを通じてリクエストを転送することです


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


2番目のステップは、ユーザーの注意イベントを書き込むことです


 
         
         
         
         
            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>


3番目のステップは、取得したOpenIdとaccesstoken。ユーザーの基本情報を取得します(ここでのデモはユーザーをデータベースに保存することです)


上記のコードでのAccessTokenの実装は、新しいContextクラスを作成するだけです


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

        }


private static DateTime GetAccessToken_Time;
        /// 631fb227578dfffda61e1fa4d04b7d25
        /// 过期时间为7200秒
        /// 039f3e95db2a684c7b74365531eb6044
        private static int Expires_Period = 7200;
        /// 631fb227578dfffda61e1fa4d04b7d25
        /// 
        /// 039f3e95db2a684c7b74365531eb6044
        private static string mAccessToken;

        public static string AppID = "换成相应公众号的即可";
        public static string AppSecret = "换成相应公众号的即可";
        /// 631fb227578dfffda61e1fa4d04b7d25
        /// 调用获取ACCESS_TOKEN,包含判断是否过期
        /// 039f3e95db2a684c7b74365531eb6044
        public static string AccessToken
        {
            get
            {
                //如果为空,或者过期,需要重新获取
                if (string.IsNullOrEmpty(mAccessToken) || HasExpired())
                {
                    //获取access_token
                    mAccessToken = GetAccessToken(AppID, AppSecret);
                }

                return mAccessToken;
            }
        }
        /// 631fb227578dfffda61e1fa4d04b7d25
        /// 获取ACCESS_TOKEN方法
        /// 039f3e95db2a684c7b74365531eb6044
        /// d6dd8ceebd14bc425aa6d108b5f4eca38bb7487ae6a16a43571bc14c7fcf93c2
        /// 50cac99ccafb21bc0689901ed6e5eb668bb7487ae6a16a43571bc14c7fcf93c2
        /// 2363942ed0d6cd3e85bae1dffa568116f7735d9f6a7af371769ab5c16d23b2f3
        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;
        }
        /// 631fb227578dfffda61e1fa4d04b7d25
        /// 判断Access_token是否过期
        /// 039f3e95db2a684c7b74365531eb6044
        /// 2363942ed0d6cd3e85bae1dffa568116boolf7735d9f6a7af371769ab5c16d23b2f3
        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的实现


3番目のステップに関しては、HttpUtilityクラスには他のパブリックヘルパーメソッドがいくつかあります。それらはここでリリースされており、呼び出すことができます


     public static XDocument ParseJson(string json, string rootName)
        {            return JsonConvert.DeserializeXNode(json, rootName);
        }


View Code

ちなみに、上記の記事で使用したUserクラスは以下の通りです

/// 631fb227578dfffda61e1fa4d04b7d25
        /// 发送请求        /// 039f3e95db2a684c7b74365531eb6044
        /// 0ab5e68b8f5d292e9a5f810a0a5b2929Url地址8bb7487ae6a16a43571bc14c7fcf93c2
        /// c8a98340aded2d5f70b63a18be4bcac7数据8bb7487ae6a16a43571bc14c7fcf93c2
        public static string SendHttpRequest(string url, string data)
        {            return SendPostHttpRequest(url, "application/x-www-form-urlencoded", data);
        }        /// 631fb227578dfffda61e1fa4d04b7d25
        /// 
        /// 039f3e95db2a684c7b74365531eb6044
        /// 0ab5e68b8f5d292e9a5f810a0a5b29298bb7487ae6a16a43571bc14c7fcf93c2
        /// 2363942ed0d6cd3e85bae1dffa568116f7735d9f6a7af371769ab5c16d23b2f3
        public static string GetData(string url)
        {            return SendGetHttpRequest(url, "application/x-www-form-urlencoded");
        }        /// 631fb227578dfffda61e1fa4d04b7d25
        /// 发送请求        /// 039f3e95db2a684c7b74365531eb6044
        /// 0ab5e68b8f5d292e9a5f810a0a5b2929Url地址8bb7487ae6a16a43571bc14c7fcf93c2
        /// 7ac84fe36b5243e1cfce422579e18326方法(post或get)8bb7487ae6a16a43571bc14c7fcf93c2
        /// 7ac84fe36b5243e1cfce422579e18326数据类型8bb7487ae6a16a43571bc14c7fcf93c2
        /// f46925ffb3310f776e18deb091104d79数据8bb7487ae6a16a43571bc14c7fcf93c2
        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;
        }        /// 631fb227578dfffda61e1fa4d04b7d25
        /// 发送请求        /// 039f3e95db2a684c7b74365531eb6044
        /// 0ab5e68b8f5d292e9a5f810a0a5b2929Url地址8bb7487ae6a16a43571bc14c7fcf93c2
        /// 7ac84fe36b5243e1cfce422579e18326方法(post或get)8bb7487ae6a16a43571bc14c7fcf93c2
        /// 7ac84fe36b5243e1cfce422579e18326数据类型8bb7487ae6a16a43571bc14c7fcf93c2
        /// f46925ffb3310f776e18deb091104d79数据8bb7487ae6a16a43571bc14c7fcf93c2
        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;
        }


デモ効果


データベースには10個のデータがありますこのとき、この公式アカウントをフォローすると、データベースが更新され、そのユーザーが承認されているかどうかが判断されます。認証された場合は、認証ページに移動します。

コアコード

public class Users
    {        /// 631fb227578dfffda61e1fa4d04b7d25
        /// 全局凭证唯一Id        /// 039f3e95db2a684c7b74365531eb6044
        public string OpenID { get; set; }        /// 631fb227578dfffda61e1fa4d04b7d25
        /// 公众号Id        /// 039f3e95db2a684c7b74365531eb6044
        public string PublicId { get; set; }        /// 631fb227578dfffda61e1fa4d04b7d25
        /// 用户Id        /// 039f3e95db2a684c7b74365531eb6044
        public string UserID { get; set; }        /// 631fb227578dfffda61e1fa4d04b7d25
        /// 昵称        /// 039f3e95db2a684c7b74365531eb6044
        public string NickName { get; set; }        /// 631fb227578dfffda61e1fa4d04b7d25
        /// 性别 1是男 0是女        /// 039f3e95db2a684c7b74365531eb6044
        public int Sex { get; set; }        /// 631fb227578dfffda61e1fa4d04b7d25
        /// 是否关注 1是关注 
        /// 039f3e95db2a684c7b74365531eb6044
        public int Subscribe { get; set; }        /// 631fb227578dfffda61e1fa4d04b7d25
        /// 国家        /// 039f3e95db2a684c7b74365531eb6044
        public string Country { get; set; }        /// 631fb227578dfffda61e1fa4d04b7d25
        /// 地区        /// 039f3e95db2a684c7b74365531eb6044
        public string Province { get; set; }        /// 631fb227578dfffda61e1fa4d04b7d25
        /// 城市        /// 039f3e95db2a684c7b74365531eb6044
        public string City { get; set; }        /// 631fb227578dfffda61e1fa4d04b7d25
        /// 关注时间        /// 039f3e95db2a684c7b74365531eb6044
        public DateTime CreateDate { get; set; }        /// 631fb227578dfffda61e1fa4d04b7d25
        /// 用户头像        /// 039f3e95db2a684c7b74365531eb6044
        public string HeadimgUrl { get; set; }        /// 631fb227578dfffda61e1fa4d04b7d25
        /// 第三方平台Id,可为空        /// 039f3e95db2a684c7b74365531eb6044
        public string UnionID { get; set; }        /// 631fb227578dfffda61e1fa4d04b7d25
        /// 用户取消关注时间        /// 039f3e95db2a684c7b74365531eb6044
        public DateTime Un_Subscribe_Time { get; set; }
    }

このうち、ユーザー認証のコードメソッドは次のとおりです。 ShouQuanAccessTokenメソッド

        /// 631fb227578dfffda61e1fa4d04b7d25
        /// 获取授权用户的基本信息,包括头像,姓名,等等(推荐方法)        /// 039f3e95db2a684c7b74365531eb6044
        /// 25fcf4a155410a35bb92f6672225e602用户授权之后的accessToken8bb7487ae6a16a43571bc14c7fcf93c2
        /// 69f6963a53f2b062886c2f8bda5b040c用户授权之后的openid8bb7487ae6a16a43571bc14c7fcf93c2
        /// 2363942ed0d6cd3e85bae1dffa568116f7735d9f6a7af371769ab5c16d23b2f3
        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 =
                    $"http://www.php.cn/{model.access_token}&openid={model.openid}&lang=zh_CN";                string gethtml = MyHttpHelper.HttpGet(url);                var ac = JsonHelpers.ToObject40e1c272594a55af5d8f3e794dcde9cb(gethtml);                return ac;
            }            return null;
        }

ユーザーエンティティ

 /// 631fb227578dfffda61e1fa4d04b7d25
        /// 重新获取用户授权的Code,可以获取用户的基本信息(头像,姓名,等等)(推荐用的方法)        /// 039f3e95db2a684c7b74365531eb6044
        /// 0ab5e68b8f5d292e9a5f810a0a5b2929目标Url8bb7487ae6a16a43571bc14c7fcf93c2
        /// 2363942ed0d6cd3e85bae1dffa568116f7735d9f6a7af371769ab5c16d23b2f3
        public static void GetShouQuanCodeUrl(string url)
        {            string CodeUrl = "";            //加密过的url
            string value = HttpUtility.UrlEncode(url);            //用户授权后的Code
            CodeUrl = $"http://www.php.cn/{Appid}&redirect_uri={value}&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect";
            System.Web.HttpContext.Current.Response.Redirect(CodeUrl);//先跳转到微信的服务器,取得code后会跳回来这页面的
        }


使用するMyHttpHelperパブリッククラスは以下の通りです

 /// 631fb227578dfffda61e1fa4d04b7d25
        //用户授权之后,获取授权的Access_Token与基本的Access_Token是不同的(推荐方法)
        /// 039f3e95db2a684c7b74365531eb6044
        /// 779fe2e004f04a7d008a46e470a37e15用户授权之后的Code8bb7487ae6a16a43571bc14c7fcf93c2
        /// 2363942ed0d6cd3e85bae1dffa568116f7735d9f6a7af371769ab5c16d23b2f3
        public static OauthAccessToken ShouQuanAccessToken(string code)
        {            var url = $"http://www.php.cn/{Appid}&secret={Secret}&code={code}&grant_type=authorization_code";            string gethtml = MyHttpHelper.HttpGet(url);
            OauthAccessToken ac = new OauthAccessToken();
            ac = JsonHelpers.ToObjectae04fe4e8e60d0cd6884ddec311b9ab2(gethtml);            return ac;
        }



コードを表示

カプセル化された JsonHelpers クラスは次のとおりです。以下の通り



public class OauthAccessToken
        {            public string access_token { get; set; }            public string expires_in { get; set; }            public string refresh_token { get; set; }            public string openid { get; set; }            public string scope { get; set; }
        }



View Code

このうち、VS2015以下であればURL文字列をstring.format("")メソッドに変更できます


値の呼び出し方法

効果の表示

公式アカウントのリンクをクリックした場合の効果は次のとおりです:



ユーザーの基本情報を取得するためのWeChatパブリックアカウント開発Webページの承認の詳細については、関連記事 PHP 中国語 Web サイトをフォローしてください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。