? ? 我覺得做好成為開發(fā)者的準備比稀里糊涂開通微信后臺的“高級”功能更重要,所以這一節(jié)先放在前面說。
一、公眾平臺的通訊過程
? ? 作為開發(fā)者,我們需要面對的主要有兩個對象:微信服務(wù)器和應(yīng)用程序(網(wǎng)站)服務(wù)器。
? ? 當微信用戶向你的公眾平臺發(fā)送一條消息,實際上這條消息首先發(fā)送到微信服務(wù)器,由微信服務(wù)器向網(wǎng)站服務(wù)器發(fā)起另外一個請求,網(wǎng)站服務(wù)器返回這個請求的結(jié)果,再由微信服務(wù)器發(fā)送到微信客戶端。
? ? 整個消息通訊流程如下圖:
? ??
? ? 上述5個步驟中,作為開發(fā)者我們主要精力都集中在步驟3上,這個步驟主實際上要有3項任務(wù):
接收來自2的XML信息
服務(wù)器內(nèi)部邏輯執(zhí)行
組織并返回用于4的XML信息
? ? 上述三項任務(wù)我會在后面做詳細說明,并提供一整套簡單、高效的處理方法。
二、XML通訊格式
? ? 用戶使用微信客戶端發(fā)送的不同類型的消息,網(wǎng)站服務(wù)器會收到不同格式的數(shù)據(jù)(文字、語音、圖片等等),數(shù)據(jù)格式暫時只有XML一種。
? ? 作為學(xué)習,我覺得只要熟練掌握最簡單的文字類型就可以了,其他的格式都是大同小異。且在后面的說明中你會發(fā)現(xiàn),Senparc.Weixin.MP.dll可以幫助我們完全忽略這些繁瑣的格式和定義。
? ? 一個簡單的文字請求XML(RequestMessage)內(nèi)容如下:
<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>
對應(yīng)節(jié)點的官方說明如下:
參數(shù) | 描述 |
---|---|
ToUserName | 開發(fā)者微信號 |
FromUserName | 發(fā)送方帳號(一個OpenID) |
CreateTime | 消息創(chuàng)建時間 (整型) |
MsgType | text |
Content | 文本消息內(nèi)容 |
MsgId | 消息id,64位整型 |
一個簡單的文字返回XML(ResponseMessage)內(nèi)容如下:
<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>
對應(yīng)節(jié)點的官方說明如下:
參數(shù) | 描述 |
---|---|
ToUserName | 接收方帳號(收到的OpenID) |
FromUserName | 開發(fā)者微信號 |
CreateTime | 消息創(chuàng)建時間 |
MsgType | text |
Content | 回復(fù)的消息內(nèi)容,長度不超過2048字節(jié) |
FuncFlag | 位0x0001被標志時,星標剛收到的消息。 |
?
?
?
?
?
?
三、一些需要注意和容易被忽視的問題:
每條XML信息都有大小限制,如文本信息,建議Content內(nèi)容不要超過600字。
上圖中,步驟2開始之后,微信服務(wù)器有一個等待時間:5秒,如果在這個時間內(nèi)沒有進行到步驟4,那么這個請求將會被關(guān)閉(包括數(shù)據(jù)傳輸?shù)臅r間)。也就是說如果超過時間,即使網(wǎng)站服務(wù)器返回了數(shù)據(jù),客戶端也無法收到回復(fù)。
在文本消息中,是允許添加標簽來放置連接的,但是有許多朋友測試之后發(fā)現(xiàn)iOS沒問題,Android上鏈接無法點擊,其實原因是(至少目前為止):Android的微信客戶端對標簽格式的判定比較嚴格,請嚴格按照這個格式書寫:內(nèi)容,href后不要使用單引號,也不要添加其他屬性。
上面XML節(jié)點中的FromUserName即微信用戶的OpenId,對于同一個公眾賬號,這個OpenId的前6位是一致的,并且在整個公眾平臺的記錄中也是唯一的。也就是說同一個用戶關(guān)注了兩個不同的公眾賬號,他會有兩個不同的OpenId。
CreateTime使用的是Unix時間,因此如果使用C#的話,需要做一個轉(zhuǎn)換。
盡量保持官方API中XML節(jié)點的順序,以前微信服務(wù)器是使用節(jié)點位置的方式讀取信息的(node[0]),而非節(jié)點名稱,現(xiàn)在這個問題似乎有好轉(zhuǎn),不過還是要小心(¥…………&%&……)。
由于這種特殊的通訊方式,(至少目前為止)所有請求必須從客戶端先發(fā)起,不要指望光使用API或SDK可以實現(xiàn)由網(wǎng)站服務(wù)器主動推送消息到客戶端(當然其他辦法還是有的,比如模擬登陸)。
四、工欲善其事,必先利其器:Senparc.Weixin.MP.dll
? ? 雖然整個通訊過程十分簡單,但是官方API還是對一些字段做了特殊的約定或處理,況且面向過程地處理這么多類型的請求數(shù)據(jù)也是一件十分費力的事情。
? ? 為此我做了一個開源項目:Senparc.Weixin.MP,地址:http://ipnx.cn/
? ? Senparc.Weixin.MP的主要目的是幫助C#開發(fā)者簡化整個通訊過程,面向?qū)ο蟮靥幚硐?,把主要精力放到業(yè)務(wù)邏輯上,而非繁瑣的API上。
? ? 使用Senparc.Weixin.MP,并部署到外網(wǎng)與微信服務(wù)器通訊,你需要準備這些環(huán)境:
VS2012(至少VS2010 SP1);
如果需要運行MVC的Demo,至少需要.NET 4.0(安裝MVC 4),運行Webforms Demo,至少需要.NET 3.5;
一個可以使用80端口訪問的域名或IP,虛擬主機、花生殼映射內(nèi)網(wǎng)、VPS、獨立服務(wù)器都可以。
?
更多Senparc.Weixin.MP SDK 微信公眾平臺開發(fā)教程(二):成為開發(fā)者相關(guān)文章請關(guān)注PHP中文網(wǎng)!

熱AI工具

Undress AI Tool
免費脫衣服圖片

Undresser.AI Undress
人工智能驅(qū)動的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover
用于從照片中去除衣服的在線人工智能工具。

Clothoff.io
AI脫衣機

Video Face Swap
使用我們完全免費的人工智能換臉工具輕松在任何視頻中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的代碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
功能強大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版
神級代碼編輯軟件(SublimeText3)