最近在學(xué)node開發(fā),于是想自己寫一個(gè)node版的微信公眾號(hào)開發(fā)。開發(fā)期間踩了挺多的坑,也學(xué)到了挺多東西。這里分幾個(gè)部分給大家分享一下node開發(fā)微信公眾號(hào)的過程,以及哪些容易遇見的坑。(歡迎批評指正,源碼在文章末尾)
微信公眾號(hào)的接入可以分為三個(gè)部分。1.node服務(wù)器;2.將本地的node服務(wù)暴露到外網(wǎng),3.微信公眾號(hào)信息驗(yàn)證。我們依次來看一下。
1.node服務(wù)器啟動(dòng)
我們先創(chuàng)建一個(gè)文件夾,并引入相應(yīng)的模塊,我這里用的是express模塊。端口隨便選擇這個(gè)沒有被占用的就行,我這用的是1234端口。
// 引入express模塊
var express = require("express");
var app = express();
app.get("/", (req, res, next)=> {
res.send("這是1234端口頁面");
})
// 監(jiān)聽1234端口
app.listen(1234);
我們到瀏覽器看一下,服務(wù)成功啟動(dòng)。

2.將本地服務(wù)暴露到外網(wǎng)
推薦一個(gè)工具——花生殼(個(gè)人感覺還挺好),去官網(wǎng)注冊一下,花6塊錢就可以獲得免費(fèi)版的內(nèi)網(wǎng)穿透服務(wù),另外注冊還可以獲得一個(gè)免費(fèi)的域名。

點(diǎn)擊添加映射,名稱隨便寫,域名選擇免費(fèi)送的就行,內(nèi)網(wǎng)主機(jī)Ip可以在命令行下輸入ipconfig查看。


設(shè)置完之后,可以診斷一下是否成功。

ps:如果不想用花生殼,也可以用其他一些免費(fèi)的插件,比如node有個(gè)插件叫做Localtunnel,使用方法也特別簡單,一個(gè)命令就行,缺點(diǎn)就是不太穩(wěn)定,每次重啟一下服務(wù),就要重新暴露,而且每次的網(wǎng)址會(huì)發(fā)生變化。

3.微信公眾號(hào)信息驗(yàn)證
進(jìn)入微信公眾號(hào)的開發(fā)文檔,選擇開始開發(fā),接口測試號(hào)申請(當(dāng)然有自己公眾號(hào)的可以用自己的公眾號(hào)),然后用微信掃碼登錄就可以看到這樣的頁面。

Token可以隨便填,URL就是我們剛才用花生殼暴露出來的外網(wǎng)服務(wù)。(但是現(xiàn)在直接填寫保存是會(huì)出錯(cuò)的,因?yàn)槲覀冞€沒有驗(yàn)證)
當(dāng)我們點(diǎn)提交的時(shí)候,微信服務(wù)器會(huì)給我們填寫的URL地址發(fā)送一個(gè)get請求,并傳回一些特定的字段。就是下圖這些參數(shù),我們需要把這些參數(shù)跟微信服務(wù)去驗(yàn)證。

所以,我們要修改一下app.js,接受一下這幾個(gè)參數(shù),并把驗(yàn)證結(jié)果返回給微信服務(wù)器。
// 引入express模塊
var express = require("express");
var app = express();
var sha1 = require("sha1");
var config = {
"appID": "wxd27649727105b6d2",
"appsecret": "a3f2eb9f5819b0bf4b2a92a81f99baf4",
"token": "wechat"
}
app.get("/", (req, res, next)=> {
// 獲取微信服務(wù)器發(fā)送的數(shù)據(jù)
var signature = req.query.signature,
timestamp = req.query.timestamp,
nonce = req.query.nonce,
echostr = req.query.echostr;
// token、timestamp、nonce三個(gè)參數(shù)進(jìn)行字典序排序
var arr = [config.token, timestamp, nonce].sort().join('');
// sha1加密
var result = sha1(arr);
if(result === signature){
res.send(echostr);
}else{
res.send('mismatch');
}
})
// 監(jiān)聽1234端口
app.listen(1234);
這里引入了一個(gè)新的模塊sha1,主要是對結(jié)果進(jìn)行加密的?,F(xiàn)在,我們再到微信測試號(hào)配置設(shè)置就可以成功保存了,這就表示,我們的驗(yàn)證成功可以開始正式的開發(fā)了。
到這一步,微信驗(yàn)證就已經(jīng)成功了,但是為了后續(xù)代碼的編寫,我們可以把代碼進(jìn)行一些優(yōu)化。比如把配置文件單獨(dú)提取出來,把微信授權(quán)方法封裝到一個(gè)模塊中,優(yōu)化完之后再到微信測試號(hào)上去重新配置保存一下,看是否出錯(cuò)。
以下是優(yōu)化部分:
1.配置文件單獨(dú)提取出來,寫在config.json文件中;
2.授權(quán)驗(yàn)證方法提取出來,寫在wechat.js文件中
wechat.js代碼:
var sha1 = require("sha1"); //引入加密模塊
// 構(gòu)造函數(shù)
function WeChat(config) {
// 傳入配置文件
this.config = config;
this.token = config.token;
this.appID = config.appID;
this.appScrect = config.appScrect;
}
// 微信授權(quán)驗(yàn)證方法
WeChat.prototype.auth = function(req, res, next) {
// 獲取微信服務(wù)器發(fā)送的數(shù)據(jù)
var signature = req.query.signature,
timestamp = req.query.timestamp,
nonce = req.query.nonce,
echostr = req.query.echostr;
// token、timestamp、nonce三個(gè)參數(shù)進(jìn)行字典序排序
var arr = [this.token, timestamp, nonce].sort().join('');
// sha1加密
var result = sha1(arr);
if(result === signature){
res.send(echostr);
}else{
res.send('mismatch');
}
}
// 暴露WeChat對象
module.exports = WeChat;
app.js
// 引入express模塊
var express = require("express");
var app = express();
var config = require("./config"); //引入配置文件
var WeChat = require("./wechat/wechat");
var wechat = new WeChat(config); //實(shí)例化一個(gè)WeChat對象
app.get("/", (req, res, next)=> {
wechat.auth(req, res, next);
})
// 監(jiān)聽1234端口
app.listen(1234);
源碼地址:https://github.com/yeshaojun/wechatBase
如果喜歡就給我點(diǎn)個(gè)小星星吧!