目次
サイレント認証
コアコード
ホームページ WeChat アプレット WeChatの開発 WeChat パブリック アカウント開発 Web ページはユーザーの基本情報の取得を許可します

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

Feb 24, 2017 pm 04:54 PM
WeChatパブリックアカウントの開発

ユーザーが 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クラスを作成するだけです


/// &lt;summary&gt;
        /// 根据OpenId将此条粉丝记录插入数据库中
        /// &lt;/summary&gt;
        /// &lt;param name=&quot;FromUserName&quot;&gt;&lt;/param&gt;
        /// &lt;param name=&quot;ToUserName&quot;&gt;&lt;/param&gt;
        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(&quot;https://api.weixin.qq.com/cgi-bin/user/info?access_token={0}&amp;openid={1}&amp;lang=zh_CN&quot;, accesstoken, FromUserName);
               string result = HttpUtility.GetData(url);
               XDocument doc = XmlUtility.ParseJson(result, &quot;root&quot;);
               XElement root = doc.Root;
               if (root != null)
               {
                    #region 取值/存值
                    
                    subscribe = root.Element(&quot;subscribe&quot;).Value;//是否关注 1 是关注 
                    nickname = root.Element(&quot;nickname&quot;).Value; //昵称
                    sex = root.Element(&quot;sex&quot;).Value; //性别什么
                    headimgurl = root.Element(&quot;headimgurl&quot;).Value; //头像url
                    province = root.Element(&quot;province&quot;).Value;//地区 
                    country = root.Element(&quot;country&quot;).Value;
                    language = root.Element(&quot;language&quot;).Value;
                    subscribe_time = root.Element(&quot;subscribe_time&quot;).Value;
                    DateTime create_time = Common.GetTime(subscribe_time);//将时间戳转换为当前时间
                    city = root.Element(&quot;city&quot;).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;
        /// &lt;summary&gt;
        /// 过期时间为7200秒
        /// &lt;/summary&gt;
        private static int Expires_Period = 7200;
        /// &lt;summary&gt;
        /// 
        /// &lt;/summary&gt;
        private static string mAccessToken;

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

                return mAccessToken;
            }
        }
        /// &lt;summary&gt;
        /// 获取ACCESS_TOKEN方法
        /// &lt;/summary&gt;
        /// &lt;param name=&quot;appId&quot;&gt;&lt;/param&gt;
        /// &lt;param name=&quot;appSecret&quot;&gt;&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        private static string GetAccessToken(string appId, string appSecret)
        {
            string url = string.Format(&quot;https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&amp;appid={0}&amp;secret={1}&quot;, appId, appSecret);
            string result = HttpUtility.GetData(url);

            XDocument doc = XmlUtility.ParseJson(result, &quot;root&quot;);
            XElement root = doc.Root;
            if (root != null)
            {
                XElement access_token = root.Element(&quot;access_token&quot;);
                if (access_token != null)
                {
                    GetAccessToken_Time = DateTime.Now;
                    if (root.Element(&quot;expires_in&quot;) != null)
                    {
                        Expires_Period = int.Parse(root.Element(&quot;expires_in&quot;).Value);
                    }
                    return access_token.Value;
                }
                else
                {
                    GetAccessToken_Time = DateTime.MinValue;
                }
            }

            return null;
        }
        /// &lt;summary&gt;
        /// 判断Access_token是否过期
        /// &lt;/summary&gt;
        /// &lt;returns&gt;bool&lt;/returns&gt;
        private static bool HasExpired()
        {
            if (GetAccessToken_Time != null)
            {
                //过期时间,允许有一定的误差,一分钟。获取时间消耗
                if (DateTime.Now &gt; GetAccessToken_Time.AddSeconds(Expires_Period).AddSeconds(-60))
                {
                    return true;
                }
            }
            return false;
        }
ログイン後にコピー


GetData的实现
ログイン後にコピー


     public static string GetData(string url)
        {            return SendGetHttpRequest(url, &quot;application/x-www-form-urlencoded&quot;);
        }
ログイン後にコピー


ParseJson的实现
ログイン後にコピー


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


     public static XDocument ParseJson(string json, string rootName)
        {            return JsonConvert.DeserializeXNode(json, rootName);
        }
ログイン後にコピー


View Code

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

/// &lt;summary&gt;
        /// 发送请求        /// &lt;/summary&gt;
        /// &lt;param name=&quot;url&quot;&gt;Url地址&lt;/param&gt;
        /// &lt;param name=&quot;data&quot;&gt;数据&lt;/param&gt;
        public static string SendHttpRequest(string url, string data)
        {            return SendPostHttpRequest(url, &quot;application/x-www-form-urlencoded&quot;, data);
        }        /// &lt;summary&gt;
        /// 
        /// &lt;/summary&gt;
        /// &lt;param name=&quot;url&quot;&gt;&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        public static string GetData(string url)
        {            return SendGetHttpRequest(url, &quot;application/x-www-form-urlencoded&quot;);
        }        /// &lt;summary&gt;
        /// 发送请求        /// &lt;/summary&gt;
        /// &lt;param name=&quot;url&quot;&gt;Url地址&lt;/param&gt;
        /// &lt;param name=&quot;method&quot;&gt;方法(post或get)&lt;/param&gt;
        /// &lt;param name=&quot;method&quot;&gt;数据类型&lt;/param&gt;
        /// &lt;param name=&quot;requestData&quot;&gt;数据&lt;/param&gt;
        public static string SendPostHttpRequest(string url, string contentType, string requestData)
        {
            WebRequest request = (WebRequest)HttpWebRequest.Create(url);
            request.Method = &quot;POST&quot;;            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;
        }        /// &lt;summary&gt;
        /// 发送请求        /// &lt;/summary&gt;
        /// &lt;param name=&quot;url&quot;&gt;Url地址&lt;/param&gt;
        /// &lt;param name=&quot;method&quot;&gt;方法(post或get)&lt;/param&gt;
        /// &lt;param name=&quot;method&quot;&gt;数据类型&lt;/param&gt;
        /// &lt;param name=&quot;requestData&quot;&gt;数据&lt;/param&gt;
        public static string SendGetHttpRequest(string url, string contentType)
        {
            WebRequest request = (WebRequest)HttpWebRequest.Create(url);
            request.Method = &quot;GET&quot;;
            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
    {        /// &lt;summary&gt;
        /// 全局凭证唯一Id        /// &lt;/summary&gt;
        public string OpenID { get; set; }        /// &lt;summary&gt;
        /// 公众号Id        /// &lt;/summary&gt;
        public string PublicId { get; set; }        /// &lt;summary&gt;
        /// 用户Id        /// &lt;/summary&gt;
        public string UserID { get; set; }        /// &lt;summary&gt;
        /// 昵称        /// &lt;/summary&gt;
        public string NickName { get; set; }        /// &lt;summary&gt;
        /// 性别 1是男 0是女        /// &lt;/summary&gt;
        public int Sex { get; set; }        /// &lt;summary&gt;
        /// 是否关注 1是关注 
        /// &lt;/summary&gt;
        public int Subscribe { get; set; }        /// &lt;summary&gt;
        /// 国家        /// &lt;/summary&gt;
        public string Country { get; set; }        /// &lt;summary&gt;
        /// 地区        /// &lt;/summary&gt;
        public string Province { get; set; }        /// &lt;summary&gt;
        /// 城市        /// &lt;/summary&gt;
        public string City { get; set; }        /// &lt;summary&gt;
        /// 关注时间        /// &lt;/summary&gt;
        public DateTime CreateDate { get; set; }        /// &lt;summary&gt;
        /// 用户头像        /// &lt;/summary&gt;
        public string HeadimgUrl { get; set; }        /// &lt;summary&gt;
        /// 第三方平台Id,可为空        /// &lt;/summary&gt;
        public string UnionID { get; set; }        /// &lt;summary&gt;
        /// 用户取消关注时间        /// &lt;/summary&gt;
        public DateTime Un_Subscribe_Time { get; set; }
    }
ログイン後にコピー

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

        /// &lt;summary&gt;
        /// 获取授权用户的基本信息,包括头像,姓名,等等(推荐方法)        /// &lt;/summary&gt;
        /// &lt;param name=&quot;accessToken&quot;&gt;用户授权之后的accessToken&lt;/param&gt;
        /// &lt;param name=&quot;openid&quot;&gt;用户授权之后的openid&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        public static ShouQuanWeiXinUserInfo GetShouQuanMessage()
        {            //先判断是否有获取到用户授权的Code,HttpContext.Current.Session[&quot;ShouquanCode&quot;]
            if (HttpContext.Current.Session[&quot;ShouquanCode&quot;] == null|| HttpContext.Current.Session[&quot;ShouquanCode&quot;].ToString()==&quot;&quot;)
            {
                HttpContext.Current.Session[&quot;ShouquanCode&quot;] = &quot;123&quot;;                //用户授权的Code                GetShouQuanCodeUrl(HttpContext.Current.Request.Url.AbsoluteUri);
            }            else if(HttpContext.Current.Request.QueryString[&quot;code&quot;] == null || HttpContext.Current.Request.QueryString[&quot;code&quot;] == &quot;&quot;)
            {                //用户授权的Code                GetShouQuanCodeUrl(HttpContext.Current.Request.Url.AbsoluteUri);
            }            else
            {                var model = ShouQuanAccessToken(HttpContext.Current.Request.QueryString[&quot;code&quot;]);                var url =
                    $&quot;http://www.php.cn/{model.access_token}&amp;openid={model.openid}&amp;lang=zh_CN&quot;;                string gethtml = MyHttpHelper.HttpGet(url);                var ac = JsonHelpers.ToObject&lt;ShouQuanWeiXinUserInfo&gt;(gethtml);                return ac;
            }            return null;
        }
ログイン後にコピー

ユーザーエンティティ

 /// &lt;summary&gt;
        /// 重新获取用户授权的Code,可以获取用户的基本信息(头像,姓名,等等)(推荐用的方法)        /// &lt;/summary&gt;
        /// &lt;param name=&quot;url&quot;&gt;目标Url&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        public static void GetShouQuanCodeUrl(string url)
        {            string CodeUrl = &quot;&quot;;            //加密过的url
            string value = HttpUtility.UrlEncode(url);            //用户授权后的Code
            CodeUrl = $&quot;http://www.php.cn/{Appid}&amp;redirect_uri={value}&amp;response_type=code&amp;scope=snsapi_userinfo&amp;state=STATE#wechat_redirect&quot;;
            System.Web.HttpContext.Current.Response.Redirect(CodeUrl);//先跳转到微信的服务器,取得code后会跳回来这页面的
        }
ログイン後にコピー


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

 /// &lt;summary&gt;
        //用户授权之后,获取授权的Access_Token与基本的Access_Token是不同的(推荐方法)
        /// &lt;/summary&gt;
        /// &lt;param name=&quot;code&quot;&gt;用户授权之后的Code&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        public static OauthAccessToken ShouQuanAccessToken(string code)
        {            var url = $&quot;http://www.php.cn/{Appid}&amp;secret={Secret}&amp;code={code}&amp;grant_type=authorization_code&quot;;            string gethtml = MyHttpHelper.HttpGet(url);
            OauthAccessToken ac = new OauthAccessToken();
            ac = JsonHelpers.ToObject&lt;OauthAccessToken&gt;(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 までご連絡ください。

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)