微信对接母根服务器,使用koa2对接微信公众平台

这几天心血来潮,想玩下微信公众平台,看看它是如何对接到个人服务器的。这里简单记录下。

环境:

node v7.7.1

koa v2.0.1

流程

1.在微信公众平台的 开发 -> 基本配置 那填写服务器信息;

2.点击启用后,微信会发 Get 请求到填写的服务器,检查服务器是否有效;

3.服务器验证通过后,公众号每次接收到新消息,都会发 POST 请求到服务器,然后我们就可以在服务器里进行各种处理。

验证服务器

微信开发文档里有写验证的规则(这不是废话么):

7a4ba7f752f1

verify.png

上面的文字已经写的很直白了,不多说,代码实现如下:

// 验证消息来自微信服务器

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 数据

koa2 没有对 XML 格式的参数进行处理,这里需要我们自己来处理下,写的中间件如下:

// 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 格式的参数了。接收到的参数如下:

// console.log(buf)

\n\n\n

reateTime>12345678\n\n\n

ml>\n\n

// 转为JSON后

{ ToUserName: [ 'toUser' ],

FromUserName: [ 'fromUser' ],

CreateTime: [ '12345678' ],

MsgType: [ 'text' ],

Content: [ '你好' ] }

发送消息

接收到消息后,服务器需要在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)

}

这样子就可以返回文本信息啦~到这里已经把基本的流程走完。其他更多的操作可以看官方文档,加以修改就好。

公众号例子如下,目前只是实现了回复相同的文本内容:

7a4ba7f752f1

qrcode_430.jpg

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值