如果使用者在微信客戶端中存取第三方網頁,公眾號可以透過微信網頁授權機制,來獲取使用者基本資訊,進而實現業務邏輯。
注意:網頁授權兩種方式
更多網頁授權請查閱官網文檔:網頁授權
靜默授權即可以在用戶關注的的時候,獲取用戶基本信息,此過程用戶無感知。
第一步,透過工廠類別轉送請求
/// <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; }
#第二步,寫使用者追蹤事件
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; }
GetData的实现
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); }
#關於第三步驟的 HttpUtility類別中還有一些其他公用幫助方法,在這裡一併放出,調用即可
/// 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; }
#View Code
順便提下上文中用到的User類別如下
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; } }
資料庫中此時是存在10條資料的,當點擊追蹤此公眾號的時候,就將此使用者的基本資訊存入資料庫了,資料庫刷新後變成11條資料
具體介紹依然可參考官網文件:網頁授權
第一步,判斷該使用者是否取得授權,若沒有授權,則跳到授權頁面,若授權,則取得基本資訊
核心程式碼
/// 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; }
其中,使用者授權的code方法如下:
/// 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后会跳回来这页面的 }
其中ShouQuanAccessToken方法
/// 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; }
使用者實體
#
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; } }
其中用到的MyHttpHelper公眾類別如下
/// 631fb227578dfffda61e1fa4d04b7d25 /// Http连接操作帮助类 /// 039f3e95db2a684c7b74365531eb6044 public class HttpHelpers { #region 预定义方法或者变更 //默认的编码 private Encoding encoding = Encoding.Default; //Post数据编码 private Encoding postencoding = Encoding.Default; //HttpWebRequest对象用来发起请求 private HttpWebRequest request = null; //获取影响流的数据对象 private HttpWebResponse response = null; /// 631fb227578dfffda61e1fa4d04b7d25 /// 根据相传入的数据,得到相应页面数据 /// 039f3e95db2a684c7b74365531eb6044 /// 05e71af9e0b602a2910d46be96e57b62参数类对象8bb7487ae6a16a43571bc14c7fcf93c2 /// 2363942ed0d6cd3e85bae1dffa568116返回HttpResult类型f7735d9f6a7af371769ab5c16d23b2f3 public HttpResult GetHtml(HttpItem item) { //返回参数 HttpResult result = new HttpResult(); try { //准备参数 SetRequest(item); } catch (Exception ex) { return new HttpResult() { Cookie = string.Empty, Header = null, Html = ex.Message, StatusDescription = "配置参数时出错:" + ex.Message }; } try { #region 得到请求的response using (response = (HttpWebResponse)request.GetResponse()) { result.StatusCode = response.StatusCode; result.StatusDescription = response.StatusDescription; result.Header = response.Headers; if (response.Cookies != null) result.CookieCollection = response.Cookies; if (response.Headers["set-cookie"] != null) result.Cookie = response.Headers["set-cookie"]; byte[] ResponseByte = null; using (MemoryStream _stream = new MemoryStream()) { //GZIIP处理 if (response.ContentEncoding != null && response.ContentEncoding.Equals("gzip", StringComparison.InvariantCultureIgnoreCase)) { //开始读取流并设置编码方式 new GZipStream(response.GetResponseStream(), CompressionMode.Decompress).CopyTo(_stream, 10240); } else { //开始读取流并设置编码方式 response.GetResponseStream().CopyTo(_stream, 10240); } //获取Byte ResponseByte = _stream.ToArray(); } if (ResponseByte != null & ResponseByte.Length > 0) { //是否返回Byte类型数据 if (item.ResultType == ResultType.Byte) result.ResultByte = ResponseByte; //从这里开始我们要无视编码了 if (encoding == null) { Match meta = Regex.Match(Encoding.Default.GetString(ResponseByte), "a5b1e796d75a4e1f1df2b763c468d38e 1) ? meta.Groups[2].Value.ToLower().Trim() : string.Empty; if (c.Length > 2) { try { if (c.IndexOf(" ") > 0) c = c.Substring(0, c.IndexOf(" ")); encoding = Encoding.GetEncoding(c.Replace("\"", "").Replace("'", "").Replace(";", "").Replace("iso-8859-1", "gbk").Trim()); } catch { if (string.IsNullOrEmpty(response.CharacterSet)) encoding = Encoding.UTF8; else encoding = Encoding.GetEncoding(response.CharacterSet); } } else { if (string.IsNullOrEmpty(response.CharacterSet)) encoding = Encoding.UTF8; else encoding = Encoding.GetEncoding(response.CharacterSet); } } //得到返回的HTML result.Html = encoding.GetString(ResponseByte); } else { //得到返回的HTML //result.Html = "本次请求并未返回任何数据"; result.Html = ""; } } #endregion } catch (WebException ex) { //这里是在发生异常时返回的错误信息 response = (HttpWebResponse)ex.Response; result.Html = ex.Message; if (response != null) { result.StatusCode = response.StatusCode; result.StatusDescription = response.StatusDescription; } } catch (Exception ex) { result.Html = ex.Message; } if (item.IsToLower) result.Html = result.Html.ToLower(); return result; } /// 631fb227578dfffda61e1fa4d04b7d25 /// 为请求准备参数 /// 039f3e95db2a684c7b74365531eb6044 ///05e71af9e0b602a2910d46be96e57b62参数列表8bb7487ae6a16a43571bc14c7fcf93c2 private void SetRequest(HttpItem item) { // 验证证书 SetCer(item); //设置Header参数 if (item.Header != null && item.Header.Count > 0) foreach (string key in item.Header.AllKeys) { request.Headers.Add(key, item.Header[key]); } // 设置代理 //SetProxy(item); if (item.ProtocolVersion != null) request.ProtocolVersion = item.ProtocolVersion; request.ServicePoint.Expect100Continue = item.Expect100Continue; //请求方式Get或者Post request.Method = item.Method; request.Timeout = item.Timeout; request.KeepAlive = item.KeepAlive; request.ReadWriteTimeout = item.ReadWriteTimeout; if (!string.IsNullOrWhiteSpace(item.Host)) { request.Host = item.Host; } //Accept request.Accept = item.Accept; //ContentType返回类型 request.ContentType = item.ContentType; //UserAgent客户端的访问类型,包括浏览器版本和操作系统信息 request.UserAgent = item.UserAgent; // 编码 encoding = item.Encoding; //设置安全凭证 request.Credentials = item.ICredentials; //设置Cookie SetCookie(item); //来源地址 request.Referer = item.Referer; //是否执行跳转功能 request.AllowAutoRedirect = item.Allowautoredirect; //设置Post数据 SetPostData(item); //设置最大连接 if (item.Connectionlimit > 0) request.ServicePoint.ConnectionLimit = item.Connectionlimit; } /// 631fb227578dfffda61e1fa4d04b7d25 /// 设置证书 /// 039f3e95db2a684c7b74365531eb6044 /// 05e71af9e0b602a2910d46be96e57b628bb7487ae6a16a43571bc14c7fcf93c2 private void SetCer(HttpItem item) { if (!string.IsNullOrWhiteSpace(item.CerPath)) { //这一句一定要写在创建连接的前面。使用回调的方法进行证书验证。 ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckValidationResult); //初始化对像,并设置请求的URL地址 request = (HttpWebRequest)WebRequest.Create(item.URL); SetCerList(item); //将证书添加到请求里 request.ClientCertificates.Add(new X509Certificate(item.CerPath)); } else { //初始化对像,并设置请求的URL地址 request = (HttpWebRequest)WebRequest.Create(item.URL); SetCerList(item); } } /// 631fb227578dfffda61e1fa4d04b7d25 /// 设置多个证书 /// 039f3e95db2a684c7b74365531eb6044 /// 05e71af9e0b602a2910d46be96e57b628bb7487ae6a16a43571bc14c7fcf93c2 private void SetCerList(HttpItem item) { if (item.ClentCertificates != null && item.ClentCertificates.Count > 0) { foreach (X509Certificate c in item.ClentCertificates) { request.ClientCertificates.Add(c); } } } /// 631fb227578dfffda61e1fa4d04b7d25 /// 设置Cookie /// 039f3e95db2a684c7b74365531eb6044 /// 05e71af9e0b602a2910d46be96e57b62Http参数8bb7487ae6a16a43571bc14c7fcf93c2 private void SetCookie(HttpItem item) { if (!string.IsNullOrEmpty(item.Cookie)) request.Headers[HttpRequestHeader.Cookie] = item.Cookie; //设置CookieCollection if (item.ResultCookieType == ResultCookieType.CookieCollection) { request.CookieContainer = new CookieContainer(); if (item.CookieCollection != null && item.CookieCollection.Count > 0) request.CookieContainer.Add(item.CookieCollection); } } /// 631fb227578dfffda61e1fa4d04b7d25 /// 设置Post数据 /// 039f3e95db2a684c7b74365531eb6044 /// 05e71af9e0b602a2910d46be96e57b62Http参数8bb7487ae6a16a43571bc14c7fcf93c2 private void SetPostData(HttpItem item) { //验证在得到结果时是否有传入数据 if (request.Method.Trim().ToLower().Contains("post")) { if (item.PostEncoding != null) { postencoding = item.PostEncoding; } byte[] buffer = null; //写入Byte类型 if (item.PostDataType == PostDataType.Byte && item.PostdataByte != null && item.PostdataByte.Length > 0) { //验证在得到结果时是否有传入数据 buffer = item.PostdataByte; }//写入文件 else if (item.PostDataType == PostDataType.FilePath && !string.IsNullOrWhiteSpace(item.Postdata)) { StreamReader r = new StreamReader(item.Postdata, postencoding); buffer = postencoding.GetBytes(r.ReadToEnd()); r.Close(); } //写入字符串 else if (!string.IsNullOrWhiteSpace(item.Postdata)) { buffer = postencoding.GetBytes(item.Postdata); } if (buffer != null) { request.ContentLength = buffer.Length; request.GetRequestStream().Write(buffer, 0, buffer.Length); } } } /// 631fb227578dfffda61e1fa4d04b7d25 /// 设置代理 /// 039f3e95db2a684c7b74365531eb6044 /// 05e71af9e0b602a2910d46be96e57b62参数对象8bb7487ae6a16a43571bc14c7fcf93c2 private void SetProxy(HttpItem item) { bool isIeProxy = item.ProxyIp.ToLower().Contains("ieproxy"); if (!string.IsNullOrWhiteSpace(item.ProxyIp) && !isIeProxy) { //设置代理服务器 if (item.ProxyIp.Contains(":")) { string[] plist = item.ProxyIp.Split(':'); WebProxy myProxy = new WebProxy(plist[0].Trim(), Convert.ToInt32(plist[1].Trim())); //建议连接 myProxy.Credentials = new NetworkCredential(item.ProxyUserName, item.ProxyPwd); //给当前请求对象 request.Proxy = myProxy; } else { WebProxy myProxy = new WebProxy(item.ProxyIp, false); //建议连接 myProxy.Credentials = new NetworkCredential(item.ProxyUserName, item.ProxyPwd); //给当前请求对象 request.Proxy = myProxy; } } else if (isIeProxy) { //设置为IE代理 } else { request.Proxy = item.WebProxy; } } /// 631fb227578dfffda61e1fa4d04b7d25 /// 回调验证证书问题 /// 039f3e95db2a684c7b74365531eb6044 /// 1543637098b9d407caada70f4ed744fa流对象8bb7487ae6a16a43571bc14c7fcf93c2 /// e9c7a6fbabc4ab0df639f98995e9992e证书8bb7487ae6a16a43571bc14c7fcf93c2 /// 87b7c0bc5f80db1d4eee4a0b94eb8f8bX509Chain8bb7487ae6a16a43571bc14c7fcf93c2 /// b390182cf95cb554ca2d590591afa8cbSslPolicyErrors8bb7487ae6a16a43571bc14c7fcf93c2 /// 2363942ed0d6cd3e85bae1dffa568116boolf7735d9f6a7af371769ab5c16d23b2f3 public bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) { return true; } #endregion } /// 631fb227578dfffda61e1fa4d04b7d25 /// Http请求参考类 /// 039f3e95db2a684c7b74365531eb6044 public class HttpItem { /// 631fb227578dfffda61e1fa4d04b7d25 /// 请求URL必须填写 /// 039f3e95db2a684c7b74365531eb6044 public string URL { get; set; } string _Method = "GET"; /// 631fb227578dfffda61e1fa4d04b7d25 /// 请求方式默认为GET方式,当为POST方式时必须设置Postdata的值 /// 039f3e95db2a684c7b74365531eb6044 public string Method { get { return _Method; } set { _Method = value; } } int _Timeout = 100000; /// 631fb227578dfffda61e1fa4d04b7d25 /// 默认请求超时时间 /// 039f3e95db2a684c7b74365531eb6044 public int Timeout { get { return _Timeout; } set { _Timeout = value; } } int _ReadWriteTimeout = 30000; /// 631fb227578dfffda61e1fa4d04b7d25 /// 默认写入Post数据超时间 /// 039f3e95db2a684c7b74365531eb6044 public int ReadWriteTimeout { get { return _ReadWriteTimeout; } set { _ReadWriteTimeout = value; } } /// 631fb227578dfffda61e1fa4d04b7d25 /// 设置Host的标头信息 /// 039f3e95db2a684c7b74365531eb6044 public string Host { get; set; } Boolean _KeepAlive = true; /// 631fb227578dfffda61e1fa4d04b7d25 /// 获取或设置一个值,该值指示是否与 Internet 资源建立持久性连接默认为true。 /// 039f3e95db2a684c7b74365531eb6044 public Boolean KeepAlive { get { return _KeepAlive; } set { _KeepAlive = value; } } string _Accept = "text/html, application/xhtml+xml, */*"; /// 631fb227578dfffda61e1fa4d04b7d25 /// 请求标头值 默认为text/html, application/xhtml+xml, */* /// 039f3e95db2a684c7b74365531eb6044 public string Accept { get { return _Accept; } set { _Accept = value; } } string _ContentType = "text/html"; /// 631fb227578dfffda61e1fa4d04b7d25 /// 请求返回类型默认 text/html /// 039f3e95db2a684c7b74365531eb6044 public string ContentType { get { return _ContentType; } set { _ContentType = value; } } string _UserAgent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"; /// 631fb227578dfffda61e1fa4d04b7d25 /// 客户端访问信息默认Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0) /// 039f3e95db2a684c7b74365531eb6044 public string UserAgent { get { return _UserAgent; } set { _UserAgent = value; } } /// 631fb227578dfffda61e1fa4d04b7d25 /// 返回数据编码默认为NUll,可以自动识别,一般为utf-8,gbk,gb2312 /// 039f3e95db2a684c7b74365531eb6044 public Encoding Encoding { get; set; } private PostDataType _PostDataType = PostDataType.String; /// 631fb227578dfffda61e1fa4d04b7d25 /// Post的数据类型 /// 039f3e95db2a684c7b74365531eb6044 public PostDataType PostDataType { get { return _PostDataType; } set { _PostDataType = value; } } /// 631fb227578dfffda61e1fa4d04b7d25 /// Post请求时要发送的字符串Post数据 /// 039f3e95db2a684c7b74365531eb6044 public string Postdata { get; set; } /// 631fb227578dfffda61e1fa4d04b7d25 /// Post请求时要发送的Byte类型的Post数据 /// 039f3e95db2a684c7b74365531eb6044 public byte[] PostdataByte { get; set; } /// 631fb227578dfffda61e1fa4d04b7d25 /// Cookie对象集合 /// 039f3e95db2a684c7b74365531eb6044 public CookieCollection CookieCollection { get; set; } /// 631fb227578dfffda61e1fa4d04b7d25 /// 请求时的Cookie /// 039f3e95db2a684c7b74365531eb6044 public string Cookie { get; set; } /// 631fb227578dfffda61e1fa4d04b7d25 /// 来源地址,上次访问地址 /// 039f3e95db2a684c7b74365531eb6044 public string Referer { get; set; } /// 631fb227578dfffda61e1fa4d04b7d25 /// 证书绝对路径 /// 039f3e95db2a684c7b74365531eb6044 public string CerPath { get; set; } /// 631fb227578dfffda61e1fa4d04b7d25 /// 设置代理对象,不想使用IE默认配置就设置为Null,而且不要设置ProxyIp /// 039f3e95db2a684c7b74365531eb6044 public WebProxy WebProxy { get; set; } private Boolean isToLower = false; /// 631fb227578dfffda61e1fa4d04b7d25 /// 是否设置为全文小写,默认为不转化 /// 039f3e95db2a684c7b74365531eb6044 public Boolean IsToLower { get { return isToLower; } set { isToLower = value; } } private Boolean allowautoredirect = false; /// 631fb227578dfffda61e1fa4d04b7d25 /// 支持跳转页面,查询结果将是跳转后的页面,默认是不跳转 /// 039f3e95db2a684c7b74365531eb6044 public Boolean Allowautoredirect { get { return allowautoredirect; } set { allowautoredirect = value; } } private int connectionlimit = 1024; /// 631fb227578dfffda61e1fa4d04b7d25 /// 最大连接数 /// 039f3e95db2a684c7b74365531eb6044 public int Connectionlimit { get { return connectionlimit; } set { connectionlimit = value; } } /// 631fb227578dfffda61e1fa4d04b7d25 /// 代理Proxy 服务器用户名 /// 039f3e95db2a684c7b74365531eb6044 public string ProxyUserName { get; set; } /// 631fb227578dfffda61e1fa4d04b7d25 /// 代理 服务器密码 /// 039f3e95db2a684c7b74365531eb6044 public string ProxyPwd { get; set; } /// 631fb227578dfffda61e1fa4d04b7d25 /// 代理 服务IP,如果要使用IE代理就设置为ieproxy /// 039f3e95db2a684c7b74365531eb6044 public string ProxyIp { get; set; } private ResultType resulttype = ResultType.String; /// 631fb227578dfffda61e1fa4d04b7d25 /// 设置返回类型String和Byte /// 039f3e95db2a684c7b74365531eb6044 public ResultType ResultType { get { return resulttype; } set { resulttype = value; } } private WebHeaderCollection header = new WebHeaderCollection(); /// 631fb227578dfffda61e1fa4d04b7d25 /// header对象 /// 039f3e95db2a684c7b74365531eb6044 public WebHeaderCollection Header { get { return header; } set { header = value; } } /// 631fb227578dfffda61e1fa4d04b7d25 // 获取或设置用于请求的 HTTP 版本。返回结果:用于请求的 HTTP 版本。默认为 System.Net.HttpVersion.Version11。 /// 039f3e95db2a684c7b74365531eb6044 public Version ProtocolVersion { get; set; } private Boolean _expect100continue = true; /// 631fb227578dfffda61e1fa4d04b7d25 /// 获取或设置一个 System.Boolean 值,该值确定是否使用 100-Continue 行为。如果 POST 请求需要 100-Continue 响应,则为 true;否则为 false。默认值为 true。 /// 039f3e95db2a684c7b74365531eb6044 public Boolean Expect100Continue { get { return _expect100continue; } set { _expect100continue = value; } } /// 631fb227578dfffda61e1fa4d04b7d25 /// 设置509证书集合 /// 039f3e95db2a684c7b74365531eb6044 public X509CertificateCollection ClentCertificates { get; set; } /// 631fb227578dfffda61e1fa4d04b7d25 /// 设置或获取Post参数编码,默认的为Default编码 /// 039f3e95db2a684c7b74365531eb6044 public Encoding PostEncoding { get; set; } private ResultCookieType _ResultCookieType = ResultCookieType.String; /// 631fb227578dfffda61e1fa4d04b7d25 /// Cookie返回类型,默认的是只返回字符串类型 /// 039f3e95db2a684c7b74365531eb6044 public ResultCookieType ResultCookieType { get { return _ResultCookieType; } set { _ResultCookieType = value; } } private ICredentials _ICredentials = CredentialCache.DefaultCredentials; /// 631fb227578dfffda61e1fa4d04b7d25 /// 获取或设置请求的身份验证信息。 /// 039f3e95db2a684c7b74365531eb6044 public ICredentials ICredentials { get { return _ICredentials; } set { _ICredentials = value; } } } /// 631fb227578dfffda61e1fa4d04b7d25 /// Http返回参数类 /// 039f3e95db2a684c7b74365531eb6044 public class HttpResult { /// 631fb227578dfffda61e1fa4d04b7d25 /// Http请求返回的Cookie /// 039f3e95db2a684c7b74365531eb6044 public string Cookie { get; set; } /// 631fb227578dfffda61e1fa4d04b7d25 /// Cookie对象集合 /// 039f3e95db2a684c7b74365531eb6044 public CookieCollection CookieCollection { get; set; } /// 631fb227578dfffda61e1fa4d04b7d25 /// 返回的String类型数据 只有ResultType.String时才返回数据,其它情况为空 /// 039f3e95db2a684c7b74365531eb6044 public string Html { get; set; } /// 631fb227578dfffda61e1fa4d04b7d25 /// 返回的Byte数组 只有ResultType.Byte时才返回数据,其它情况为空 /// 039f3e95db2a684c7b74365531eb6044 public byte[] ResultByte { get; set; } /// 631fb227578dfffda61e1fa4d04b7d25 /// header对象 /// 039f3e95db2a684c7b74365531eb6044 public WebHeaderCollection Header { get; set; } /// 631fb227578dfffda61e1fa4d04b7d25 /// 返回状态说明 /// 039f3e95db2a684c7b74365531eb6044 public string StatusDescription { get; set; } /// 631fb227578dfffda61e1fa4d04b7d25 /// 返回状态码,默认为OK /// 039f3e95db2a684c7b74365531eb6044 public HttpStatusCode StatusCode { get; set; } } /// 631fb227578dfffda61e1fa4d04b7d25 /// 返回类型 /// 039f3e95db2a684c7b74365531eb6044 public enum ResultType { /// 631fb227578dfffda61e1fa4d04b7d25 /// 表示只返回字符串 只有Html有数据 /// 039f3e95db2a684c7b74365531eb6044 String, /// 631fb227578dfffda61e1fa4d04b7d25 /// 表示返回字符串和字节流 ResultByte和Html都有数据返回 /// 039f3e95db2a684c7b74365531eb6044 Byte } /// 631fb227578dfffda61e1fa4d04b7d25 /// Post的数据格式默认为string /// 039f3e95db2a684c7b74365531eb6044 public enum PostDataType { /// 631fb227578dfffda61e1fa4d04b7d25 /// 字符串类型,这时编码Encoding可不设置 /// 039f3e95db2a684c7b74365531eb6044 String, /// 631fb227578dfffda61e1fa4d04b7d25 /// Byte类型,需要设置PostdataByte参数的值编码Encoding可设置为空 /// 039f3e95db2a684c7b74365531eb6044 Byte, /// 631fb227578dfffda61e1fa4d04b7d25 /// 传文件,Postdata必须设置为文件的绝对路径,必须设置Encoding的值 /// 039f3e95db2a684c7b74365531eb6044 FilePath } /// 631fb227578dfffda61e1fa4d04b7d25 /// Cookie返回类型 /// 039f3e95db2a684c7b74365531eb6044 public enum ResultCookieType { /// 631fb227578dfffda61e1fa4d04b7d25 /// 只返回字符串类型的Cookie /// 039f3e95db2a684c7b74365531eb6044 String, /// 631fb227578dfffda61e1fa4d04b7d25 /// CookieCollection格式的Cookie集合同时也返回String类型的cookie /// 039f3e95db2a684c7b74365531eb6044 CookieCollection } /// 631fb227578dfffda61e1fa4d04b7d25HttpHelper的2次封装函数 作者: /// 039f3e95db2a684c7b74365531eb6044 public class MyHttpHelper { #region 公共函数 /// 631fb227578dfffda61e1fa4d04b7d25返回 HTML 字符串的编码结果039f3e95db2a684c7b74365531eb6044 /// afb41405c7ad14d83dafa7bbddb7f63d字符串8bb7487ae6a16a43571bc14c7fcf93c2 /// 2363942ed0d6cd3e85bae1dffa568116编码结果f7735d9f6a7af371769ab5c16d23b2f3 public static string HtmlEncode(string str) { if (string.IsNullOrEmpty(str)) { return ""; } return str.Length > 0 ? HttpUtility.HtmlEncode(str) : ""; } /// 631fb227578dfffda61e1fa4d04b7d25返回 HTML 字符串的解码结果039f3e95db2a684c7b74365531eb6044 /// afb41405c7ad14d83dafa7bbddb7f63d字符串8bb7487ae6a16a43571bc14c7fcf93c2 /// 2363942ed0d6cd3e85bae1dffa568116解码结果f7735d9f6a7af371769ab5c16d23b2f3 public static string HtmlDecode(string str) { if (string.IsNullOrEmpty(str)) { return ""; } return str.Length > 0 ? HttpUtility.HtmlDecode(str) : ""; } /// 631fb227578dfffda61e1fa4d04b7d25 /// 根据指定的编码对RUl进行解码 /// 039f3e95db2a684c7b74365531eb6044 /// afb41405c7ad14d83dafa7bbddb7f63d要解码的字符串8bb7487ae6a16a43571bc14c7fcf93c2 /// ef080b8f96d6b1bf28e6abae73047b3e要进行解码的编码方式8bb7487ae6a16a43571bc14c7fcf93c2 /// 2363942ed0d6cd3e85bae1dffa568116f7735d9f6a7af371769ab5c16d23b2f3 public static string UrlDecode(string str, Encoding encoding = null) { if (string.IsNullOrEmpty(str)) { return ""; } if (str.Length == 0) { return ""; } if (encoding == null) { return HttpUtility.UrlDecode(str); } else { return HttpUtility.UrlDecode(str, encoding); } } /// 631fb227578dfffda61e1fa4d04b7d25根据指定的编码对URL进行编码039f3e95db2a684c7b74365531eb6044 /// afb41405c7ad14d83dafa7bbddb7f63d要编码的URL8bb7487ae6a16a43571bc14c7fcf93c2 /// ef080b8f96d6b1bf28e6abae73047b3e要进行编码的编码方式8bb7487ae6a16a43571bc14c7fcf93c2 /// 2363942ed0d6cd3e85bae1dffa568116f7735d9f6a7af371769ab5c16d23b2f3 public static string UrlEncode(string str, Encoding encoding = null) { if (string.IsNullOrEmpty(str)) { return ""; } if (str.Length == 0) { return ""; } if (encoding == null) { return HttpUtility.UrlEncode(str); } else { return HttpUtility.UrlEncode(str, encoding); } } /// 631fb227578dfffda61e1fa4d04b7d25 /// 根据 charSet 返回 Encoding /// 039f3e95db2a684c7b74365531eb6044 /// e90987d9088447f21632e70dc5261059"gb2312" or "utf-8",默认: "" == "utf-8"8bb7487ae6a16a43571bc14c7fcf93c2 /// 2363942ed0d6cd3e85bae1dffa568116f7735d9f6a7af371769ab5c16d23b2f3 public static Encoding GetEncoding(string charSet) { Encoding en = Encoding.Default; if (charSet == "gb2312") { en = Encoding.GetEncoding("gb2312"); } else if (charSet == "utf-8") { en = Encoding.UTF8; } return en; } #endregion #region Post /// 631fb227578dfffda61e1fa4d04b7d25HTTP Get方式请求数据039f3e95db2a684c7b74365531eb6044 /// 0ab5e68b8f5d292e9a5f810a0a5b2929URL8bb7487ae6a16a43571bc14c7fcf93c2 /// 7531765eb83dfc8ac7e7b1c75b5063d2user=123123 & pwd=1231313"8bb7487ae6a16a43571bc14c7fcf93c2 /// e90987d9088447f21632e70dc5261059"gb2312" or "utf-8",默认: "" == "utf-8"8bb7487ae6a16a43571bc14c7fcf93c2 /// 2363942ed0d6cd3e85bae1dffa568116f7735d9f6a7af371769ab5c16d23b2f3 public static string HttpPost(string url, string param, string charSet = "utf-8") { HttpHelpers http = new HttpHelpers(); HttpItem item = new HttpItem() { URL = url, Encoding = GetEncoding(charSet),//编码格式(utf-8,gb2312,gbk) 可选项 默认类会自动识别 Method = "post",//URL 可选项 默认为Get Postdata = param }; //得到HTML代码 HttpResult result = http.GetHtml(item); //取出返回的Cookie //string cookie = result.Cookie; //返回的Html内容 string html = result.Html; if (result.StatusCode == System.Net.HttpStatusCode.OK) { return html; } //string statusCodeDescription = result.StatusDescription; return ""; } #endregion #region Get /// 631fb227578dfffda61e1fa4d04b7d25HTTP Get方式请求数据039f3e95db2a684c7b74365531eb6044 /// 0ab5e68b8f5d292e9a5f810a0a5b2929URL8bb7487ae6a16a43571bc14c7fcf93c2 /// e90987d9088447f21632e70dc5261059"gb2312" or "utf-8",默认: "" == "utf-8"8bb7487ae6a16a43571bc14c7fcf93c2 /// 2363942ed0d6cd3e85bae1dffa568116f7735d9f6a7af371769ab5c16d23b2f3 public static string HttpGet(string url, string charSet = "utf-8") { HttpHelpers http = new HttpHelpers(); HttpItem item = new HttpItem() { URL = url, Encoding = GetEncoding(charSet), Method = "get" }; //得到HTML代码 HttpResult result = http.GetHtml(item); //取出返回的Cookie //string cookie = result.Cookie; //返回的Html内容 string html = result.Html; if (result.StatusCode == System.Net.HttpStatusCode.OK) { return html; } //string statusCodeDescription = result.StatusDescription; return ""; } /// 631fb227578dfffda61e1fa4d04b7d25POST客服消息/summary> /// 0ab5e68b8f5d292e9a5f810a0a5b2929URL8bb7487ae6a16a43571bc14c7fcf93c2 /// 6f8056bc71f11d4440ce6d7baf9b1b39内容8bb7487ae6a16a43571bc14c7fcf93c2 /// 2363942ed0d6cd3e85bae1dffa568116消息状态f7735d9f6a7af371769ab5c16d23b2f3 public static string GetPage(string posturl, string postData) { Stream outstream = null; Stream instream = null; StreamReader sr = null; HttpWebResponse response = null; HttpWebRequest request = null; Encoding encoding = Encoding.UTF8; byte[] data = encoding.GetBytes(postData); // 准备请求... try { // 设置参数 request = WebRequest.Create(posturl) as HttpWebRequest; CookieContainer cookieContainer = new CookieContainer(); request.CookieContainer = cookieContainer; request.AllowAutoRedirect = true; request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = data.Length; outstream = request.GetRequestStream(); outstream.Write(data, 0, data.Length); outstream.Close(); //发送请求并获取相应回应数据 response = request.GetResponse() as HttpWebResponse; //直到request.GetResponse()程序才开始向目标网页发送Post请求 instream = response.GetResponseStream(); sr = new StreamReader(instream, encoding); //返回结果网页(html)代码 string content = sr.ReadToEnd(); string err = string.Empty; return content; } catch (Exception ex) { string err = ex.Message; return err; } } #endregion }
##View Code
封裝的JsonHelpers類別如下
#region 通用 /// 631fb227578dfffda61e1fa4d04b7d25检查字符串是否json格式039f3e95db2a684c7b74365531eb6044 /// dbd0958913b860a4a8afa7345b0262d98bb7487ae6a16a43571bc14c7fcf93c2 /// 2363942ed0d6cd3e85bae1dffa568116f7735d9f6a7af371769ab5c16d23b2f3 public static bool IsJson(string jText) { if (string.IsNullOrEmpty(jText) || jText.Length < 3) { return false; } if (jText.Substring(0, 2) == "{\"" || jText.Substring(0, 3) == "[{\"") { return true; } return false; } /// 631fb227578dfffda61e1fa4d04b7d25检查字符串是否json格式数组039f3e95db2a684c7b74365531eb6044 /// dbd0958913b860a4a8afa7345b0262d98bb7487ae6a16a43571bc14c7fcf93c2 /// 2363942ed0d6cd3e85bae1dffa568116f7735d9f6a7af371769ab5c16d23b2f3 public static bool IsJsonRs(string jText) { if (string.IsNullOrEmpty(jText) || jText.Length < 3) { return false; } if (jText.Substring(0, 3) == "[{\"") { return true; } return false; } /// 631fb227578dfffda61e1fa4d04b7d25格式化 json039f3e95db2a684c7b74365531eb6044 /// dbd0958913b860a4a8afa7345b0262d98bb7487ae6a16a43571bc14c7fcf93c2 /// 2363942ed0d6cd3e85bae1dffa568116f7735d9f6a7af371769ab5c16d23b2f3 public static string Fmt_Null(string jText) { return StringHelper.ReplaceString(jText, ":null,", ":\"\",", true); } /// 631fb227578dfffda61e1fa4d04b7d25格式化 json ,删除左右二边的[]039f3e95db2a684c7b74365531eb6044 /// dbd0958913b860a4a8afa7345b0262d98bb7487ae6a16a43571bc14c7fcf93c2 /// 2363942ed0d6cd3e85bae1dffa568116f7735d9f6a7af371769ab5c16d23b2f3 public static string Fmt_Rs(string jText) { jText = jText.Trim(); jText = jText.Trim('['); jText = jText.Trim(']'); return jText; } #endregion #region Json序列化 /// 631fb227578dfffda61e1fa4d04b7d25序列化039f3e95db2a684c7b74365531eb6044 /// 9eeacba56bab5a25cf1fbc370b62c92fobject 8bb7487ae6a16a43571bc14c7fcf93c2 /// 2363942ed0d6cd3e85bae1dffa568116f7735d9f6a7af371769ab5c16d23b2f3 public static string ToJson(object obj) { var idtc = new Newtonsoft.Json.Converters.IsoDateTimeConverter { DateTimeFormat = "yyyy-MM-dd hh:mm:ss" }; return JsonConvert.SerializeObject(obj, idtc); } /// 631fb227578dfffda61e1fa4d04b7d25序列化--sql039f3e95db2a684c7b74365531eb6044 /// b35bf2334f45239da9b4babfd5238c27DataTable8bb7487ae6a16a43571bc14c7fcf93c2 /// 2363942ed0d6cd3e85bae1dffa568116f7735d9f6a7af371769ab5c16d23b2f3 public static string ToJson_FromSQL(DataTable dt) { string ss = ToJson(dt); dt.Dispose(); return ss; } #endregion #region Json反序列化 /// 631fb227578dfffda61e1fa4d04b7d25反序列化039f3e95db2a684c7b74365531eb6044 /// dbd0958913b860a4a8afa7345b0262d98bb7487ae6a16a43571bc14c7fcf93c2 /// 2363942ed0d6cd3e85bae1dffa568116f7735d9f6a7af371769ab5c16d23b2f3 public static DataTable ToDataTable(string jText) { if (string.IsNullOrEmpty(jText)) { return null; } else { try { return JsonConvert.DeserializeObjectb9be6be499e4aef49099cdb77f79b721(jText); } catch { return null; } } } /// 631fb227578dfffda61e1fa4d04b7d25反序列化039f3e95db2a684c7b74365531eb6044 /// d65706098b2250eee2f48a758c9680c8类型8ed7e392d75469626ca6a252f320a704 /// dbd0958913b860a4a8afa7345b0262d9json字符串8bb7487ae6a16a43571bc14c7fcf93c2 /// 2363942ed0d6cd3e85bae1dffa568116类型数据f7735d9f6a7af371769ab5c16d23b2f3 public static T ToObject8742468051c85b06f0a0af9e3e506b5c(string jText) { return (T)JsonConvert.DeserializeObject(jText, typeof(T)); } #endregion################################## #####View Code############其中,如果是VS2015以下的,可以將url字串改成string.format("")方式######### ####呼叫取值的方式##################效果顯示#######點擊公眾號連結效果如下:######### ####### #########更多微信公眾號開發網頁授權取得使用者基本資訊 相關文章請關注PHP中文網! ###