When an ordinary WeChat user sends a message to a public account, the WeChat server will POST the XML data packet of the message to the URL filled in by the developer .
2.1 Receive common message data format
The structure of XML is basically fixed, and different message types are slightly different.
When a user sends a text message, the XML data format received by the WeChat public account is as follows:
createTime 1234567890123456
When a user sends a picture message, the XML data format received by the WeChat public account is as follows :
1348831860 1234567890123456
For the structure of other message message types, please refer to [WeChat Public Platform Development Documents]
For the processing ofPOST request, koa2 does not encapsulate the method of obtaining parameters, which is required By parsing the native node.js request object request in the context context by itself. We will use the row-body module to get the data.
2.2 Let’s optimize the previous code first
The code in this section follows the code implemented in the previous session, with slight changes based on the previous session. .
'use strict' const Koa = require('koa') const app = new Koa() const crypto = require('crypto') // 将配置文件独立到config.js const config = require('./config') app.use(async ctx => { // GET 验证服务器 if (ctx.method === 'GET') { const { signature, timestamp, nonce, echostr } = ctx.query const TOKEN = config.wechat.token let hash = crypto.createHash('sha1') const arr = [TOKEN, timestamp, nonce].sort() hash.update(arr.join('')) const shasum = hash.digest('hex') if (shasum === signature) { return ctx.body = echostr } ctx.status = 401 ctx.body = 'Invalid signature' } else if (ctx.method === 'POST') { // POST接收数据 // TODO } }); app.listen(7001);
Here we only verified whether the signature value is legal in GET. In fact, we should also verify the signature in POST.
Write signature verification as a function
function getSignature (timestamp, nonce, token) { let hash = crypto.createHash('sha1') const arr = [token, timestamp, nonce].sort() hash.update(arr.join('')) return hash.digest('hex') }
Optimize the code and add verification to POST
... app.use(async ctx => { const { signature, timestamp, nonce, echostr } = ctx.query const TOKEN = config.wechat.token if (ctx.method === 'GET') { if (signature === getSignature(timestamp, nonce, TOKEN)) { return ctx.body = echostr } ctx.status = 401 ctx.body = 'Invalid signature' }else if (ctx.method === 'POST') { if (signature !== getSignature(timestamp, nonce, TOKEN)) { ctx.status = 401 return ctx.body = 'Invalid signature' } // TODO } }); ...
Up to this point we have not started to implement the function of accepting XML data packets, but It is the code before modification. This is to demonstrate the actual development process. Writing any code is not a one-step process, and good code can only be modified.
2.3 Receive XML data packets for ordinary messages from public accounts
Now let’s get to the point of this section, accept XML data packets and convert them to JSON
$ npm install raw-body --save
... const getRawBody = require('raw-body') ... // TODO // 取原始数据 const xml = await getRawBody(ctx.req, { length: ctx.request.length, limit: '1mb', encoding: ctx.request.charset || 'utf-8' }); console.log(xml) return ctx.body = 'success' // 直接回复success,微信服务器不会对此作任何处理
Send a text message to your test account, you can see the following data printed out on the command line
1516940059 6515207943908059832
Congratulations, you can now receive XML data.
The above is the detailed content of How to operate the Koa2 WeChat public account to achieve message management. For more information, please follow other related articles on the PHP Chinese website!