使用koa2對接微信公眾平臺

這幾天心血來潮怠肋,想玩下微信公眾平臺洁奈,看看它是如何對接到個人服務器的伍茄。這里簡單記錄下栋盹。

環(huán)境:
  node v7.7.1
  koa  v2.0.1

流程

1.在微信公眾平臺的 開發(fā) -> 基本配置 那填寫服務器信息;

2.點擊啟用后敷矫,微信會發(fā) Get 請求到填寫的服務器例获,檢查服務器是否有效;

3.服務器驗證通過后曹仗,公眾號每次接收到新消息榨汤,都會發(fā) POST 請求到服務器,然后我們就可以在服務器里進行各種處理怎茫。

驗證服務器

微信開發(fā)文檔里有寫驗證的規(guī)則(這不是廢話么):

verify.png

上面的文字已經(jīng)寫的很直白了收壕,不多說,代碼實現(xiàn)如下:

// 驗證消息來自微信服務器
const crypto = require('crypto')
module.exports = (ctx) => {
    const token = 'xxxx', // 自定義轨蛤,與公眾號設置的一致
          signature = ctx.query.signature,
          timestamp = ctx.query.timestamp,
          nonce = ctx.query.nonce
        
    // 字典排序
    const arr = [token, timestamp, nonce].sort()

    const sha1 = crypto.createHash('sha1')
    sha1.update(arr.join(''))
    const result = sha1.digest('hex')

    if (result === signature) {
        ctx.body = ctx.query.echostr
    } else {
        ctx.body = { code: -1, msg: "fail"}
    }
}

處理 POST 請求

下面要處理接收消息的 POST 請求蜜宪。因為消息的格式都是 XML ,所以這里需要引入 xml2js 祥山。

接收 XML 數(shù)據(jù)

koa2 沒有對 XML 格式的參數(shù)進行處理圃验,這里需要我們自己來處理下,寫的中間件如下:

// xmlTool.js
const xml2js = require('xml2js')

exports.xmlToJson = (str) => {
     return new Promise((resolve, reject) => {
        const parseString = xml2js.parseString
        parseString(str, (err, result) => {
            if (err) {
                reject(err)
            } else {
                resolve(result)
            }
        })
     })
}

exports.jsonToXml = (obj) => {
    const builder = new xml2js.Builder()
    return builder.buildObject(obj)
}

// xmlParse.js
const xml = require('./xmlTool')

module.exports = () => {
    return async (ctx, next) => {
        if (ctx.method == 'POST' && ctx.is('text/xml')) {
            let promise = new Promise(function (resolve, reject) {
                let buf = ''
                ctx.req.setEncoding('utf8')
                ctx.req.on('data', (chunk) => {
                    buf += chunk
                })
                ctx.req.on('end', () => {
                    xml.xmlToJson(buf)
                        .then(resolve)
                        .catch(reject)
                })
            })

            await promise.then((result) => {
                    ctx.req.body = result
                })
                .catch((e) => {
                    e.status = 400
                })

            next()
        } else {
            await next()
        }
    }
}

加上了這個中間件缝呕,我們就可以正確接收到 XML 格式的參數(shù)了澳窑。接收到的參數(shù)如下:

// console.log(buf) 
<xml>\n<ToUserName><![CDATA[toUser]]></ToUserName>\n<FromUserName><![CDATA[fromUser]]></FromUserName>\n<C
reateTime>12345678</CreateTime>\n<MsgType><![CDATA[text]]></MsgType>\n<Content><![CDATA[你好]]></Content>\n</x
ml>\n\n

// 轉為JSON后
{ ToUserName: [ 'toUser' ],
  FromUserName: [ 'fromUser' ],
  CreateTime: [ '12345678' ],
  MsgType: [ 'text' ],
  Content: [ '你好' ] }

發(fā)送消息

接收到消息后,服務器需要在5s內返回消息供常,如果沒內容返回摊聋,可以返回 success 或空字符串。下面是返回文本信息的例子:

// wx.js
exports.message = {
    text (msg, content) {
        return xml.jsonToXml({
            xml: {
                ToUserName: msg.FromUserName,
                FromUserName: msg.ToUserName,
                CreateTime: Date.now(),
                MsgType: msg.MsgType,
                Content: content
            }
        })
    }
}

// index.js
const wx = require('./wx')
exports.postHandle = (ctx, next) => {
    let msg,
        MsgType,
        result

    msg = ctx.req.body ? ctx.req.body.xml : ''

    if (!msg) {
        ctx.body = 'error request.'
        return;
    }
    
    MsgType = msg.MsgType[0]

    switch (MsgType) {
        case 'text':
            result = wx.message.text(msg, msg.Content)
            break;
        default: 
            result = 'success'
    }
    ctx.res.setHeader('Content-Type', 'application/xml')
    ctx.res.end(result)
}

這樣子就可以返回文本信息啦~到這里已經(jīng)把基本的流程走完话侧。其他更多的操作可以看官方文檔栗精,加以修改就好。

公眾號例子如下瞻鹏,目前只是實現(xiàn)了回復相同的文本內容:

qrcode_430.jpg

上面的代碼已開源到https://github.com/cirplan/koa2-wechat 上,歡迎圍觀鹿寨。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末新博,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子脚草,更是在濱河造成了極大的恐慌赫悄,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異埂淮,居然都是意外死亡姑隅,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進店門倔撞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來讲仰,“玉大人,你說我怎么就攤上這事痪蝇”啥福” “怎么了?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵躏啰,是天一觀的道長趁矾。 經(jīng)常有香客問我,道長给僵,這世上最難降的妖魔是什么毫捣? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮帝际,結果婚禮上培漏,老公的妹妹穿的比我還像新娘。我一直安慰自己胡本,他們只是感情好牌柄,可當我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著侧甫,像睡著了一般珊佣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上披粟,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天咒锻,我揣著相機與錄音,去河邊找鬼守屉。 笑死惑艇,一個胖子當著我的面吹牛,可吹牛的內容都是我干的拇泛。 我是一名探鬼主播滨巴,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼俺叭!你這毒婦竟也來了恭取?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤熄守,失蹤者是張志新(化名)和其女友劉穎蜈垮,沒想到半個月后耗跛,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡攒发,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年调塌,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惠猿。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡羔砾,死狀恐怖,靈堂內的尸體忽然破棺而出紊扬,到底是詐尸還是另有隱情蜒茄,我是刑警寧澤,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布餐屎,位于F島的核電站檀葛,受9級特大地震影響,放射性物質發(fā)生泄漏腹缩。R本人自食惡果不足惜屿聋,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望藏鹊。 院中可真熱鬧润讥,春花似錦、人聲如沸盘寡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽竿痰。三九已至脆粥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間影涉,已是汗流浹背变隔。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蟹倾,地道東北人匣缘。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像鲜棠,于是被迫代替她去往敵國和親肌厨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,494評論 2 348

推薦閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理岔留,服務發(fā)現(xiàn)夏哭,斷路器,智...
    卡卡羅2017閱讀 134,629評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,757評論 25 707
  • 1. Java基礎部分 基礎部分的順序:基本語法献联,類相關的語法竖配,內部類的語法,繼承相關的語法里逆,異常的語法进胯,線程的語...
    子非魚_t_閱讀 31,598評論 18 399
  • Http協(xié)議詳解 標簽(空格分隔): Linux 聲明:本片文章非原創(chuàng),內容來源于博客園作者MIN飛翔的HTTP協(xié)...
    Sivin閱讀 5,210評論 3 82
  • 大家轟隆隆相聚在一起原押,各捧手機關注各自喜好的小領域小群落胁镐,有八卦有笑話有惡搞,想關注什么就會有什么诸衔,應有盡有盯漂,豐富...
    你在微笑嗎閱讀 1,451評論 3 1