教你如何用node.js開發微信公眾號(一)
本文章簡單介紹瞭如何用 node.js
開發微信公眾號。主要內容包括signature的驗證, access_token
的生成,微信事件的接收,還有各種api的呼叫。
準備工作
開發前需要安裝好 node.js
,因為我是基於 express
框架開發的,所以裝了 express
(框架按自己的需求選擇),需要有一個微信公眾號,不管是訂閱號還是服務號都可以(沒有的話可以用測試公眾號),還需要一個公網能訪問的伺服器。基本的配置就這些,後面有需要的再補充。接下來,開始講如何開發。
一、微信公眾平臺配置
登入微信公眾平臺,沒有公眾號的話註冊一個測試公眾號(不會的點這裡,掃碼登入即可)。 進入到公眾平臺,你會看到如下介面:

基本配置
進入到公眾平臺首頁,首先會有一個測試號資訊的 appID,appsecret
;並且 appID
和 appsecret
是不可以修改的(自己註冊公眾號的 appsecret
是可以重置的,操作很簡單,這裡不做說明);
介面配置
介面配置資訊這個模組,首次進來的是空的,需要自己配置;這裡需要配置兩個引數,一個是URL,還有一個是 Token
;如果不知道怎麼配置,具體的可以看微信的 wiki
文件,我這裡也給大家說一下我配置的時候遇到的一些坑吧!
首先,點選修改的時候,會變成如下介面:

注意點:
- URL引數說明: url填的是一個公網上部署好的介面地址( 是真實存在已經部署好能夠請求的介面 ),介面必須以
http://
或https:
//開頭,僅支援80
埠和443
埠。 - Token引數說明:
token
填的是自己定義的一個標識,需要注意的一點就是這邊配置好了以後,在上面那個url
的接口裡面設定的token
需要和這個保持一致,不然配置是不會成功的。
ofollow,noindex">具體的配置指南戳這裡
當你點選提交的時候,會發送一個 get
請求到你剛剛填寫的 URL
地址,並且會帶上4個引數,分別是: signature,timestamp,echostr,nonce
,然後在服務端驗證配置是否通過;
如果配置成功,則會有如下成功提示:

如果配置失敗,則會有如下失敗提示:

介面配置到這裡就完成了。
JS介面安全域名
這個配置主要是為了能夠調 js-sdk
介面配置的,只有在該域名下,開發才能呼叫微信 js
介面(像呼叫二維碼,上傳預覽檔案等功能),文件也寫的比較詳細,這裡不做過多說明。
到這裡,微信公眾平臺的配置就差不多了,接下來就可以開始服務端的開發了。
二、node服務端開發配置
還記得微信公眾平臺配置的時候填寫的 url
和 token
值嗎?這裡就用到了,來看下面一段程式碼:
const bodyParser = require('body-parser'); //處理請求引數 server.get("/", function (req, res) { var token = "xxxx"; var signature = req.query.signature; var timestamp = req.query.timestamp; var echostr = req.query.echostr; var nonce = req.query.nonce; var oriArray = new Array(); oriArray[0] = nonce; oriArray[1] = timestamp; oriArray[2] = token; oriArray.sort(); var original = oriArray.join(''); var sha = sha1(original) if (signature === sha) { //驗證成功 res.send(echostr) } else { //驗證失敗 res.send({ "message": "error" }) } }); 複製程式碼
還記得上面說點選提交的時候會發一個get請求嗎?還說會帶 signature,timestamp,echostr,nonce
四個引數。就是在這個介面中,判斷配置是否成功的,來看下這個get請求具體做了什麼事情。
- 定義一個
token
值,需要和公眾平臺配置的token
保持一致。 - 通過
req.query.xxx
獲取請求傳過來的4個引數。 - 把
nonce,timestamp,token
新增到一個數組中,並用sort()
排序,然後把這個陣列用join("")
拼接成一個字串。 - 用
sha1
加密生成一個密匙,最後判斷通過sha1
生成的signature
和引數帶過來的signature
是否一致,一致則配置成功,不一致則配置失敗。
具體可以看官方文件(文件示例是php的),文件地址戳這裡;
到這裡微信開發的公眾號配置和node服務端配置就完成了,接下來可以開始愉快的開發啦!
三、使用者資訊處理
首先問一個問題,當用戶關注公眾號,傳送訊息的時候,開發者在哪裡能接收到這些訊息,並做相應的回覆呢?
答案是微信公眾平臺配置的 URL
的 post
請求,如果說該URL的get請求是為了配置用的,那麼post請求就是為了處理使用者資訊。
來看下面一段程式碼
var parseString = require('xml2js').parseString; server.post("/", function (req, res) { try { var buffer = []; //監聽 data 事件 用於接收資料 req.on('data', function (data) { buffer.push(data); }); //監聽 end 事件 用於處理接收完成的資料 req.on('end', function () { //輸出接收完成的資料 parseString(Buffer.concat(buffer).toString('utf-8'), { explicitArray: false }, function (err, result) { if (err) { //列印錯誤資訊 console.log(err); } else { //列印解析結果 result = result.xml; var toUser = result.ToUserName; //接收方微信 var fromUser = result.FromUserName;//傳送仿微信 //判斷是否是事件型別 if (result.Event) { //處理事件型別 switch (result.Event) { case "subscribe": //關注公眾號 break; default: } } else { //處理訊息型別 switch (result.MsgType) { case "text": //處理文字訊息 break; case "image": //處理圖片訊息 break; case "voice": //處理語音訊息 break; case "video": //處理視訊訊息 break; case "shortvideo": //處理小視訊訊息 break; case "location": //處理髮送地理位置 break; case "link": //處理點選連結訊息 break; default: } } } }) }); } catch (err) { res.send(err); } }); 複製程式碼
通過上面這段程式碼,可以看出,所有的訊息處理都是在一個 post
中處理,大致的流程是服務端會接收一段固定格式 xml
的字串,具體格式如下:
<xml> <ToUserName><![CDATA[${toUser}]]></ToUserName>//接收方 <FromUserName><![CDATA[${fromUser}]]></FromUserName>//傳送方 <CreateTime>${new Date().getTime()}</CreateTime>//傳送時間 <Event>< ![CDATA[VIEW] ]></Event>//事件型別 <MsgType><![CDATA[text]]></MsgType>//訊息型別 <Content><![CDATA[${content}]]></Content>//內容 </xml>; 複製程式碼
當接收訊息處理完成後, res.send(xml)
傳送資料的時候也是要一個 xml
格式的資料,要注意的一點是, ToUserName
和 FromUserName
不要弄錯就可以了!具體的文件有詳細的解釋,文件戳這裡哦;
好了,今天的內容就講到這裡了,剩下還有一些關於生成access_token,還有如何呼叫js-sdk的內容過兩天更新吧!
小弟這裡有一份react後臺管理腳手架模版,有需要的自取 戳我,戳我,戳我,github