教你如何用node.js開發微信公衆號(一)

內容簡介

本文章簡單介紹瞭如何用node.js開發微信公衆號。主要內容包括微信公衆平臺的配置,signature的驗證,以及用node.js去處理用戶主動發起的行爲。php

準備工做

開發前須要安裝好node.js,由於我是基於express框架開發的,因此裝了express(框架按本身的需求選擇),須要有一個微信公衆號,無論是訂閱號仍是服務號均可以(沒有的話能夠用測試公衆號),還須要一個公網能訪問的服務器。基本的配置就這些,後面有須要的再補充。接下來,開始講如何開發。前端

1、微信公衆平臺配置

登陸微信公衆平臺,沒有公衆號的話註冊一個測試公衆號(不會的點這裏,掃碼登陸便可)。 進入到公衆平臺,你會看到以下界面:node

基本配置

進入到公衆平臺首頁,首先會有一個測試號信息的appID,appsecret;而且appIDappsecret是不能夠修改的(本身註冊公衆號的appsecret是能夠重置的,操做很簡單,這裏不作說明);react

接口配置

接口配置信息這個模塊,首次進來的是空的,須要本身配置;這裏須要配置兩個參數,一個是URL,還有一個是Token;若是不知道怎麼配置,具體的能夠看微信的wiki文檔,我這裏也給你們說一下我配置的時候遇到的一些坑吧!

首先,點擊修改的時候,會變成以下界面:git

注意點:
github

  • URL參數說明: url填的是一個公網上部署好的接口地址(是真實存在已經部署好可以請求的接口),接口必須以http://https://開頭,僅支持80端口和443端口。
  • Token參數說明: token填的是本身定義的一個標識,須要注意的一點就是這邊配置好了之後,在上面那個url的接口裏面設置的token須要和這個保持一致,否則配置是不會成功的。

具體的配置指南戳這裏express

當你點擊提交的時候,會發送一個get請求到你剛剛填寫的URL地址,而且會帶上4個參數,分別是:signature,timestamp,echostr,nonce,而後在服務端驗證配置是否經過;
若是配置成功,則會有以下成功提示:數組

若是配置失敗,則會有以下失敗提示:

接口配置到這裏就完成了。安全

JS接口安全域名

這個配置主要是爲了可以調js-sdk接口配置的,只有在該域名下,開發才能調用微信js接口(像調用二維碼,上傳預覽文件等功能),文檔也寫的比較詳細,這裏不作過多說明。

微信官方JS-SDK文檔戳這裏bash

到這裏,微信公衆平臺的配置就差很少了,接下來就能夠開始服務端的開發了。

2、node服務端開發配置

還記得微信公衆平臺配置的時候填寫的urltoken值嗎?這裏就用到了,來看下面一段代碼:

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請求具體作了什麼事情。

  1. 定義一個token值,須要和公衆平臺配置的token保持一致。
  2. 經過req.query.xxx獲取請求傳過來的4個參數。
  3. nonce,timestamp,token添加到一個數組中,並用sort()排序,而後把這個數組用join("")拼接成一個字符串。
  4. sha1加密生成一個密匙,最後判斷經過sha1生成的signature和參數帶過來的signature是否一致,一致則配置成功,不一致則配置失敗。

具體能夠看官方文檔(文檔示例是php的),文檔地址 戳這裏

到這裏微信開發的公衆號配置和node服務端配置就完成了,接下來能夠開始愉快的開發啦!

3、用戶信息處理

首先問一個問題,當用戶關注公衆號,發送消息的時候,開發者在哪裏能接收到這些消息,並作相應的回覆呢?
答案是微信公衆平臺配置的URLpost請求,若是說該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,根據EventMsgType作事件類型的判斷,並作相應的處理,最後,res.send(xml)發送數據的時候也是要一個xml格式的數據,要注意的一點是,ToUserNameFromUserName不要弄錯就能夠了!具體的文檔有詳細的解釋,文檔戳這裏哦;

好了,今天的內容就講到這裏了,剩下還有一些關於生成access_token,還有如何調用js-sdk的內容過兩天更新吧!

小弟這裏有一份react後臺管理腳手架模版,有須要的自取 戳我,戳我,戳我,github

關注

你們好,我是西瓜太郎,小前端一枚,座標杭州,今天入住掘金,第一次寫文章,若有寫的不適的地方還請大佬多多指教,若有助於八方兄弟,那小弟搬磚將會更加有動力!

相關文章
相關標籤/搜索