Node開發(fā)微信公眾號(hào)(1)——微信公眾號(hào)接入

最近在學(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è)小星星吧!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容