本文章簡單介紹瞭如何用node.js
開發微信公衆號。主要內容包括微信公衆平臺的配置,signature
的驗證,以及用node.js
去處理用戶主動發起的行爲。php
開發前須要安裝好node.js
,由於我是基於express
框架開發的,因此裝了express
(框架按本身的需求選擇),須要有一個微信公衆號,無論是訂閱號仍是服務號均可以(沒有的話能夠用測試公衆號),還須要一個公網能訪問的服務器。基本的配置就這些,後面有須要的再補充。接下來,開始講如何開發。前端
登陸微信公衆平臺,沒有公衆號的話註冊一個測試公衆號(不會的點這裏,掃碼登陸便可)。 進入到公衆平臺,你會看到以下界面:node
進入到公衆平臺首頁,首先會有一個測試號信息的appID,appsecret
;而且appID
和appsecret
是不能夠修改的(本身註冊公衆號的appsecret
是能夠重置的,操做很簡單,這裏不作說明);react
接口配置信息這個模塊,首次進來的是空的,須要本身配置;這裏須要配置兩個參數,一個是URL,還有一個是Token
;若是不知道怎麼配置,具體的能夠看微信的wiki
文檔,我這裏也給你們說一下我配置的時候遇到的一些坑吧!
首先,點擊修改的時候,會變成以下界面:git
注意點:
github
http://
或https:
//開頭,僅支持80
端口和443
端口。token
填的是本身定義的一個標識,須要注意的一點就是這邊配置好了之後,在上面那個url
的接口裏面設置的token
須要和這個保持一致,否則配置是不會成功的。具體的配置指南戳這裏express
當你點擊提交的時候,會發送一個get
請求到你剛剛填寫的URL
地址,而且會帶上4個參數,分別是:signature,timestamp,echostr,nonce
,而後在服務端驗證配置是否經過;
若是配置成功,則會有以下成功提示:數組
接口配置到這裏就完成了。安全
這個配置主要是爲了可以調js-sdk
接口配置的,只有在該域名下,開發才能調用微信js
接口(像調用二維碼,上傳預覽文件等功能),文檔也寫的比較詳細,這裏不作過多說明。
微信官方JS-SDK文檔戳這裏bash
到這裏,微信公衆平臺的配置就差很少了,接下來就能夠開始服務端的開發了。
還記得微信公衆平臺配置的時候填寫的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>;
複製代碼
當接收到xml
消息後,用xml2js
解析xml
,根據Event
和MsgType
作事件類型的判斷,並作相應的處理,最後,res.send(xml)
發送數據的時候也是要一個xml
格式的數據,要注意的一點是,ToUserName
和FromUserName
不要弄錯就能夠了!具體的文檔有詳細的解釋,文檔戳這裏哦;
好了,今天的內容就講到這裏了,剩下還有一些關於生成access_token,還有如何調用js-sdk的內容過兩天更新吧!
小弟這裏有一份react後臺管理腳手架模版,有須要的自取 戳我,戳我,戳我,github
你們好,我是西瓜太郎,小前端一枚,座標杭州,今天入住掘金,第一次寫文章,若有寫的不適的地方還請大佬多多指教,若有助於八方兄弟,那小弟搬磚將會更加有動力!