사용자가 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; /// 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; }
세 번째 단계와 관련하여 HttpUtility 클래스에 몇 가지 다른 공개 도우미 메서드가 있으며 여기에 공개되어
GetData的实现
코드 보기
그런데 위 글에서 사용한 User 클래스는 다음과 같습니다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); }
여기서 ShouQuanAccessToken 방법
/// 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; }
사용자 엔터티
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; } }
사용되는 MyHttpHelper 공용 클래스는 다음과 같습니다.
/// 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; }
코드로 캡슐화된 JsonHelpers 클래스 보기
는 다음과 같습니다
아아앙
코드 보기
그 중 VS2015 이하라면 url 문자열을 string.format("") 메소드로 변경하시면 됩니다
값 호출 방법
효과 표시
공식 계정 링크 클릭 시 효과는 다음과 같습니다.
더 많은 WeChat 공개 계정 개발 웹 페이지가 사용자 기본 정보를 얻을 수 있도록 승인되었습니다. 관련 기사는 PHP 중국어 웹 사이트에 주목하세요!