egg + co-wechat快速搭建微信公衆號對接服務

準備工作

  1. 外網可訪問的服務器地址,可利用花生殼代理到本地,方便開發調試(參考微信後臺開發第一步:nodeJS+express接入微信後臺詳細教程
  2. 測試公衆號,可用微信公衆平臺提供的測試號(接口測試號申請
  3. node v7.6.0以上,koa2依賴async(koa中文官網
  4. 把測試公衆號的二維碼發給你的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,這個要跟上面提到的花生殼內網穿透匹配上,後面會有用。

開始寫業務

安裝co-wechat

$ 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裏面,此處就不做展開了,留給大家自由發揮吧。在正確的結果基礎上改,才知道自己哪裏寫的有問題不是。

注意事項

最後重申一下注意事項:

  1. 調試時記得開啓花生殼
  2. 本機的端口號要與內網穿透的端口號匹配上
  3. 記得把egg的csrf關掉
  4. 微信後臺的各種id、token要跟代碼裏的對上
  5. 在微信後臺的“接口配置信息修改”操作時,記得把業務代碼先暫時註釋掉

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