用 Node.js 開發微信牆簡明教程

發表於2016-03-29

這是一個簡單的用Node.js開發微信牆的教程,在這個教程中,包括以下幾部分內容:

  • 驗證伺服器有效性
  • 接收使用者通過微信訂閱號發給伺服器的訊息
  • 解析收到的XML文字訊息格式為JSON
  • 用模板構造應答使用者的XML文字訊息
  • 將接收到的訊息通過WebSocket服務廣播
  • 獲取訊息傳送人的使用者基本資訊(名字和頭像)

微信服務大體上分為兩類,一類是訊息服務,一類是資料服務。

訊息服務是由使用者在微信服務號中傳送訊息,然後微信服務講訊息推送給開發者伺服器,因此它是由微信主動發起,開發者伺服器被動接收的。

微信主動發起

訊息服務的資料體格式是XML,微信服務與開發者伺服器之間通過約定token保證資料傳輸的真實和有效性。

事實上,token驗證僅用來給開發者伺服器驗證訊息來源確實是微信,而不是偽造的(因為別人不知道具體的token),作為訊息發起方的微信並不要求必須驗證,也就是說,開發者也可以偷懶不做驗證(後果是別人可以模仿微信給服務post請求)。

 

將微信服務號的伺服器配置為開發伺服器的URL,就可以接收到微信服務號的訊息了

注意:其實理論上一個伺服器可以接受和處理多個服務號/訂閱號的訊息,可以通過訊息體的ToUserName來加以區別這個訊息是發給哪個微訊號的

接收到的訊息大概格式如下:

由於訊息體是一段XML文字,我們可以將它解析成更容易操作的JSON格式資料:

我們可以回覆訊息給微信服務,它將這個應答訊息轉給對應的發訊息的使用者,格式同樣是一段XML,我們可以通過簡單的模板來生成應答訊息:

將這個訊息作為response返回,使用者就能在服務號裡面收到應答的訊息了:

接下來我們建立一個簡單的 WebSocket 伺服器,它只有一個廣播模式:

我們可以將收到的訊息用 WebSocket 服務推送:

這樣我們就可以在頁面上接收微信訊息了。

不過……

因為訊息應答體中並沒有傳送者的使用者資訊,比如姓名、性別、頭像等等,因此我們需要獲取這些資訊,這就要用到微信的第二種服務:資料服務。

資料服務是由開發者伺服器主動呼叫微信服務API獲得資訊的服務,包括使用者管理、素材管理、智慧介面、客服介面等等,這類服務從開發者伺服器向微信服務主動發起,微信需要驗證請求的合法性,採用了與訊息服務不同的鑑權機制。

資料服務的請求是https的,返回資料格式通常是JSON。

開發者呼叫微信資料介面,需要先獲取介面呼叫憑據 access_token。介面呼叫憑據有效期為2小時,超時或重複獲取將導致上次獲取的access_token失效。每天每個服務號不能請求超過2000個access_token,因此我們需要自己快取獲取到的access_token。

在這裡我們用最簡單的檔案快取,如在分散式的和高併發的情況下,我們可以選擇其他任意的持久化儲存。

獲取到有效的 access_token,就可以進一步獲取使用者基本資訊了:

這裡面就一個注意點,getUserInfo方法的引數使用者的openID,實際上就是訊息體XML裡面的FromUserName

所以我們將使用者基本資訊獲取出來,附加到 WebSocket 推送的訊息中:

最後我們可以得到一段完整的程式,它可以將使用者傳送給某個微信服務號的文字訊息通過 WebSocket 推送到網頁,這樣我們就實現了一個功能完整的“微信牆”的服務端程式。

以下是完整程式:

以上就是微信開發的基本原理,是不是很簡單呢?上面講解的所有的程式碼在:

https://github.com/akira-cn/wxdev

有興趣的同學可以註冊一個微信訂閱號,配置好伺服器,自己嘗試一下~

相關文章