本篇文章將利用express框架進行微信公衆號的開發。
從申請一個微信公衆號開始
要開發微信號,首先你得有一個。微信公衆號地址:https://mp.weixin.qq.com。註冊登錄我就不說了,如果連這些你都搞不定,也沒必要繼續看下去了。
微信公衆號提供了許多基礎功能,比如羣發,自動回覆,自定義菜單等等。如果這些功能已經可以滿足你的要求,那麼你可以點擊右上角的叉叉,換一篇微信攻略來看。
好了,既然你還在看,那麼證明默認的功能無法滿足你,那麼現在你需要自己來設置一些功能。
我們先從最基本的說起。
如何接入微信公衆號
接入概述
接入微信公衆平臺開發,開發者需要按照如下步驟完成:
- 填寫服務器配置
- 驗證服務器地址的有效性
- 依據接口文檔實現業務邏輯
下面詳細介紹這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參數內容,則接入生效,成爲開發者成功,否則接入失敗。加密/校驗流程如下:
- 將token、timestamp、nonce三個參數進行字典序排序
- 將三個參數字符串拼接成一個字符串進行sha1加密
- 開發者獲得加密後的字符串可與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
歡迎大家批評指正。