這一篇主要講作為一名使用公眾平台接口的開發者,你需要知道的一些東西。其中也涉及到一些微信官方的規定或比較掩蔽的注意點。歡迎補充!
我覺得做好成為開發者的准備比稀里糊塗開通微信后台的“高級”功能更重要,所以這一節先放在前面說。
一、公眾平台的通訊過程
作為開發者,我們需要面對的主要有兩個對象:微信服務器和應用程序(網站)服務器。
當微信用戶向你的公眾平台發送一條消息,實際上這條消息首先發送到微信服務器,由微信服務器向網站服務器發起另外一個請求,網站服務器返回這個請求的結果,再由微信服務器發送到微信客戶端。
整個消息通訊流程如下圖:
上述5個步驟中,作為開發者我們主要精力都集中在步驟3上,這個步驟主實際上要有3項任務:
- 接收來自2的XML信息
- 服務器內部邏輯執行
- 組織並返回用於4的XML信息
上述三項任務我會在后面做詳細說明,並提供一整套簡單、高效的處理方法。
二、XML通訊格式
用戶使用微信客戶端發送的不同類型的消息,網站服務器會收到不同格式的數據(文字、語音、圖片等等),數據格式暫時只有XML一種。
作為學習,我覺得只要熟練掌握最簡單的文字類型就可以了,其他的格式都是大同小異。且在后面的說明中你會發現,Senparc.Weixin.MP.dll可以幫助我們完全忽略這些繁瑣的格式和定義。
一個簡單的文字請求XML(RequestMessage)內容如下:
<xml> <ToUserName><![CDATA[gh_a96a4a619366]]></ToUserName> <FromUserName><![CDATA[olPjZjsXuQPJoV0HlruZkNzKc91E]]></FromUserName> <CreateTime>1357986928</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[TNT2]]></Content> <MsgId>5832509444155992350</MsgId> </xml>
對應節點的官方說明如下:
參數 | 描述 |
---|---|
ToUserName | 開發者微信號 |
FromUserName | 發送方帳號(一個OpenID) |
CreateTime | 消息創建時間 (整型) |
MsgType | text |
Content | 文本消息內容 |
MsgId | 消息id,64位整型 |
一個簡單的文字返回XML(ResponseMessage)內容如下:
<xml> <ToUserName><![CDATA[olPjZjsXuQPJoV0HlruZkNzKc91E]]></ToUserName> <FromUserName><![CDATA[gh_a96a4a619366]]></FromUserName> <CreateTime>12345678</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[content]]></Content> <FuncFlag>0</FuncFlag> </xml>
對應節點的官方說明如下:
參數 | 描述 |
---|---|
ToUserName | 接收方帳號(收到的OpenID) |
FromUserName | 開發者微信號 |
CreateTime | 消息創建時間 |
MsgType | text |
Content | 回復的消息內容,長度不超過2048字節 |
FuncFlag | 位0x0001被標志時,星標剛收到的消息。 |
三、一些需要注意和容易被忽視的問題:
- 每條XML信息都有大小限制,如文本信息,建議Content內容不要超過600字。
- 上圖中,步驟2開始之后,微信服務器有一個等待時間:5秒,如果在這個時間內沒有進行到步驟4,那么這個請求將會被關閉(包括數據傳輸的時間)。也就是說如果超過時間,即使網站服務器返回了數據,客戶端也無法收到回復。
- 在文本消息中,是允許添加<a>標簽來放置連接的,但是有許多朋友測試之后發現iOS沒問題,Android上鏈接無法點擊,其實原因是(至少目前為止):Android的微信客戶端對<a>標簽格式的判定比較嚴格,請嚴格按照這個格式書寫:<a href="http://xxxx">內容</a>,href后不要使用單引號,也不要添加其他屬性。
- 上面XML節點中的FromUserName即微信用戶的OpenId,對於同一個公眾賬號,這個OpenId的前6位是一致的,並且在整個公眾平台的記錄中也是唯一的。也就是說同一個用戶關注了兩個不同的公眾賬號,他會有兩個不同的OpenId。
- CreateTime使用的是Unix時間,因此如果使用C#的話,需要做一個轉換。
- 盡量保持官方API中XML節點的順序,以前微信服務器是使用節點位置的方式讀取信息的(node[0]),而非節點名稱,現在這個問題似乎有好轉,不過還是要小心(¥…………&%&……)。
- 由於這種特殊的通訊方式,(至少目前為止)所有請求必須從客戶端先發起,不要指望光使用API或SDK可以實現由網站服務器主動推送消息到客戶端(當然其他辦法還是有的,比如模擬登陸)。
四、工欲善其事,必先利其器:Senparc.Weixin.MP.dll
雖然整個通訊過程十分簡單,但是官方API還是對一些字段做了特殊的約定或處理,況且面向過程地處理這么多類型的請求數據也是一件十分費力的事情。
為此我做了一個開源項目:Senparc.Weixin.MP,地址:https://github.com/JeffreySu/WeiXinMPSDK/
Senparc.Weixin.MP的主要目的是幫助C#開發者簡化整個通訊過程,面向對象地處理消息,把主要精力放到業務邏輯上,而非繁瑣的API上。
使用Senparc.Weixin.MP,並部署到外網與微信服務器通訊,你需要准備這些環境:
- VS2012(至少VS2010 SP1);
- 如果需要運行MVC的Demo,至少需要.NET 4.0(安裝MVC 4),運行Webforms Demo,至少需要.NET 3.5;
- 一個可以使用80端口訪問的域名或IP,虛擬主機、花生殼映射內網、VPS、獨立服務器都可以。
這里先簡單地引入Senparc.Weixin.MP這個項目的介紹,后面我會做更詳細的說明並舉例(https://github.com/JeffreySu/WeiXinMPSDK/ 里面也已經編寫了足夠多的使用文檔和Demo可以參考)。
系列教程索引
地址:http://www.cnblogs.com/szw/archive/2013/05/14/weixin-course-index.html
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(一):微信公眾平台注冊
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(二):成為開發者
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(三):微信公眾平台開發驗證
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(四):Hello World
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(五):使用Senparc.Weixin.MP SDK
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(六):了解MessageHandler
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(七):解決用戶上下文(Session)問題
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(八):通用接口說明
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(九):自定義菜單接口說明
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(十):多客服接口說明
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(十一):高級接口說明
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(十二):OAuth2.0說明
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(十三):地圖相關接口說明
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(十四):請求消息去重
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(十五):消息加密
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(十六):AccessToken自動管理機制
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(十七):個性化菜單接口說明
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(十八):Web代理功能
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(十九):MessageHandler 的未知類型消息處理
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(二十):使用菜單消息功能
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(二十一):在小程序中使用 WebSocket (.NET Core)
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(二十二):如何安裝 Nuget(dll) 后使用項目源代碼調試