返回顶部
首页 > 资讯 > 前端开发 > node.js >详解nodejs微信公众号开发——2.自动回复
  • 960
分享到

详解nodejs微信公众号开发——2.自动回复

详解自动回复公众 2022-06-04 17:06:31 960人浏览 安东尼
摘要

上一篇文章:nodejs微信公众号开发(1)接入微信公众号,本篇文章将在此基础上实现简单的回复功能。 1. 接入代码的优化 之前我们简单粗暴的实现了微信公众号的接入,接入的代码直接写在了app.js文件

上一篇文章:nodejs微信公众号开发(1)接入微信公众号,本篇文章将在此基础上实现简单的回复功能。

1. 接入代码的优化

之前我们简单粗暴的实现了微信公众号的接入,接入的代码直接写在了app.js文件里面,从项目开发的角度而言,不便于日后代码的维护,所以将这部分代码独立出来,按照koa的风格,写成一个中间件

在根目录下新建wechat文件夹,新建generator.js文件,


var sha1 = require('sha1');

module.exports = function(opts){
  return function *(next){
    var token = opts.token;
    var signature = this.query.signature;
    var nonce = this.query.nonce;
    var timestamp = this.query.timestamp;
    var echostr = this.query.echostr;
    var str = [token,timestamp,nonce].sort().join('');
    var sha = sha1(str);
    this.body = (sha === signature) ? echostr + '' : 'failed';
  };
}

此时app.js的内容变成:


'use strict'

var Koa = require('koa');
var wechat = require('./wechat/generator');

var config = {
  wechat:{
    appID:'...',
    appSecret:'...',
    token:'...'
  }
};

var app = new Koa();
app.use(wechat(config.wechat));
app.listen(8080);
console.log('Listening 8080...')

2. 获取access_token

access_token是开发程序与wexin公众平台交互的一把钥匙,调用绝大部分接口都需要用到access_token。

access_token的特点:

有效期为2小时(7200s),过期自动失效,需要重新获取; 只要更新了access_token,之前的access_token自动失效;

解决方案:

系统每隔2小时自动去获取一下access_token的值,确保access_token始终是有效的; 为了方便频繁调用,将access_token存储在唯一的一个地方(数据库、文件等),所有子系统都能访问。

程序中采用构造函数的方式,在生成实例,完成初始化工作的的过程中,读取存储在config/wechat.txt文件中的票据,判断是否为空且是否过期,选择性的重新获取数字并且保存在原文件里面,关于获取access_token的官方文档介绍可见:获取access_token。


function Wechat(opts){   //构造函数,用以生成实例,完成初始化工作,读写票据
  var that = this;
  this.appID = opts.appID;
  this.appSecret = opts.appSecret;
  this.getAccessToken = opts.getAccessToken;
  this.saveAccessToken = opts.saveAccessToken;

  this.getAccessToken().then(function(data){
    try{
      data = JSON.parse(data);
    }catch(e){
      return that.updateAccessToken();
    }
    if(that.isvalidAccessToken(data)){
      Promise.resolve(data);
    }else{
      return that.updateAccessToken();
    }
  }).then(function(data){
    that.access_token = data.access_token;
    that.expires_in = data.expires_in;
    that.saveAccessToken(JSON.stringify(data));
  });
}

我们在moudle.exports中实例化一个Wechat:


var wechat = new Wechat(opts);

这样确保了每次程序启动都会获取对access_token的有效性进行检验,并且每个一段时间会自动获取一个新的access_token。

3. 处理微信消息的步骤

无论是事件推送还是消息推送,微信服务器都是以post的方式发送请求,推送的数据类型不是json而是xml,处理推送消息一般分为五个步骤:

处理POST类型的控制逻辑,接收xml数据包; 解析数据包,获取数据包的消息类型或数据类型; 拼装自定义的消息; 包装成xml格式; 在5秒钟内返回消息。

3.1 接收xml数据

通过raw-body模块可以获取Http模块中的request对象,并且可以对数据进行拼装,从而拿到一个buffer的xml对象


var data = yield rawBody(this.req,{
        length:this.length,
        limit:'1mb',
        encoding:this.charset
      });
console.log('data:'+data);

查看图片

3.2 解析xml数据

使用xml2js模块,将xml数据解析成对象格式


var content = yield util.parseXMLAsync(data);
util中的parseXMLAsync方法:

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

查看图片

3.3 格式化xml数据

从解析的xml数据来看,数据虽然已经呈现键值对的形式,但是其值是数组的形式,需要进行扁平化处理:


var message = util.fORMatMessage(content.xml);

其本质就是遍历数组中的值,因为在多图文的消息中存在嵌套的情况:


function formatMessage(result){
  var message = {};
  if(typeof result === 'object'){
    var keys = Object.keys(result);
    for(var i=0;i<keys.length;i++){
      var key = keys[i];
      var item = result[key];
      if(!(item instanceof Array) || item.length === 0) continue;
      if (item.length === 1){
        var val = item[0];
        if (typeof val === 'object') message[key] = formatMessage(val);
        else message[key] = (val || '').trim();
      }else{
        message[key] = [];
        for(var j=0,k=item.length;j<k;j++) message[key].push(formatMessage(item[j]));
      }
    }
  }
  return message;
}

查看图片

3.4 判断消息类型并回复

这里针对subscribe事件,新关注后自动回复文本消息终于等到你,还好我没放弃


if(message.MsgType === 'event'){
  if(message.Event === 'subscribe'){
    var createTime = new Date().getTime();
    that.status = 200;
    that.type = 'application/xml';
    that.body = '<xml>'+
          '<ToUserName><![CDATA['+ message.FromUserName +']]></ToUserName>'+
          '<FromUserName><![CDATA['+ message.ToUserName +']]></FromUserName>'+
          '<CreateTime>'+createTime+'</CreateTime>'+
          '<MsgType><![CDATA[text]]></MsgType>'+
          '<Content><![CDATA[终于等到你,还好我没放弃]]></Content>'+
          '</xml>'
    return;
  }
}

注:这里只是简单地实现一下自动回复功能,这种拼接字符串的方式还是很不方便的,后面会封装成接口。

使用手机微信扫描测试账号的二维码,即可关注,同时接收到测试公众号推送的消息!

查看图片

啦啦,一个简单的关注回复就完成了。

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

--结束END--

本文标题: 详解nodejs微信公众号开发——2.自动回复

本文链接: https://lsjlt.com/news/12709.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 详解nodejs微信公众号开发——2.自动回复
    上一篇文章:nodejs微信公众号开发(1)接入微信公众号,本篇文章将在此基础上实现简单的回复功能。 1. 接入代码的优化 之前我们简单粗暴的实现了微信公众号的接入,接入的代码直接写在了app.js文件...
    99+
    2022-06-04
    详解 自动回复 公众
  • 详解nodejs微信公众号开发——4.自动回复各种消息
    上一篇文章:nodejs微信公众号开发——3.封装消息响应模块,实现了对消息接口的模块化处理,方便后期的使用,本篇文章将介绍微信公众号回复各种消息的功能实现,包括文本、图片、语音、视频、音乐、图文等。 注...
    99+
    2022-06-04
    详解 自动回复 公众
  • 详解nodejs微信公众号开发——1.接入微信公众号
    接入微信公众号是开发的第一步,万事开头难,走好第一步,后面的路就更宽广。 1.公众平台测试帐号的使用 登录微信公众平台,由于很多开发人员并没有认证的的微信公众号,所以比较折中的方式是使用公众平台测试帐号...
    99+
    2022-06-04
    公众 详解 nodejs
  • 详解nodejs微信公众号开发——6.自定义菜单
    上一篇文章:nodejs微信公众号开发——5.素材管理接口,我们实现了新增临时素材、管理永久素材的接口,这些接口的实现,使我们能够推送多样的消息给用户。本节介绍的内容是关于自定义菜单 1. 自定义菜单的介...
    99+
    2022-06-04
    自定义 详解 公众
  • PHP开发微信公众号:如何实现自动回复
    PHP开发微信公众号:如何实现自动回复微信公众号是企业或个人通过微信平台向用户提供服务、传播信息的重要渠道之一。自动回复是微信公众号功能中的关键点之一,它可以帮助企业快速响应用户的咨询、指引用户进行相关操作,提高用户的满意度和体验。本文将介...
    99+
    2023-10-27
    PHP编程 微信公众号开发 自动回复 PHP开发微信公众号:
  • nodejs微信公众号开发之如何实现自动回复各种消息
    这篇文章主要介绍了nodejs微信公众号开发之如何实现自动回复各种消息,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1. 被动回复用户消息当...
    99+
    2024-04-02
  • nodejs微信公众号支付开发
    odeJs 微信公众号功能开发,移动端 H5页面调用微信的支付功能。这几天根据公司的需要使用 node 和 h5页面调用微信的支付功能完成支付需求。现在把开发过程重新捋一遍,以帮助更多的开发者顺利的完成微信...
    99+
    2022-06-04
    公众 nodejs
  • NodeJS实现微信公众号关注后自动回复功能
    一 实先自动回复功能的逻辑步骤   1 处理POST类型的控制逻辑,接收XML的数据包;   2 解析XML数据包(获得数据包的消息类型或者是事件类型);   3 拼装我们定义好的消息;   4 包装成XM...
    99+
    2022-06-04
    自动回复 公众 功能
  • Python开发之快速搭建自动回复微信公众号功能
    在之前的一篇文章 Python利用 AIML 和 Tornado 搭建聊天机器人微信订阅号 中用 aiml 实现了一个简单的英文聊天机器人订阅号。但是只能处理英文消息,现在用 图灵机器人 来实现一个中文的聊...
    99+
    2022-06-04
    自动回复 公众 快速
  • 详解nodejs微信公众号开发——5.素材管理接口
    上一篇文章:nodejs微信公众号开发——4.自动回复各种消息,我们实现了被动回复文字和图文,回复图片失败,因为需要先获取通过素材管理接口上传多媒体文件而得到的MediaId,这一节们就来实现素材管理的接口...
    99+
    2022-06-04
    详解 素材 公众
  • nodejs中怎么实现微信公众号开发
    今天就跟大家聊聊有关nodejs中怎么实现微信公众号开发,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1.公众平台测试帐号的使用登录微信公众平台,由...
    99+
    2024-04-02
  • 微信公众号开发入门
    实在是太折腾,太难懂了。也太坑了。 下面是这几天来,有关微信公众号的工作总结。算不上全面,只是作为一个初学者的记录,仅以备忘。 一、微信公众号开发,开发什么? 公众号与小程序不同。小程序类似手机APP...
    99+
    2023-09-03
    微信 小程序
  • 详解nodejs微信公众号开发——3.封装消息响应模块
    上一篇文章:nodejs微信公众号开发(2)自动回复,实现了简单的关注回复。采用拼接字符串的形式,并不是很方便,这里我们将其封装承接口。 1. ejs模板引擎 不使用拼接字符串的方式,那么模板引擎就是较...
    99+
    2022-06-04
    详解 模块 公众
  • 使用NodeJs 开发微信公众号(三)微信事件交互实例
    微信公众号有个规则,一旦开启了开发者模式,其他的常规功能就都必须通过接口调用完成。比如说自定义菜单功能,必须通过发送post请求的方式生成。本章就通过关注到取消关注的整个过程来谈一谈nodejs是怎么样与微...
    99+
    2022-06-04
    实例 公众 事件
  • 使用Nodejs开发微信公众号后台服务实例
    摘要: 微信,庞大的用户基数,极强的用户粘性,在近两年吸引了无数的开发者注意力。 Nodejs,近两年发展非常快的开发工具,尤其适合构建移动后台。本文就以笔者自己开发的实例,来描述如何基于Nodejs开发属...
    99+
    2022-06-04
    后台 实例 公众
  • 如何使用PHP编写微信公众号自动回复程序
    随着移动互联网的快速发展,微信已经成为了人们生活中必不可少的社交工具。而在微信公众号中,自动回复功能也是不可缺少的一部分。本文将介绍如何使用PHP编写微信公众号自动回复程序。准备工作首先,需要有一个微信公众号。如果没有的话可以去申请一个。其...
    99+
    2023-05-14
    PHP 微信公众号 自动回复程序
  • C#微信公众号开发之自定义菜单
    前言: 回顾之前的微信公众号配置和消息处理的内容,我们已经掌握了如何配置服务器与微信公众号建立连接,也掌握了通过消息管理的方式,对用户的信息进行处理,完成公众号消息回复功能,实现公众...
    99+
    2024-04-02
  • Vue如何开发Html5微信公众号
    这篇文章主要介绍了Vue如何开发Html5微信公众号,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、调起微信支付在微信浏览器里面打开H5网...
    99+
    2024-04-02
  • Java 微信公众号开发相关总结
    目录首先必须要有一个个人微信公众号效果图后台路由代码完整代码首先必须要有一个个人微信公众号 个人微信公众号相关的接口权限有限,不过用于个人学习体验一下足够了,如图: 然后进入微信...
    99+
    2024-04-02
  • 如何使用Java开发微信公众号
    这篇文章给大家介绍如何使用Java开发微信公众号,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。首先必须要有一个个人微信公众号个人微信公众号相关的接口权限有限,不过用于个人学习体验一下足够了,如图:然后进入微信公众后台,...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作