準備工作
- 外網可訪問的服務器地址,可利用花生殼代理到本地,方便開發調試(參考微信後臺開發第一步:nodeJS+express接入微信後臺詳細教程)
- 測試公衆號,可用微信公衆平臺提供的測試號(接口測試號申請)
- node v7.6.0以上,koa2依賴async(koa中文官網)
- 把測試公衆號的二維碼發給你的ta,啓動服務後開撩
創建項目及初始化
全局安裝egg-init,這是egg的腳手架,可快速生成工程目錄(快速初始化)。
$ npm i egg-init -g
$ egg-init wechat-egg --type=simple
$ cd wechat-egg
$ npm i
啓動項目:$ npm run dev
$ open localhost:7001
如果成功看到“hi, egg”就證明啓動成功了。這個頁面沒用,可以關掉,主要是npm run dev可以熱重啓服務,很方便開發。當然,如果程序報錯它是會結束的,這時候還是需要手動重啓。注:egg啓動的默認端口是7001,這個要跟上面提到的花生殼內網穿透匹配上,後面會有用。
開始寫業務
$ npm i -S koa co-wechat
因爲co-wechat是個中間件,所以我們也把它放到middleware下面去,不過還需要進行一層封裝。
在app目錄下新建middleware目錄,並新建wechat.js文件。
// app/middleware/wechat.js
const wechat = require('co-wechat');
module.exports = (options, app) => {
return wechat(options).middleware(async (message, ctx) => {
// TODO
});
};
因爲co-wechat的調用還是有點跟標準不一樣的,只export整個包是不行的,要按如上封裝一下(參考使用koa的中間件)。TODO就是業務代碼,後面還會把它豐富,並抽離到service。但是!!!!!由於後面還有一步微信驗證,所以這裏暫時還不能寫任何代碼!!!不能寫任何代碼!!!不能寫任何代碼!!!
然後配置一下router,添加兩項
// app/router.js
const wechat = app.middlewares.wechat({
token: '微信後臺配置',
appid: '微信後臺提供',
encodingAESKey: '微信後臺配置此時寫成空字符串就行了'
});
router.get('/wechat', wechat);
router.post('/wechat', wechat);
上面聲明瞭一個wechat變量,來返回一個接受了config參數的結果,其結果是個function,可參考co-wechat的說明去理解。下面的get、post都要綁定,是因爲get用來通過微信後臺配置時候的驗證用的,post纔是正常的業務邏輯,此處需要結合微信的文檔去理解,不理解也沒關係,後面會有另外一篇純手動實現微信對接的文章去梳理。最後,關掉egg的csrf
// config/config.default.js
config.security = {
csrf: {
enable: false,
ignoreJSON: true
}
};
OK,此時已經距離成功只有一步之遙了。打開你自己的微信測試公衆號,在接口配置信息修改裏填入信息。記得開啓花生殼,url輸入花生殼裏映射的域名,別忘了在後面加上/wechat。如:http://yoururl.com/wechat點擊“提交”,如果驗證成功,證明已經綁上了,如果不成功,請回頭走一遍每一個細節。如果綁定成功了,下面就可以寫一些真正的業務代碼了。還記得上面提到的 app/middleware/wechat.js 裏面的 TODO部分嗎?可以往裏面加東西了。但是如果你還要重複上面的“接口配置信息修改”操作,那麼記得把這部分暫時註釋掉。
編輯 app/middleware/wechat.js
// app/middleware/wechat.js
const wechat = require('co-wechat');
module.exports = (options, app) => {
return wechat(options).middleware(async (message, ctx) => {
// TODO
let { MsgType, Content } = message;
if (MsgType === 'text') {
let reply;
switch (Content) {
case '12345':
reply = '上山打老虎';
break;
case 'kiki':
reply = '是我媳婦';
break;
default:
const msgs = [
'我媳婦老漂亮了',
'我媳婦會做飯',
'我媳婦會煎藥',
'我媳婦吃的可多了',
'我媳婦可能睡了',
'我媳婦叫kiki',
'我媳婦會打太極拳',
'我媳婦總掉頭髮',
'我媳婦可愛哭了',
'我媳婦有點二'
];
let rand = Math.floor(Math.random() * msgs.length);
reply = msgs[rand];
}
return reply;
} else {
return '歡迎光臨';
}
});
};
然後就可以去公衆號裏發信息,各種調戲了。理論上,這部分業務代碼應該抽到service裏面,包括之前的一些config信息,也應該放到config裏面,此處就不做展開了,留給大家自由發揮吧。在正確的結果基礎上改,才知道自己哪裏寫的有問題不是。注意事項
最後重申一下注意事項:
- 調試時記得開啓花生殼
- 本機的端口號要與內網穿透的端口號匹配上
- 記得把egg的csrf關掉
- 微信後臺的各種id、token要跟代碼裏的對上
- 在微信後臺的“接口配置信息修改”操作時,記得把業務代碼先暫時註釋掉