WeChat パブリック アカウント開発 Web ページはユーザーの基本情報(bào)の取得を許可します
Feb 24, 2017 pm 04:54 PMユーザーが WeChat クライアントでサードパーティの Web ページにアクセスすると、公式アカウントは WeChat Web ページの承認(rèn)メカニズムを通じてユーザーの基本情報(bào)を取得し、ビジネス ロジックを?qū)g裝できます。
注: Web ページを認(rèn)証するには 2 つの方法があります
Web 認(rèn)証の詳細(xì)については、公式 Web サイトのドキュメントを確認(rèn)してください: Web 認(rèn)証
サイレント認(rèn)証
サイレント認(rèn)証は、ユーザーが注意を払ってユーザーの基本情報(bào)を取得し、ユーザーがこのプロセスに気づいていない場合に使用されます。
最初のステップは、ファクトリークラスを通じてリクエストを転送することです
/// <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);//通過工廠類分發(fā)過來的請(qǐng)求,匹配到關(guān)注事件 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。ユーザーの基本情報(bào)を取得します(ここでのデモはユーザーをデータベースに保存することです)
/// <summary> /// 根據(jù)OpenId將此條粉絲記錄插入數(shù)據(jù)庫中 /// </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;//是否關(guān)注 1 是關(guān)注 nickname = root.Element("nickname").Value; //昵稱 sex = root.Element("sex").Value; //性別什么 headimgurl = root.Element("headimgurl").Value; //頭像url province = root.Element("province").Value;//地區(qū) country = root.Element("country").Value; language = root.Element("language").Value; subscribe_time = root.Element("subscribe_time").Value; DateTime create_time = Common.GetTime(subscribe_time);//將時(shí)間戳轉(zhuǎn)換為當(dāng)前時(shí)間 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實(shí)體存入數(shù)據(jù)庫中 bool show = _user.Add(user); #endregion } } catch { throw (new ArgumentNullException()); } }
private static DateTime GetAccessToken_Time; /// <summary> /// 過期時(shí)間為7200秒 /// </summary> private static int Expires_Period = 7200; /// <summary> /// /// </summary> private static string mAccessToken; public static string AppID = "換成相應(yīng)公眾號(hào)的即可"; public static string AppSecret = "換成相應(yīng)公眾號(hào)的即可"; /// <summary> /// 調(diào)用獲取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) { //過期時(shí)間,允許有一定的誤差,一分鐘。獲取時(shí)間消耗 if (DateTime.Now > GetAccessToken_Time.AddSeconds(Expires_Period).AddSeconds(-60)) { return true; } } return false; }
GetData的實(shí)現(xiàn)
public static string GetData(string url) { return SendGetHttpRequest(url, "application/x-www-form-urlencoded"); }
ParseJson的實(shí)現(xiàn)
。
public static XDocument ParseJson(string json, string rootName) { return JsonConvert.DeserializeXNode(json, rootName); }
View Code
ちなみに、上記の記事で使用したUserクラスは以下の通りです
/// <summary> /// 發(fā)送請(qǐng)求 /// </summary> /// <param name="url">Url地址</param> /// <param name="data">數(shù)據(jù)</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> /// 發(fā)送請(qǐng)求 /// </summary> /// <param name="url">Url地址</param> /// <param name="method">方法(post或get)</param> /// <param name="method">數(shù)據(jù)類型</param> /// <param name="requestData">數(shù)據(jù)</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> /// 發(fā)送請(qǐng)求 /// </summary> /// <param name="url">Url地址</param> /// <param name="method">方法(post或get)</param> /// <param name="method">數(shù)據(jù)類型</param> /// <param name="requestData">數(shù)據(jù)</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; }
データベースには10個(gè)のデータがありますこのとき、この公式アカウントをフォローすると、データベースが更新され、そのユーザーが承認(rèn)されているかどうかが判斷されます。認(rèn)証された場合は、認(rèn)証ページに移動(dòng)します。
コアコード
public class Users { /// <summary> /// 全局憑證唯一Id /// </summary> public string OpenID { get; set; } /// <summary> /// 公眾號(hào)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> /// 是否關(guān)注 1是關(guān)注 /// </summary> public int Subscribe { get; set; } /// <summary> /// 國家 /// </summary> public string Country { get; set; } /// <summary> /// 地區(qū) /// </summary> public string Province { get; set; } /// <summary> /// 城市 /// </summary> public string City { get; set; } /// <summary> /// 關(guān)注時(shí)間 /// </summary> public DateTime CreateDate { get; set; } /// <summary> /// 用戶頭像 /// </summary> public string HeadimgUrl { get; set; } /// <summary> /// 第三方平臺(tái)Id,可為空 /// </summary> public string UnionID { get; set; } /// <summary> /// 用戶取消關(guān)注時(shí)間 /// </summary> public DateTime Un_Subscribe_Time { get; set; } }

このうち、ユーザー認(rèn)証のコードメソッドは次のとおりです。 ShouQuanAccessTokenメソッド
/// <summary> /// 獲取授權(quán)用戶的基本信息,包括頭像,姓名,等等(推薦方法) /// </summary> /// <param name="accessToken">用戶授權(quán)之后的accessToken</param> /// <param name="openid">用戶授權(quán)之后的openid</param> /// <returns></returns> public static ShouQuanWeiXinUserInfo GetShouQuanMessage() { //先判斷是否有獲取到用戶授權(quán)的Code,HttpContext.Current.Session["ShouquanCode"] if (HttpContext.Current.Session["ShouquanCode"] == null|| HttpContext.Current.Session["ShouquanCode"].ToString()=="") { HttpContext.Current.Session["ShouquanCode"] = "123"; //用戶授權(quán)的Code GetShouQuanCodeUrl(HttpContext.Current.Request.Url.AbsoluteUri); } else if(HttpContext.Current.Request.QueryString["code"] == null || HttpContext.Current.Request.QueryString["code"] == "") { //用戶授權(quán)的Code GetShouQuanCodeUrl(HttpContext.Current.Request.Url.AbsoluteUri); } else { var model = ShouQuanAccessToken(HttpContext.Current.Request.QueryString["code"]); var url = $"http://ipnx.cn/{model.access_token}&openid={model.openid}&lang=zh_CN"; string gethtml = MyHttpHelper.HttpGet(url); var ac = JsonHelpers.ToObject<ShouQuanWeiXinUserInfo>(gethtml); return ac; } return null; }

/// <summary> /// 重新獲取用戶授權(quán)的Code,可以獲取用戶的基本信息(頭像,姓名,等等)(推薦用的方法) /// </summary> /// <param name="url">目標(biāo)Url</param> /// <returns></returns> public static void GetShouQuanCodeUrl(string url) { string CodeUrl = ""; //加密過的url string value = HttpUtility.UrlEncode(url); //用戶授權(quán)后的Code CodeUrl = $"http://ipnx.cn/{Appid}&redirect_uri={value}&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect"; System.Web.HttpContext.Current.Response.Redirect(CodeUrl);//先跳轉(zhuǎn)到微信的服務(wù)器,取得code后會(huì)跳回來這頁面的 }
使用するMyHttpHelperパブリッククラスは以下の通りです
/// <summary> //用戶授權(quán)之后,獲取授權(quán)的Access_Token與基本的Access_Token是不同的(推薦方法) /// </summary> /// <param name="code">用戶授權(quán)之后的Code</param> /// <returns></returns> public static OauthAccessToken ShouQuanAccessToken(string code) { var url = $"http://ipnx.cn/{Appid}&secret={Secret}&code={code}&grant_type=authorization_code"; string gethtml = MyHttpHelper.HttpGet(url); OauthAccessToken ac = new OauthAccessToken(); ac = JsonHelpers.ToObject<OauthAccessToken>(gethtml); return ac; }
コードを表示
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("")メソッドに変更できます
値の呼び出し方法
効果の表示
公式アカウントのリンクをクリックした場合の効果は次のとおりです:
ユーザーの基本情報(bào)を取得するためのWeChatパブリックアカウント開発Webページの承認(rèn)の詳細(xì)については、関連記事 PHP 中國語 Web サイトをフォローしてください。

ホットAIツール

Undress AI Tool
脫衣畫像を無料で

Undresser.AI Undress
リアルなヌード寫真を作成する AI 搭載アプリ

AI Clothes Remover
寫真から衣服を削除するオンライン AI ツール。

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中國語版
中國語版、とても使いやすい

ゼンドスタジオ 13.0.1
強(qiáng)力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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