黑夜給了我黑色的眼睛,我決定錄視頻到天明。半年前的現在,我還在苦逼着加着班,半年后的今天我依舊苦逼着加着班。不過現在的是為自己加班,作為一個資深程序小白,一個月前我光榮的成了一個不稱職的資本家,不稱職的原因有二:一是我人丑錢少臉皮薄(沒有資本),而是我先階段還只能剝削我自己。
回想着半年的歷程,好像發生很多事。從由於辛辛苦苦准備的微信培訓資料被公司的同事忽視而在博客園寫下的第一篇微信教程,到電子出版社的編輯聯系到我商討出版的事,從簽訂出版合同到開始寫下書的第一個字,從每天加班到凌晨回去還得加班寫會書再到前段時間的全職寫我的這個處女作。冷暖自知。
距離上次寫博客已經過去差不多四五個月了,但現在回頭看看之前的博客感覺還是差點什么。推到重寫也是需要勇氣的,因為現在對於我來說自由的時間相對多些,可以持續的更新我的這個系列教程,希望能幫助更多的朋友進入微信開發者的行列。
廢話少說了,說說寫這樣一篇博文的原因吧。說實在的,在平常在群里和其他微信開發者進行交流的時候發現好多人都不是很了解微信的工作原理, 微信的接口原理,以至於遇到點小問題就在群里問,其中也不乏一些有一定微信開發經驗的朋友。所以本篇博文也算是微信開發的脫盲引導篇了吧
感覺上面還是廢話。。。。。。。。。。。。。。。。。。
工作原理
直觀上,我們看到的微信公眾號的工作流程是這樣的:用戶發送消息或者點擊公眾號的自定義菜單,服務器收到用戶的請求后,根據業務邏輯回復給用戶對應的消息,如文本、圖文、視頻、音頻等。學過網絡的人看着一定很熟悉,這就是典型的http請求。
http請求方式
微信公眾平台的自動回復功能就和http的原理一致,而開發者根據微信官方提供的接口來定制自己的公眾平台時,就稍微有點差別了。首先,當用戶在微信里給公眾號發送消息或者點擊微信自定義菜單時,微信手機客戶端將這條消息發送到微信服務器,其次,微信服務器收到用戶的請求后,根據具體的業務邏輯再將消息推送給開發者設置的url,這個url對於微信服務器來說就是一個服務器,微信服務器此時充當的是客戶端的角色,開發者的服務器收到微信服務器推送過來的請求后,根據微信提供的規則解析出用戶發送的消息內容,然后再根據具體的業務邏輯將響應的內容回復給微信服務器,微信服務器再返回給用戶。在整個過程中,開發者的服務器對於用戶來說是透明的。如下圖所示:
微信開發者需要做的就是開發者服務器這一塊的業務,然后結合微信提供的其他一些功能接口進行開發。 如用戶管理、素材管理、微信支付、微信小店等。
個人覺得可以將微信的接口分為兩類:一類是被動請求接口,就是類似於上圖所示的用戶主動發送消息,開發者解析消息內容后進行回復。這種類型的接口是微信主動請求開發者的程序,數據傳輸使用XML格式數據。另一類主動請求接口,比如獲取access_token接口,由微信服務器提供接口,開發者只需按照接口的請求方式,數據格式進行調用即可,這種接口的數據傳輸使用的是JSON格式數據(微信支付相關接口是個例外,使用的是XML格式)。總結一下就是:被動請求接口是開發者按照微信的規定協議進行接口開發,由微信服務器進行調用。而主動請求接口就是微信接口開發完畢后,將調用協議告訴開發者,由開發者進行調用。 所以兩種場景下,開發者的服務器與微信服務器之間的角色是在變化的。
HTTP請求與響應
以上的兩種類型,不管是微信服務器作為客戶端還是開發者的服務器作為客戶端,請求的方式都是基於HTTP的。所以在此簡單講下HTTP請求怎么調用接口的。在此給大家推薦一個工具(谷歌瀏覽器的插件postman),這個插件可以很方便的發起HTTP請求。如下圖所示:
在上圖中,我調用的是獲取access_token的接口。請求方式是GET。在我們編寫程序時,需要使用程序的方式來發起HTTP請求。具體的實現GET請求的實現是:
System.Net命名空間下的WebRequest類的Create方法,初始化一個請求實例。
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
然后設置下常用的請求頭
request.Method = "GET";//設置請求的方法。這里表示的是請求的方式是GET
request.Accept = "*/*";//設置Accept標頭的值
最后調用請求實例的GetResponse()方法,獲取響應流,並將響應流轉換成字符串。完整的實現代碼如下所示:
/// <summary> /// HTTP GET方式請求數據. /// </summary> /// <param name="url">請求的url</param> /// <returns>響應信息</returns> public static string HttpGet(string url) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "GET";//設置請求的方法 request.Accept = "*/*";//設置Accept標頭的值 string responseStr = ""; using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())//獲取響應 { using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8)) { responseStr = reader.ReadToEnd(); } } return responseStr; }
GET請求的方法創建完后,就可以根據上述的代碼創建一個POST方法。需要注意的是,如果絕大部分情況下接口POST的請求是需要POST數據包的,所以設置請求的ContentType為application/x-www-form-urlencoded,這里默認先不考慮帶文件的FORM表單的提交,在后面的系列使用到的時候會詳細講解。如下所示為POST請求的方法:
/// <summary> /// HTTP POST方式請求數據 /// </summary> /// <param name="url">URL.</param> /// <param name="param">POST的數據</param> public static string HttpPost(string url, string param) { //當請求為https時,驗證服務器證書 ServicePointManager.ServerCertificateValidationCallback=new RemoteCertificateValidationCallback((a,b,c,d) =>{return true;}); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; request.Accept = "*/*"; request.Timeout = 15000; request.AllowAutoRedirect = false; string responseStr = ""; using (StreamWriter requestStream = new StreamWriter(request.GetRequestStream())) { requestStream.Write(param);//將請求的數據寫入到請求流中 } using (HttpWebResponse response =(HttpWebResponse) request.GetResponse()) { using (StreamReader reader =new StreamReader(response.GetResponseStream(),Encoding.UTF8)) { responseStr = reader.ReadToEnd();//獲取響應 } } return responseStr; }
XML與JOSN的使用
由於在接口調用的過程中,XML和JSON是消息的格式, 那就需要知道該怎樣從這樣格式的字符串中提取到需要的信息。先來講下XML吧。個人比較習慣使用Linq To XML的方法。如圖所示,簡單明了:
JSON的序列化與反序列化使用newtonsoft.json,可以很方便的進行處理。關於這個第三方插件的使用,園子里已經有很多大神些的博客了,在此我就不廢話了。
IIS+花生殼+VS本地調試微信
這里我以一個真實的微信代碼作為演示。
首選,安裝后IIS后,在IIS里添加一個網站。
如上圖所示,物理路徑為web項目的路徑。其他的默認即可。保存之后記得給網站目錄加上訪問權限。
下載並安裝花生殼。下載地址(
)
安裝完成后,需要注冊一個賬號。新注冊的賬號可能會沒有免費使用的權限,但是官網是可以申請到資格的。請自行申請。登陸后,界面如下:
進入如下頁面:
點擊添加映射:
選擇當前主機,並勾選使用http80端口。
確定后,如果不出意外的話就可以正常使用了。
如下圖所示, 我的項目處理微信服務器請求的頁面是根目錄的wx.ashx頁面。
為了保險起見,可以在瀏覽器訪問下這個頁面的url(http://ypyle.xicp.net/wx.ashx),看本地映射是否成功。
狀態為200,說明映射成功了。
然后在vs中依次進入【調試】→【附加到進程】
進入如下頁面,選擇w3wp進程:
點擊附加按鈕,進入即可進入調試。下面就是讓微信服務器調用我們的本地計算機了。在微信公眾號接入的時候,需要get請求到開發者的服務器,所以,這里使用接入url進行演示。
如圖所示,填寫好信息后,點擊提交按鈕:
如下圖所示,微信請求了上圖填寫的url,順利進入了斷點:
附視頻教程:http://pan.baidu.com/s/1c0o7scg
本人才疏學淺,人丑錢少臉皮薄,所以文章或視頻中有錯誤或不妥之處,歡迎各位同仁指教。
如果覺得本文對你有幫助,請點擊文章下面的推薦哦,去幫助更多的小伙伴了解微信開發的流程。
如果你是土豪,想支持筆者繼續更新本系列教程,可以掃描下面的二維碼懸賞一下,你的支持是筆者繼續更新下去的動力。
如果你司需求微信開發項目合作,可以私聊我QQ。