专栏首页薛定喵君(xuedingmiao.com)koa2实现微信公众号关注自动回复消息

koa2实现微信公众号关注自动回复消息

基于koa框架接入微信公众号实现自动回复消息的功能

# 准备工作

  • 注册一个服务号或者申请 一个测试公众号
  • 一台服务器或者本地使用内网穿透软件(ngrok、花生壳、lanproxy...)

# 公众号接入配置

在公众号管理后台填写接口配置信息。 开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败 加密/校验流程如下:

  • 将token、timestamp、nonce三个参数进行字典序排序
  • 将三个参数字符串拼接成一个字符串进行sha1加密
  • 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

# 服务号配置

在公众平台官网的开发-基本设置页面,勾选协议成为开发者,点击“修改配置”按钮,填写服务器地址(URL)、Token和EncodingAESKey,其中URL是开发者用来接收微信消息和事件的接口URL。Token可由开发者可以任意填写,用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性)。EncodingAESKey由开发者手动填写或随机生成,将用作消息体加解密密钥

# 测试号配置

配置成功会有消息提示

# 主要代码

// 验证消息的确来自微信服务器
router.get('/', async (ctx, next) => {
  let signature = ctx.query.signature,
    timestamp = ctx.query.timestamp,
    nonce = ctx.query.nonce,
    token = '123456'
  let str = [token, timestamp, nonce].sort().join('')
  let result = sha1(str)
  let rt
  if (result === signature) {
    rt = ctx.query.echostr
  } else {
    rt = {
      code: -1,
      msg: 'fail',
    }
  }
  ctx.body = rt
  await next()
})

router.post('/', async (ctx, next) => {
  var data = await getRawBody(ctx.req, {
    length: ctx.length,
    limit: '1mb',
    encoding: ctx.charset,
  })
  const xml = await parseXMLAsync(data)
  const createTime = Date.parse(new Date())
  const msgType = xml.xml.MsgType[0]
  const toUserName = xml.xml.ToUserName[0]
  const toFromName = xml.xml.FromUserName[0]
  const event = xml.xml.Event ? xml.xml.Event[0] : ''
  if (msgType == 'event' && event == 'subscribe') {
    //关注后
    ctx.body = `<xml>
		 <ToUserName><![CDATA[${toFromName}]]></ToUserName>
		 <FromUserName><![CDATA[${toUserName}]]></FromUserName>
		 <CreateTime>${createTime}</CreateTime>
		 <MsgType><![CDATA[text]]></MsgType>
		 <Content><![CDATA[欢迎关注]]></Content>
		 </xml>`
  } else {
    //其他情况
    ctx.body = `<xml>
		 <ToUserName><![CDATA[${toFromName}]]></ToUserName>
		 <FromUserName><![CDATA[${toUserName}]]></FromUserName>
		 <CreateTime>${createTime}</CreateTime>
		 <MsgType><![CDATA[text]]></MsgType>
		 <Content><![CDATA[你说啥?]]></Content>
		 </xml>`
  }
})

function parseXMLAsync(xml) {
  return new Promise((resolve, reject) => {
    xml2js.parseString(xml, { trim: true }, function (err, content) {
      if (err) {
        reject(err)
      }
      resolve(content)
    })
  })
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 小程序下拉刷新真机上不回缩问题解决

    薛定喵君
  • koa2实现静态资源服务器

    访问public下的图片资源 localhost:3001/[图片名称].jpg

    薛定喵君
  • 微信公众号接入智能聊天机器人

    用户在公众号会话内发送消息后,后台接收用户的文本消息并将消息发送至智能机器人API后转发API的返回结果给用户(是不是很简单? )。

    薛定喵君
  • 关于koa2,你不知道的事

    koa 是一个基于 node 实现的一个新的 web 框架,它是由 express 框架的原班人马打造。特点是优雅、简洁、表达力强、自由度高。和 express...

    lucifer210
  • Bluestore下的SSD故障排查

    线上发现L版本一个OSD down,不确定是否磁盘故障,之前的filestore排查起来比较熟,换成Bluestore以后,有些细节上的操作不一样,因为用到的是...

    用户1260683
  • 【深度相机系列七】深度相机应用全面梳理:多点开花,定点爆破

    前面我们对深度相机的基本原理有了一定了解,本文相对全面的梳理一下深度相机的应用领域。深度相机的应用在智能人机交互、人脸技术、三维重建、机器人、AR等领域全面开花...

    用户1150922
  • PHP array_reverse() 函数原理及实例解析

    array_reverse(arrayarray[,boolpreserve_keys=FALSE] ) :array

    砸漏
  • 面向初学者的高阶组件教程

    谈点:一篇面向初学者的 HOC 介绍。高阶组件听起来挺唬人的,只看名字恐怕不是那么容易明白究竟是何物,而且通常来讲高阶组件并不是组件,而是接受组件作为参数,并且...

    疯狂的技术宅
  • C++模板

    用户2929716
  • 爱点击ICLK.US增持畅移,深度协同催生更多增长机会

    近日爱点击集团宣布增持畅移科技,表示会“将畅移在社交电商解决方案领域的专长、爱点击卓越的数据分析能力和双方的客户基础和资源,进行有机融合并发挥综效。”

    刘旷

扫码关注云+社区

领取腾讯云代金券