详解nodejs微信公众号开发——4.自动回复各种消息

作者:岩茶时间:2026-10-22 02:56:38浏览:335

本文基于Node.js详解微信公众号自动回复功能的实现。重点讲解如何响应POST请求并返回特定XML结构,涵盖文本、图片、语音、视频及图文消息的回复逻辑。针对MediaId获取问题,指出需通过素材管理接口上传多媒体文件,而非直接使用URL,为后续功能开发奠定基础。

Node.js微信公众号被动回复实现

上一篇文章:nodejs微信公众号开发——3.封装消息响应模块,实现了对消息接口的模块化处理,方便后期的使用,本篇文章将介绍微信公众号回复各种消息的功能实现,包括文本、图片、语音、视频、音乐、图文等。

注:近期localtunnel服务稳定性欠佳,测试过程较为繁琐。建议有条件者搭建云服务器,此处为简化流程,仍继续使用localtunnel进行演示。

1. 被动回复用户消息

当用户向公众号发送消息,或触发特定事件推送时,服务器会收到一个POST请求。开发者需在响应包中返回特定的XML结构,以对该消息进行回应(目前支持回复文本、图片、图文、语音、视频和音乐)。发送被动响应消息,即是对微信服务器发来消息的一次直接回复。

开发过程中若遇到公众号暂时无法提供服务,请稍后再试的情况,通常由以下两个原因导致:

  1. 开发者在5秒内未回复任何内容
  2. 开发者回复的数据格式异常,非XML格式,例如返回了JSON数据

具体的消息处理规则可参考微信平台开发者文档中关于被动回复用户消息的说明。

回复消息代码实现

2. 回复消息的实现

此前的关注自动回复逻辑是在weixin.js文件中实现的,其他类型的消息回复代码也编写在该文件中。


if(message.MsgType === 'event'){
  if(message.Event === 'subscribe'){
    if(message.EventKey) {
      console.log('扫描二维码关注:'+ message.EventKey +' '+ message.ticket);
    }
    this.body = '终于等到你,还好我没放弃';
  }else if(message.Event === 'unsubscribe'){
    this.body = '';
    console.log(message.FromUserName + ' 悄悄地走了...');
  }else if(message.Event === 'LOCATION'){
    this.body = '您上报的地理位置是:'+ message.Latitude + ',' + message.Longitude;
  }else if(message.Event === 'CLICK'){
    this.body = '您点击了菜单:'+ message.EventKey;
  }else if(message.Event === 'SCAN'){
    this.body = '关注后扫描二维码:'+ message.Ticket;
  }
}
else if(message.MsgType === 'text'){
  var content = message.Content;
  var reply = '你说的话:“' + content + '”,我听不懂呀';
  if(content === '1'){
    reply = '金刚:骷髅岛';
  }
  else if(content === '2'){
    reply = {
      type:'image',
      mediaId:'http://tu.23juqing.com/d/file/html/gndy/dyzz/2017-04-09/da9c7a64ab7df196d08b4b327ef248f2.jpg'
    }
  }
  else if(content === '3'){
    reply = [{
      title:'金刚.骷髅岛',
      description:'南太平洋上的神秘岛屿——骷髅岛。史上最大金刚与骷髅蜥蜴的较量。',
      picUrl:'http://tu.23juqing.com/d/file/html/gndy/dyzz/2017-04-09/da9c7a64ab7df196d08b4b327ef248f2.jpg',
      url:'http://www.piaohua.com/html/dongzuo/2017/0409/31921.html' //可下载观看喔
    }];
  }

  // ... 其他回复类型

  this.body = reply;
}

测试效果如图:

Node.js微信公众号被动回复实现

MediaId与素材管理说明

3. 说明:

若输入数字2并未回复相应的图片,这是否令人疑惑?查阅相关文档可知:

Node.js微信公众号被动回复实现

文档明确指出,MediaId属性需通过素材管理接口上传多媒体文件后获得,并非直接提供网上图片的URL链接。而在图文消息中,是可以直接使用URL链接的。因此,下一步的工作重点是实现素材管理的接口。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

作者最新文章