nodejs死亡筆記之實戰篇---微信公衆號的開發(1)

本篇文章將利用express框架進行微信公衆號的開發。


從申請一個微信公衆號開始

要開發微信號,首先你得有一個。微信公衆號地址:https://mp.weixin.qq.com。註冊登錄我就不說了,如果連這些你都搞不定,也沒必要繼續看下去了。

微信公衆號提供了許多基礎功能,比如羣發,自動回覆,自定義菜單等等。如果這些功能已經可以滿足你的要求,那麼你可以點擊右上角的叉叉,換一篇微信攻略來看。

好了,既然你還在看,那麼證明默認的功能無法滿足你,那麼現在你需要自己來設置一些功能。

我們先從最基本的說起。


如何接入微信公衆號

接入概述

接入微信公衆平臺開發,開發者需要按照如下步驟完成:

  1. 填寫服務器配置
  2. 驗證服務器地址的有效性
  3. 依據接口文檔實現業務邏輯

下面詳細介紹這3個步驟。

第一步:填寫服務器配置

登錄微信公衆平臺官網後,在公衆平臺官網的開發-基本設置頁面,勾選協議成爲開發者,點擊“修改配置”按鈕,填寫服務器地址(URL)、Token和EncodingAESKey,其中URL是開發者用來接收微信消息和事件的接口URL。Token可由開發者可以任意填寫,用作生成簽名(該Token會和接口URL中包含的Token進行比對,從而驗證安全性)。EncodingAESKey由開發者手動填寫或隨機生成,將用作消息體加解密密鑰。

同時,開發者可選擇消息加解密方式:明文模式、兼容模式和安全模式。模式的選擇與服務器配置在提交後都會立即生效,請開發者謹慎填寫及選擇。加解密方式的默認狀態爲明文模式,選擇兼容模式和安全模式需要提前配置好相關加解密代碼,詳情請參考消息體簽名及加解密部分的文檔。

點擊開發配置
這裏寫圖片描述

進入接入驗證界面。

這裏寫圖片描述

第二步:驗證消息的確來自微信服務器

開發者提交信息後,微信服務器將發送GET請求到填寫的服務器地址URL上,GET請求攜帶參數如下表所示:

參數 描述
signature 微信加密簽名,signature結合了開發者填寫的token參數和請求中的timestamp參數、nonce參數。
timestamp 時間戳
nonce 隨機數
echostr 隨機字符串


開發者通過檢驗signature對請求進行校驗(下面有校驗方式)。若確認此次GET請求來自微信服務器,請原樣返回echostr參數內容,則接入生效,成爲開發者成功,否則接入失敗。加密/校驗流程如下:

  1. 將token、timestamp、nonce三個參數進行字典序排序
  2. 將三個參數字符串拼接成一個字符串進行sha1加密
  3. 開發者獲得加密後的字符串可與signature對比,標識該請求來源於微信

第三步:依據接口文檔實現業務邏輯

驗證URL有效性成功後即接入生效,成爲開發者。你可以在公衆平臺網站中申請微信認證,認證成功後,將獲得更多接口權限,滿足更多業務需求。

成爲開發者後,用戶每次向公衆號發送消息、或者產生自定義菜單、或產生微信支付訂單等情況時,開發者填寫的服務器配置URL將得到微信服務器推送過來的消息和事件,開發者可以依據自身業務邏輯進行響應,如回覆消息。

公衆號調用各接口時,一般會獲得正確的結果,具體結果可見對應接口的說明。返回錯誤時,可根據返回碼來查詢錯誤原因。全局返回碼說明

用戶向公衆號發送消息時,公衆號方收到的消息發送者是一個OpenID,是使用用戶微信號加密後的結果,每個用戶對每個公衆號有一個唯一的OpenID。

此外,由於開發者經常有需在多個平臺(移動應用、網站、公衆帳號)之間共通用戶帳號,統一帳號體系的需求,微信開放平臺(open.weixin.qq.com)提供了UnionID機制。開發者可通過OpenID來獲取用戶基本信息,而如果開發者擁有多個應用(移動應用、網站應用和公衆帳號,公衆帳號只有在被綁定到微信開放平臺帳號下後,纔會獲取UnionID),可通過獲取用戶基本信息中的UnionID來區分用戶的唯一性,因爲只要是同一個微信開放平臺帳號下的移動應用、網站應用和公衆帳號,用戶的UnionID是唯一的。換句話說,同一用戶,對同一個微信開放平臺帳號下的不同應用,UnionID是相同的。詳情請在微信開放平臺的資源中心-移動應用開發-微信登錄-授權關係接口調用指引-獲取用戶個人信息(UnionID機制)中查看。

另請注意,微信公衆號接口必須以http://或https://開頭,分別支持80端口和443端口。


用代碼說話

知道了接入過程,那麼接下來開始寫代碼。

首先,新建一個項目

express -e NodeWeixin

cd NodeWeixin

npm install

express的安裝我就不講了,不會的可以去翻我前面的博客。

然後我們將routes/index.js作爲我們的主要路由,打開index.js,將裏面的代碼全部刪除,我們重新寫。

先寫這樣一段代碼:

module.exports = function(app){
  app.get('/interface',function(req,res){
    //設置token
    var token="weixin";
  });
}

這裏的路徑暫時設爲interface,定義了一個變量token,通過上面的講解,相比大家也都知道了,這裏的token必須和你在微信接入時填寫的token完全一致。

上面我們說過,加密校驗分三步,我們一步一步來。

加密/校驗流程如下:

1.將token、timestamp、nonce三個參數進行字典序排序

在get方法中添加:

    //獲得微信服務器發來的參數
    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();

先獲取到相應的參數,然後排序

2.將三個參數字符串拼接成一個字符串進行sha1加密

接着寫:

 //使用sha1進行加密
    var original = oriArray.join('');
    var jsSHA = require('jssha');
    var shaObj = new jsSHA("SHA-1", 'TEXT');
    shaObj.update(original);
    var scyptoString=shaObj.getHash('HEX');

這裏用到了一個加密模塊jssha,需要自己進行添加。這樣我們就得到了加密後的字符串scyptoString。

3.開發者獲得加密後的字符串可與signature對比,標識該請求來源於微信

最後:

    //判斷簽名是否相同
    if(signature == scyptoString){
      console.log("true");
      //驗證成功
      res.status(200).send(echostr);
    } else {
      console.log("false");
      return false;
    }

如果成功,向服務器響應,否則失敗。


完成接入驗證

主要的代碼我們寫完了,接下來做一些瑣碎的修改。

修改app.js

我們剛剛修改了index.js的代碼,顯得方法需要一個app參數,我們修改一下app.js中的代碼:

var app = express();

//將這兩句移動到了app初始化的後面,並將app傳遞給index.js
var routes = require('./routes/index')(app);
var users = require('./routes/users');

使用QQ瀏覽器的微信調試工具

我之前說過,溫馨接入驗證的url必須的外網的url,所以你不能寫127.0.0.1或者localhost,那我們怎麼才能調試呢?

如果你有自己的服務器,你可以把代碼放到你的服務器上,不過這樣其實是很麻煩的,我建議大家使用qq瀏覽器的微信調試工具,盡心本地測試。

首先,下載QQ瀏覽器:http://browser.qq.com/

安裝好後,進入應用中心,搜索並安裝“微信調試工具”

這裏寫圖片描述

打開插件-服務器端調試,綁定服務這裏填寫3000,點擊啓動,得到外部域名

這裏寫圖片描述

好了,現在外網域名有了,代碼也有了。開始做最後一步。

接入驗證

在接入驗證界面的url一欄輸入:剛剛獲得的url/interface
token一欄輸入: weixin
隨機字符串點擊隨機生成按鈕就可以
加密方式選擇明文

這裏寫圖片描述

最後點擊提交,就可以了:

這裏寫圖片描述


本篇文章就先講到這裏,下一篇會講解收發消息。

源代碼放在github上:https://github.com/CleverFan/NodejsWeixin

歡迎大家批評指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章