微信公众号中网页授权的两种方式
這篇文章給大家分享的是有關微信公眾號中網頁授權的兩種方式的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
如果用戶在微信客戶端中訪問第三方網頁,公眾號可以通過微信網頁授權機制,來獲取用戶基本信息,進而實現業務邏輯。
注意:網頁授權兩種方式
更多網頁授權請查閱官網文檔:網頁授權
靜默授權
靜默授權即可以在用戶關注的的時候,獲取用戶基本信息,此過程用戶無感知。
第一步,通過工廠類 轉發請求
///<returns></returns>
publicstringHandleRequest()
{
stringresponse=string.Empty;
EventMessageem=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;
}
}
returnresponse;
}
第二步,寫用戶關注事件
WeChat.Messages.TextMessagetm==em.FromUserName; tm.FromUserName=em.ToUserName; tm.CreateTime==
returntm.GenerateContent(); }
第三步,根據得到的OpenId及accesstoken,即可獲取用戶基本信息(此處演示是將該用戶存入數據庫中)
///<summary>
///根據OpenId將此條粉絲記錄插入數據庫中
///</summary>
///<paramname="FromUserName"></param>
///<paramname="ToUserName"></param>
publicvoidShowUserInfo(stringFromUserName,stringToUserName)
{
try
{
Models.Usersuser=newModels.Users();
DAL.UseruserInfo=newDAL.User();
//獲取accesstoken,獲取用戶基本信息需要Openid和accesstoken即可
accesstoken=Utility.Context.AccessToken;
stringurl=string.Format("https://api.weixin.qq.com/cgi-bin/user/info?access_token={0}&openid={1}&lang=zh_CN",accesstoken,FromUserName);
stringresult=HttpUtility.GetData(url);
XDocumentdoc=XmlUtility.ParseJson(result,"root");
XElementroot=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;
DateTimecreate_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實體存入數據庫中
boolshow=_user.Add(user);
#endregion
}
}
catch
{
throw(newArgumentNullException());
}
}
上面代碼中 AccessToken的實現,新建一個Context類即可
privatestaticDateTimeGetAccessToken_Time;
///<summary>
///過期時間為7200秒
///</summary>
privatestaticintExpires_Period=7200;
///<summary>
///
///</summary>
privatestaticstringmAccessToken;
publicstaticstringAppID="換成相應公眾號的即可";
publicstaticstringAppSecret="換成相應公眾號的即可";
///<summary>
///調用獲取ACCESS_TOKEN,包含判斷是否過期
///</summary>
publicstaticstringAccessToken
{
get
{
//如果為空,或者過期,需要重新獲取
if(string.IsNullOrEmpty(mAccessToken)||HasExpired())
{
//獲取access_token
mAccessToken=GetAccessToken(AppID,AppSecret);
}
returnmAccessToken;
}
}
///<summary>
///獲取ACCESS_TOKEN方法
///</summary>
///<paramname="appId"></param>
///<paramname="appSecret"></param>
///<returns></returns>
privatestaticstringGetAccessToken(stringappId,stringappSecret)
{
stringurl=string.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}",appId,appSecret);
stringresult=HttpUtility.GetData(url);
XDocumentdoc=XmlUtility.ParseJson(result,"root");
XElementroot=doc.Root;
if(root!=null)
{
XElementaccess_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);
}
returnaccess_token.Value;
}
else
{
GetAccessToken_Time=DateTime.MinValue;
}
}
returnnull;
}
///<summary>
///判斷Access_token是否過期
///</summary>
///<returns>bool</returns>
privatestaticboolHasExpired()
{
if(GetAccessToken_Time!=null)
{
//過期時間,允許有一定的誤差,一分鐘。獲取時間消耗
if(DateTime.Now>GetAccessToken_Time.AddSeconds(Expires_Period).AddSeconds(-60))
{
returntrue;
}
}
returnfalse;
}
GetData的實現
publicstaticstringGetData(stringurl)
{returnSendGetHttpRequest(url,"application/x-www-form-urlencoded");
}
ParseJson的實現
publicstaticXDocumentParseJson(stringjson,stringrootName)
{returnJsonConvert.DeserializeXNode(json,rootName);
}
關于第三步的 HttpUtility類中還有一些其他公用幫助方法,在這里一并放出,調用即可
///<summary>
///發送請求///</summary>
///<paramname="url">Url地址</param>
///<paramname="data">數據</param>
publicstaticstringSendHttpRequest(stringurl,stringdata)
{returnSendPostHttpRequest(url,"application/x-www-form-urlencoded",data);
}///<summary>
///
///</summary>
///<paramname="url"></param>
///<returns></returns>
publicstaticstringGetData(stringurl)
{returnSendGetHttpRequest(url,"application/x-www-form-urlencoded");
}///<summary>
///發送請求///</summary>
///<paramname="url">Url地址</param>
///<paramname="method">方法(post或get)</param>
///<paramname="method">數據類型</param>
///<paramname="requestData">數據</param>
publicstaticstringSendPostHttpRequest(stringurl,stringcontentType,stringrequestData)
{
WebRequestrequest=(WebRequest)HttpWebRequest.Create(url);
request.Method="POST";byte[]postBytes=null;
request.ContentType=contentType;
postBytes=Encoding.UTF8.GetBytes(requestData);
request.ContentLength=postBytes.Length;using(Streamoutstream=request.GetRequestStream())
{
outstream.Write(postBytes,0,postBytes.Length);
}stringresult=string.Empty;using(WebResponseresponse=request.GetResponse())
{if(response!=null)
{using(Streamstream=response.GetResponseStream())
{using(StreamReaderreader=newStreamReader(stream,Encoding.UTF8))
{
result=reader.ReadToEnd();
}
}
}
}returnresult;
}///<summary>
///發送請求///</summary>
///<paramname="url">Url地址</param>
///<paramname="method">方法(post或get)</param>
///<paramname="method">數據類型</param>
///<paramname="requestData">數據</param>
publicstaticstringSendGetHttpRequest(stringurl,stringcontentType)
{
WebRequestrequest=(WebRequest)HttpWebRequest.Create(url);
request.Method="GET";
request.ContentType=contentType;stringresult=string.Empty;using(WebResponseresponse=request.GetResponse())
{if(response!=null)
{using(Streamstream=response.GetResponseStream())
{using(StreamReaderreader=newStreamReader(stream,Encoding.UTF8))
{
result=reader.ReadToEnd();
}
}
}
}returnresult;
}
View Code
順便提下上文中用到的User類如下
publicclassUsers
{///<summary>
///全局憑證唯一Id///</summary>
publicstringOpenID{get;set;}///<summary>
///公眾號Id///</summary>
publicstringPublicId{get;set;}///<summary>
///用戶Id///</summary>
publicstringUserID{get;set;}///<summary>
///昵稱///</summary>
publicstringNickName{get;set;}///<summary>
///性別1是男0是女///</summary>
publicintSex{get;set;}///<summary>
///是否關注1是關注
///</summary>
publicintSubscribe{get;set;}///<summary>
///國家///</summary>
publicstringCountry{get;set;}///<summary>
///地區///</summary>
publicstringProvince{get;set;}///<summary>
///城市///</summary>
publicstringCity{get;set;}///<summary>
///關注時間///</summary>
publicDateTimeCreateDate{get;set;}///<summary>
///用戶頭像///</summary>
publicstringHeadimgUrl{get;set;}///<summary>
///第三方平臺Id,可為空///</summary>
publicstringUnionID{get;set;}///<summary>
///用戶取消關注時間///</summary>
publicDateTimeUn_Subscribe_Time{get;set;}
}
演示效果
數據庫中此時是存在10條數據的,當點擊關注此公眾號的時候,就將此用戶的基本信息存入數據庫了,數據庫刷新后變成11條數據
網頁授權流程
具體介紹依然可參考官網文檔:網頁授權
第一步,判斷該用戶是否獲取授權,若沒有授權,則跳轉至授權頁面,若授權,則獲取基本信息
核心代碼
///<summary>
///獲取授權用戶的基本信息,包括頭像,姓名,等等(推薦方法)///</summary>
///<paramname="accessToken">用戶授權之后的accessToken</param>
///<paramname="openid">用戶授權之后的openid</param>
///<returns></returns>
publicstaticShouQuanWeiXinUserInfoGetShouQuanMessage()
{//先判斷是否有獲取到用戶授權的Code,HttpContext.Current.Session["ShouquanCode"]
if(HttpContext.Current.Session["ShouquanCode"]==null||HttpContext.Current.Session["ShouquanCode"].ToString()=="")
{
HttpContext.Current.Session["ShouquanCode"]="123";//用戶授權的CodeGetShouQuanCodeUrl(HttpContext.Current.Request.Url.AbsoluteUri);
}elseif(HttpContext.Current.Request.QueryString["code"]==null||HttpContext.Current.Request.QueryString["code"]=="")
{//用戶授權的CodeGetShouQuanCodeUrl(HttpContext.Current.Request.Url.AbsoluteUri);
}else
{varmodel=ShouQuanAccessToken(HttpContext.Current.Request.QueryString["code"]);varurl=
$"http://www.php.cn/{model.access_token}&openid={model.openid}&lang=zh_CN";stringgethtml=MyHttpHelper.HttpGet(url);varac=JsonHelpers.ToObject<ShouQuanWeiXinUserInfo>(gethtml);returnac;
}returnnull;
}
其中,用戶授權的code方法如下:
///<summary>
///重新獲取用戶授權的Code,可以獲取用戶的基本信息(頭像,姓名,等等)(推薦用的方法)///</summary>
///<paramname="url">目標Url</param>
///<returns></returns>
publicstaticvoidGetShouQuanCodeUrl(stringurl)
{stringCodeUrl="";//加密過的url
stringvalue=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方法
///<summary>
//用戶授權之后,獲取授權的Access_Token與基本的Access_Token是不同的(推薦方法)
///</summary>
///<paramname="code">用戶授權之后的Code</param>
///<returns></returns>
publicstaticOauthAccessTokenShouQuanAccessToken(stringcode)
{varurl=$"http://www.php.cn/{Appid}&secret={Secret}&code={code}&grant_type=authorization_code";stringgethtml=MyHttpHelper.HttpGet(url);
OauthAccessTokenac=newOauthAccessToken();
ac=JsonHelpers.ToObject<OauthAccessToken>(gethtml);returnac;
}
用戶實體
publicclassOauthAccessToken
{publicstringaccess_token{get;set;}publicstringexpires_in{get;set;}publicstringrefresh_token{get;set;}publicstringopenid{get;set;}publicstringscope{get;set;}
}
其中用到的MyHttpHelper公眾類如下
///<summary>
///Http連接操作幫助類///</summary>
publicclassHttpHelpers
{#region預定義方法或者變更//默認的編碼
privateEncodingencoding=Encoding.Default;//Post數據編碼
privateEncodingpostencoding=Encoding.Default;//HttpWebRequest對象用來發起請求
privateHttpWebRequestrequest=null;//獲取影響流的數據對象
privateHttpWebResponseresponse=null;///<summary>
///根據相傳入的數據,得到相應頁面數據///</summary>
///<paramname="item">參數類對象</param>
///<returns>返回HttpResult類型</returns>
publicHttpResultGetHtml(HttpItemitem)
{//返回參數
HttpResultresult=newHttpResult();try
{//準備參數SetRequest(item);
}catch(Exceptionex)
{returnnewHttpResult(){Cookie=string.Empty,Header=null,Html=ex.Message,StatusDescription="配置參數時出錯:"+ex.Message};
}try
{#region得到請求的responseusing(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=newMemoryStream())
{//GZIIP處理
if(response.ContentEncoding!=null&&response.ContentEncoding.Equals("gzip",StringComparison.InvariantCultureIgnoreCase))
{//開始讀取流并設置編碼方式
newGZipStream(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)
{
Matchmeta=Regex.Match(Encoding.Default.GetString(ResponseByte),"<meta([^<]*)charset=([^<]*)[\"']",RegexOptions.IgnoreCase);stringc=(meta.Groups.Count>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;elseencoding=Encoding.GetEncoding(response.CharacterSet);
}
}else
{if(string.IsNullOrEmpty(response.CharacterSet))encoding=Encoding.UTF8;elseencoding=Encoding.GetEncoding(response.CharacterSet);
}
}//得到返回的HTML
result.Html=encoding.GetString(ResponseByte);
}else
{//得到返回的HTML//result.Html="本次請求并未返回任何數據";
result.Html="";
}
}#endregion
}catch(WebExceptionex)
{//這里是在發生異常時返回的錯誤信息
response=(HttpWebResponse)ex.Response;
result.Html=ex.Message;if(response!=null)
{
result.StatusCode=response.StatusCode;
result.StatusDescription=response.StatusDescription;
}
}catch(Exceptionex)
{
result.Html=ex.Message;
}if(item.IsToLower)result.Html=result.Html.ToLower();returnresult;
}///<summary>
///為請求準備參數///</summary>
///<paramname="item">參數列表</param>
privatevoidSetRequest(HttpItemitem)
{//驗證證書SetCer(item);//設置Header參數
if(item.Header!=null&&item.Header.Count>0)foreach(stringkeyinitem.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;//設置CookieSetCookie(item);//來源地址
request.Referer=item.Referer;//是否執行跳轉功能
request.AllowAutoRedirect=item.Allowautoredirect;//設置Post數據SetPostData(item);//設置最大連接
if(item.Connectionlimit>0)request.ServicePoint.ConnectionLimit=item.Connectionlimit;
}///<summary>
///設置證書///</summary>
///<paramname="item"></param>
privatevoidSetCer(HttpItemitem)
{if(!string.IsNullOrWhiteSpace(item.CerPath))
{//這一句一定要寫在創建連接的前面。使用回調的方法進行證書驗證。
ServicePointManager.ServerCertificateValidationCallback=newSystem.Net.Security.RemoteCertificateValidationCallback(CheckValidationResult);//初始化對像,并設置請求的URL地址
request=(HttpWebRequest)WebRequest.Create(item.URL);
SetCerList(item);//將證書添加到請求里
request.ClientCertificates.Add(newX509Certificate(item.CerPath));
}else
{//初始化對像,并設置請求的URL地址
request=(HttpWebRequest)WebRequest.Create(item.URL);
SetCerList(item);
}
}///<summary>
///設置多個證書///</summary>
///<paramname="item"></param>
privatevoidSetCerList(HttpItemitem)
{if(item.ClentCertificates!=null&&item.ClentCertificates.Count>0)
{foreach(X509Certificatecinitem.ClentCertificates)
{
request.ClientCertificates.Add(c);
}
}
}///<summary>
///設置Cookie///</summary>
///<paramname="item">Http參數</param>
privatevoidSetCookie(HttpItemitem)
{if(!string.IsNullOrEmpty(item.Cookie))request.Headers[HttpRequestHeader.Cookie]=item.Cookie;//設置CookieCollection
if(item.ResultCookieType==ResultCookieType.CookieCollection)
{
request.CookieContainer=newCookieContainer();if(item.CookieCollection!=null&&item.CookieCollection.Count>0)
request.CookieContainer.Add(item.CookieCollection);
}
}///<summary>
///設置Post數據///</summary>
///<paramname="item">Http參數</param>
privatevoidSetPostData(HttpItemitem)
{//驗證在得到結果時是否有傳入數據
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;
}//寫入文件
elseif(item.PostDataType==PostDataType.FilePath&&!string.IsNullOrWhiteSpace(item.Postdata))
{
StreamReaderr=newStreamReader(item.Postdata,postencoding);
buffer=postencoding.GetBytes(r.ReadToEnd());
r.Close();
}//寫入字符串
elseif(!string.IsNullOrWhiteSpace(item.Postdata))
{
buffer=postencoding.GetBytes(item.Postdata);
}if(buffer!=null)
{
request.ContentLength=buffer.Length;
request.GetRequestStream().Write(buffer,0,buffer.Length);
}
}
}///<summary>
///設置代理///</summary>
///<paramname="item">參數對象</param>
privatevoidSetProxy(HttpItemitem)
{boolisIeProxy=item.ProxyIp.ToLower().Contains("ieproxy");if(!string.IsNullOrWhiteSpace(item.ProxyIp)&&!isIeProxy)
{//設置代理服務器
if(item.ProxyIp.Contains(":"))
{string[]plist=item.ProxyIp.Split(':');
WebProxymyProxy=newWebProxy(plist[0].Trim(),Convert.ToInt32(plist[1].Trim()));//建議連接
myProxy.Credentials=newNetworkCredential(item.ProxyUserName,item.ProxyPwd);//給當前請求對象
request.Proxy=myProxy;
}else
{
WebProxymyProxy=newWebProxy(item.ProxyIp,false);//建議連接
myProxy.Credentials=newNetworkCredential(item.ProxyUserName,item.ProxyPwd);//給當前請求對象
request.Proxy=myProxy;
}
}elseif(isIeProxy)
{//設置為IE代理}else
{
request.Proxy=item.WebProxy;
}
}///<summary>
///回調驗證證書問題///</summary>
///<paramname="sender">流對象</param>
///<paramname="certificate">證書</param>
///<paramname="chain">X509Chain</param>
///<paramname="errors">SslPolicyErrors</param>
///<returns>bool</returns>
publicboolCheckValidationResult(objectsender,X509Certificatecertificate,X509Chainchain,SslPolicyErrorserrors){returntrue;}#endregion
}///<summary>
///Http請求參考類///</summary>
publicclassHttpItem
{///<summary>
///請求URL必須填寫///</summary>
publicstringURL{get;set;}string_Method="GET";///<summary>
///請求方式默認為GET方式,當為POST方式時必須設置Postdata的值///</summary>
publicstringMethod
{get{return_Method;}set{_Method=value;}
}int_Timeout=100000;///<summary>
///默認請求超時時間///</summary>
publicintTimeout
{get{return_Timeout;}set{_Timeout=value;}
}int_ReadWriteTimeout=30000;///<summary>
///默認寫入Post數據超時間///</summary>
publicintReadWriteTimeout
{get{return_ReadWriteTimeout;}set{_ReadWriteTimeout=value;}
}///<summary>
///設置Host的標頭信息///</summary>
publicstringHost{get;set;}
Boolean_KeepAlive=true;///<summary>
///獲取或設置一個值,該值指示是否與Internet資源建立持久性連接默認為true。///</summary>
publicBooleanKeepAlive
{get{return_KeepAlive;}set{_KeepAlive=value;}
}string_Accept="text/html,application/xhtml+xml,*/*";///<summary>
///請求標頭值默認為text/html,application/xhtml+xml,*/*///</summary>
publicstringAccept
{get{return_Accept;}set{_Accept=value;}
}string_ContentType="text/html";///<summary>
///請求返回類型默認text/html///</summary>
publicstringContentType
{get{return_ContentType;}set{_ContentType=value;}
}string_UserAgent="Mozilla/5.0(compatible;MSIE9.0;WindowsNT6.1;Trident/5.0)";///<summary>
///客戶端訪問信息默認Mozilla/5.0(compatible;MSIE9.0;WindowsNT6.1;Trident/5.0)///</summary>
publicstringUserAgent
{get{return_UserAgent;}set{_UserAgent=value;}
}///<summary>
///返回數據編碼默認為NUll,可以自動識別,一般為utf-8,gbk,gb2312///</summary>
publicEncodingEncoding{get;set;}privatePostDataType_PostDataType=PostDataType.String;///<summary>
///Post的數據類型///</summary>
publicPostDataTypePostDataType
{get{return_PostDataType;}set{_PostDataType=value;}
}///<summary>
///Post請求時要發送的字符串Post數據///</summary>
publicstringPostdata{get;set;}///<summary>
///Post請求時要發送的Byte類型的Post數據///</summary>
publicbyte[]PostdataByte{get;set;}///<summary>
///Cookie對象集合///</summary>
publicCookieCollectionCookieCollection{get;set;}///<summary>
///請求時的Cookie///</summary>
publicstringCookie{get;set;}///<summary>
///來源地址,上次訪問地址///</summary>
publicstringReferer{get;set;}///<summary>
///證書絕對路徑///</summary>
publicstringCerPath{get;set;}///<summary>
///設置代理對象,不想使用IE默認配置就設置為Null,而且不要設置ProxyIp///</summary>
publicWebProxyWebProxy{get;set;}privateBooleanisToLower=false;///<summary>
///是否設置為全文小寫,默認為不轉化///</summary>
publicBooleanIsToLower
{get{returnisToLower;}set{isToLower=value;}
}privateBooleanallowautoredirect=false;///<summary>
///支持跳轉頁面,查詢結果將是跳轉后的頁面,默認是不跳轉///</summary>
publicBooleanAllowautoredirect
{get{returnallowautoredirect;}set{allowautoredirect=value;}
}privateintconnectionlimit=1024;///<summary>
///最大連接數///</summary>
publicintConnectionlimit
{get{returnconnectionlimit;}set{connectionlimit=value;}
}///<summary>
///代理Proxy服務器用戶名///</summary>
publicstringProxyUserName{get;set;}///<summary>
///代理服務器密碼///</summary>
publicstringProxyPwd{get;set;}///<summary>
///代理服務IP,如果要使用IE代理就設置為ieproxy///</summary>
publicstringProxyIp{get;set;}privateResultTyperesulttype=ResultType.String;///<summary>
///設置返回類型String和Byte///</summary>
publicResultTypeResultType
{get{returnresulttype;}set{resulttype=value;}
}privateWebHeaderCollectionheader=newWebHeaderCollection();///<summary>
///header對象///</summary>
publicWebHeaderCollectionHeader
{get{returnheader;}set{header=value;}
}///<summary>
//獲取或設置用于請求的HTTP版本。返回結果:用于請求的HTTP版本。默認為System.Net.HttpVersion.Version11。
///</summary>
publicVersionProtocolVersion{get;set;}privateBoolean_expect100continue=true;///<summary>
///獲取或設置一個System.Boolean值,該值確定是否使用100-Continue行為。如果POST請求需要100-Continue響應,則為true;否則為false。默認值為true。///</summary>
publicBooleanExpect100Continue
{get{return_expect100continue;}set{_expect100continue=value;}
}///<summary>
///設置509證書集合///</summary>
publicX509CertificateCollectionClentCertificates{get;set;}///<summary>
///設置或獲取Post參數編碼,默認的為Default編碼///</summary>
publicEncodingPostEncoding{get;set;}privateResultCookieType_ResultCookieType=ResultCookieType.String;///<summary>
///Cookie返回類型,默認的是只返回字符串類型///</summary>
publicResultCookieTypeResultCookieType
{get{return_ResultCookieType;}set{_ResultCookieType=value;}
}privateICredentials_ICredentials=CredentialCache.DefaultCredentials;///<summary>
///獲取或設置請求的身份驗證信息。///</summary>
publicICredentialsICredentials
{get{return_ICredentials;}set{_ICredentials=value;}
}
}///<summary>
///Http返回參數類///</summary>
publicclassHttpResult
{///<summary>
///Http請求返回的Cookie///</summary>
publicstringCookie{get;set;}///<summary>
///Cookie對象集合///</summary>
publicCookieCollectionCookieCollection{get;set;}///<summary>
///返回的String類型數據只有ResultType.String時才返回數據,其它情況為空///</summary>
publicstringHtml{get;set;}///<summary>
///返回的Byte數組只有ResultType.Byte時才返回數據,其它情況為空///</summary>
publicbyte[]ResultByte{get;set;}///<summary>
///header對象///</summary>
publicWebHeaderCollectionHeader{get;set;}///<summary>
///返回狀態說明///</summary>
publicstringStatusDescription{get;set;}///<summary>
///返回狀態碼,默認為OK///</summary>
publicHttpStatusCodeStatusCode{get;set;}
}///<summary>
///返回類型///</summary>
publicenumResultType
{///<summary>
///表示只返回字符串只有Html有數據///</summary>String,///<summary>
///表示返回字符串和字節流ResultByte和Html都有數據返回///</summary>Byte
}///<summary>
///Post的數據格式默認為string///</summary>
publicenumPostDataType
{///<summary>
///字符串類型,這時編碼Encoding可不設置///</summary>String,///<summary>
///Byte類型,需要設置PostdataByte參數的值編碼Encoding可設置為空///</summary>Byte,///<summary>
///傳文件,Postdata必須設置為文件的絕對路徑,必須設置Encoding的值///</summary>FilePath
}///<summary>
///Cookie返回類型///</summary>
publicenumResultCookieType
{///<summary>
///只返回字符串類型的Cookie///</summary>String,///<summary>
///CookieCollection格式的Cookie集合同時也返回String類型的cookie///</summary>CookieCollection
}///<summary>HttpHelper的2次封裝函數作者:///</summary>
publicclassMyHttpHelper
{#region公共函數///<summary>返回HTML字符串的編碼結果</summary>
///<paramname="str">字符串</param>
///<returns>編碼結果</returns>
publicstaticstringHtmlEncode(stringstr)
{if(string.IsNullOrEmpty(str))
{return"";
}returnstr.Length>0?HttpUtility.HtmlEncode(str):"";
}///<summary>返回HTML字符串的解碼結果</summary>
///<paramname="str">字符串</param>
///<returns>解碼結果</returns>
publicstaticstringHtmlDecode(stringstr)
{if(string.IsNullOrEmpty(str))
{return"";
}returnstr.Length>0?HttpUtility.HtmlDecode(str):"";
}///<summary>
///根據指定的編碼對RUl進行解碼///</summary>
///<paramname="str">要解碼的字符串</param>
///<paramname="encoding">要進行解碼的編碼方式</param>
///<returns></returns>
publicstaticstringUrlDecode(stringstr,Encodingencoding=null)
{if(string.IsNullOrEmpty(str))
{return"";
}if(str.Length==0)
{return"";
}if(encoding==null)
{returnHttpUtility.UrlDecode(str);
}else
{returnHttpUtility.UrlDecode(str,encoding);
}
}///<summary>根據指定的編碼對URL進行編碼</summary>
///<paramname="str">要編碼的URL</param>
///<paramname="encoding">要進行編碼的編碼方式</param>
///<returns></returns>
publicstaticstringUrlEncode(stringstr,Encodingencoding=null)
{if(string.IsNullOrEmpty(str))
{return"";
}if(str.Length==0)
{return"";
}if(encoding==null)
{returnHttpUtility.UrlEncode(str);
}else
{returnHttpUtility.UrlEncode(str,encoding);
}
}///<summary>
///根據charSet返回Encoding///</summary>
///<paramname="charSet">"gb2312"or"utf-8",默認:""=="utf-8"</param>
///<returns></returns>
publicstaticEncodingGetEncoding(stringcharSet)
{
Encodingen=Encoding.Default;if(charSet=="gb2312")
{
en=Encoding.GetEncoding("gb2312");
}elseif(charSet=="utf-8")
{
en=Encoding.UTF8;
}returnen;
}#endregion
#regionPost///<summary>HTTPGet方式請求數據</summary>
///<paramname="url">URL</param>
///<paramname="param">user=123123&pwd=1231313"</param>
///<paramname="charSet">"gb2312"or"utf-8",默認:""=="utf-8"</param>
///<returns></returns>
publicstaticstringHttpPost(stringurl,stringparam,stringcharSet="utf-8")
{
HttpHelpershttp=newHttpHelpers();
HttpItemitem=newHttpItem()
{
URL=url,
Encoding=GetEncoding(charSet),//編碼格式(utf-8,gb2312,gbk)可選項默認類會自動識別
Method="post",//URL可選項默認為Get
Postdata=param
};//得到HTML代碼
HttpResultresult=http.GetHtml(item);//取出返回的Cookie//stringcookie=result.Cookie;//返回的Html內容
stringhtml=result.Html;if(result.StatusCode==System.Net.HttpStatusCode.OK)
{returnhtml;
}//stringstatusCodeDescription=result.StatusDescription;
return"";
}#endregion
#regionGet///<summary>HTTPGet方式請求數據</summary>
///<paramname="url">URL</param>
///<paramname="charSet">"gb2312"or"utf-8",默認:""=="utf-8"</param>
///<returns></returns>
publicstaticstringHttpGet(stringurl,stringcharSet="utf-8")
{
HttpHelpershttp=newHttpHelpers();
HttpItemitem=newHttpItem()
{
URL=url,
Encoding=GetEncoding(charSet),
Method="get"
};//得到HTML代碼
HttpResultresult=http.GetHtml(item);//取出返回的Cookie//stringcookie=result.Cookie;//返回的Html內容
stringhtml=result.Html;if(result.StatusCode==System.Net.HttpStatusCode.OK)
{returnhtml;
}//stringstatusCodeDescription=result.StatusDescription;
return"";
}///<summary>POST客服消息/summary>///<paramname="url">URL</param>
///<paramname="postData">內容</param>
///<returns>消息狀態</returns>
publicstaticstringGetPage(stringposturl,stringpostData)
{
Streamoutstream=null;
Streaminstream=null;
StreamReadersr=null;
HttpWebResponseresponse=null;
HttpWebRequestrequest=null;
Encodingencoding=Encoding.UTF8;byte[]data=encoding.GetBytes(postData);//準備請求...
try
{//設置參數
request=WebRequest.Create(posturl)asHttpWebRequest;
CookieContainercookieContainer=newCookieContainer();
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()asHttpWebResponse;//直到request.GetResponse()程序才開始向目標網頁發送Post請求
instream=response.GetResponseStream();
sr=newStreamReader(instream,encoding);//返回結果網頁(html)代碼
stringcontent=sr.ReadToEnd();stringerr=string.Empty;returncontent;
}catch(Exceptionex)
{stringerr=ex.Message;returnerr;
}
}#endregion
}
View Code
封裝的JsonHelpers類如下
#region通用///<summary>檢查字符串是否json格式</summary>
///<paramname="jText"></param>
///<returns></returns>
publicstaticboolIsJson(stringjText)
{if(string.IsNullOrEmpty(jText)||jText.Length<3)
{returnfalse;
}if(jText.Substring(0,2)=="{\""||jText.Substring(0,3)=="[{\"")
{returntrue;
}returnfalse;
}///<summary>檢查字符串是否json格式數組</summary>
///<paramname="jText"></param>
///<returns></returns>
publicstaticboolIsJsonRs(stringjText)
{if(string.IsNullOrEmpty(jText)||jText.Length<3)
{returnfalse;
}if(jText.Substring(0,3)=="[{\"")
{returntrue;
}returnfalse;
}///<summary>格式化json</summary>
///<paramname="jText"></param>
///<returns></returns>
publicstaticstringFmt_Null(stringjText)
{returnStringHelper.ReplaceString(jText,":null,",":\"\",",true);
}///<summary>格式化json,刪除左右二邊的[]</summary>
///<paramname="jText"></param>
///<returns></returns>
publicstaticstringFmt_Rs(stringjText)
{
jText=jText.Trim();
jText=jText.Trim('[');
jText=jText.Trim(']');returnjText;
}#endregion
#regionJson序列化///<summary>序列化</summary>
///<paramname="obj">object</param>
///<returns></returns>
publicstaticstringToJson(objectobj)
{varidtc=newNewtonsoft.Json.Converters.IsoDateTimeConverter{DateTimeFormat="yyyy-MM-ddhh:mm:ss"};returnJsonConvert.SerializeObject(obj,idtc);
}///<summary>序列化--sql</summary>
///<paramname="dt">DataTable</param>
///<returns></returns>
publicstaticstringToJson_FromSQL(DataTabledt)
{stringss=ToJson(dt);
dt.Dispose();returnss;
}#endregion
#regionJson反序列化///<summary>反序列化</summary>
///<paramname="jText"></param>
///<returns></returns>
publicstaticDataTableToDataTable(stringjText)
{if(string.IsNullOrEmpty(jText))
{returnnull;
}else
{try
{returnJsonConvert.DeserializeObject<DataTable>(jText);
}catch
{returnnull;
}
}
}///<summary>反序列化</summary>
///<typeparamname="T">類型</typeparam>
///<paramname="jText">json字符串</param>
///<returns>類型數據</returns>
publicstaticTToObject<T>(stringjText)
{return(T)JsonConvert.DeserializeObject(jText,typeof(T));
}#endregion
View Code
其中,如果是VS2015以下的,可以將url字符串改成string.format("")方式
調用取值的方式
效果展示
點擊公眾號鏈接效果如下:
總結
以上是生活随笔為你收集整理的微信公众号中网页授权的两种方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小米米家智能直流变频塔扇 2 今日开售,
- 下一篇: 怎么自己更换IP地址?