如何操作Koa2微信公众号实现消息管理

接收消息

当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。

2.1 接收普通消息数据格式

XML的结构基本固定,不同的消息类型略有不同。

用户发送文本消息时,微信公众账号接收到的XML数据格式如下所示:

   createTime   1234567890123456

登录后复制

用户发送图片消息时,微信公众账号接收到的XML数据格式如下所示:

    1348831860       1234567890123456

登录后复制

其他消息消息类型的结构请查阅【微信公众平台开发文档】

对于POST请求的处理,koa2没有封装获取参数的方法,需要通过自己解析上下文context中的原生node.js请求对象request。我们将用到row-body这个模块来拿到数据。

2.2 先来优化之前的代码

这一节的代码紧接着上一届实现的代码,在上一届的基础上轻微改动了下。

'use strict'const Koa = require('koa')const app = new Koa()const crypto = require('crypto')// 将配置文件独立到config.jsconst 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);

登录后复制

这儿我们在只在GET中验证了签名值是否合法,实际上我们在POST中也应该验证签名。

将签名验证写成一个函数

function getSignature (timestamp, nonce, token) { let hash = crypto.createHash('sha1') const arr = [token, timestamp, nonce].sort() hash.update(arr.join('')) return hash.digest('hex')}

登录后复制

优化代码,再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 }});...

登录后复制

到这儿我们都没有开始实现接受XML数据包的功能,而是在修改之前的代码。这是为了演示在实际开发中的过程,写任何代码都不是一步到位的,好的代码都是改出来的。

2.3 接收公众号普通消息的XML数据包

现在开始进入本节的重点,接受XML数据包并转为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,微信服务器不会对此作任何处理

登录后复制

给你的测试号发送文本消息,你可以在命令行看见打印出如下数据

   1516940059   6515207943908059832

登录后复制

恭喜,到此你已经可以接收到XML数据了。

以上就是如何操作Koa2微信公众号实现消息管理的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2754615.html

(0)
上一篇 2025年3月8日 06:59:28
下一篇 2025年2月28日 13:25:01

AD推荐 黄金广告位招租... 更多推荐

相关推荐

发表回复

登录后才能评论