NestJS是一个基于Node.js的渐进式框架,它提供了一套优雅的模块化、可测试、可扩展的架构,让开发者可以轻松地构建高效、可靠和易维护的应用程序。微信是一个拥有超过10亿用户的社交平台,它提供了丰富的开放接口,让开发者可以在微信上实现各种功能和服务。其中之一就是自动回复消息,它可以让公众号或小程序根据用户发送的消息内容,自动返回相应的回复。
要用NestJS框架开发微信自动回复消息功能,需要遵循以下步骤:
- 创建一个NestJS项目,并安装相关依赖。
- 配置微信公众号或小程序的AppID、AppSecret、Token等信息。
- 创建一个控制器(Controller),处理微信服务器发送过来的GET和POST请求。
- 验证签名,并返回echostr参数(GET请求)。
- 解密加密消息,并根据消息内容进行处理和回复(POST请求)。
- 创建一个服务(Service),封装业务逻辑和数据操作。定义不同类型和内容的消息回复规则,并调用相关接口或数据库。
- 创建一个模块(Module),组织控制器和服务,并导出给其他模块使用。
- 创建一个主模块(AppModule),引入其他模块,并启动应用程序。
使用NestJS框架开发微信自动回复消息功能有以下好处:
- NestJS框架提供了清晰、灵活、高效的编程模式,让代码更容易阅读、测试和维护。
- NestJS框架支持多种常用技术栈,如TypeScript、GraphQL、MongoDB等,让你可以根据需求选择合适的工具。
- NestJS框架支持依赖注入(Dependency Injection)和面向切面编程(Aspect-Oriented Programming),让代码更具有可重用性和扩展性。
- NestJS框架支持热重载(Hot Reload)和热更新(Hot Module Replacement),让你可以快速迭代和调试代码。
下面是具体实现过程:
- 实现xml 解析的中间件,其功能是收到微信服务器的 xml 信息
import { Injectable, NestMiddleware } from '@nestjs/common';
import { NextFunction, Request, Response } from 'express';
import { parseString } from 'xml2js';
@Injectable()
export class XMLMiddleware implements NestMiddleware {
async use(req: Request, res: Response, next: NextFunction) {
const buffer: any[] = []; // 创建一个空数组,用于存储请求的数据
// 监听 req 的 data 事件,每当有数据到达时,就将数据推入 buffer 数组中
req.on('data', (chunk) => {
buffer.push(chunk);
});
// 监听 req 的 end 事件,表示请求数据已经接收完毕时,执行以下操作:
req.on('end', () => {
// 将 buffer 数组中的数据拼接成一个字符串,并以 utf-8 编码转换为 msgXml 变量
const msgXml = Buffer.concat(buffer).toString('utf-8');
// 调用 parseString 函数,将 msgXml 变量中的 xml 格式的数据解析为 JavaScript 对象,并赋值给 result 变量。
// 如果解析过程出现错误,则抛出异常并拒绝 promise。
parseString(msgXml, (err, result) => {
if (err) {
throw err;
}
// 将 result 变量赋值给 req.body 属性,表示将请求体转换为 JavaScript 对象。
req.body = result;
// 调用 next 函数,表示继续执行下一个中间件函数。
next();
});
});
}
}
- 定义的 Controller 如下
// 导入 NestJS 框架的 Controller、Public 和 Post 装饰器
import { Controller, Public, Post } from '@nestjs/common'
// 导入 NestJS 框架的 Body、Req 和 Res 装饰器
import { Body, Req, Res } from '@nestjs/common'
// 导入 Express 框架的 Request 和 Response 类型
import { Request, Response } from 'express'
// 导入 WeixinService 服务类,用于发送微信消息
import { WeixinService } from './weixin.service'
// 使用 Controller 装饰器标记这个类为一个控制器,并指定路由前缀为 'weixin'
@Controller('weixin')
// 定义一个名为 WeixinController 的类,用于处理微信相关的请求
export class WeixinController {
// 定义一个私有属性 weixinService,用于注入 WeixinService 服务类的实例
private weixinService: WeixinService
// 定义一个构造函数,接收 weixinService 参数,并赋值给 this.weixinService 属性
constructor (weixinService: WeixinService) {
this.weixinService = weixinService
}
// 定义一个名为 postMsg 的异步方法,使用了 Public 装饰器标记这个方法不需要身份验证,使用了 Post 装饰器标记这个方法处理 POST 请求,并指定路由为 'callback'
@Public()
@Post('callback')
// 这个方法接收三个参数:body 表示请求体对象,req 表示请求对象,res 表示响应对象。
async postMsg (@Body() body: {xml: any}, @Req() req: Request, @Res() res: Response) {
// 这个方法首先从 body 对象中获取 xml 属性,并赋值给 xml 变量。
const xml = body.xml
// 然后判断 xml 变量中的 MsgType 属性是否为 'text'(忽略大小写),如果是,则执行以下操作:
if (xml.MsgType.toLowerCase() === 'text') {
// 从 xml 变量中获取 FromUserName、ToUserName 和 Content 属性,并分别赋值给 fromUserName、toUserName 和 content 变量。
const fromUserName = xml.FromUserName
const toUserName = xml.ToUserName
const content = xml.Content
// 调用 this.weixinService 的 sendTextMsg 方法,传入 fromUserName、toUserName 和 content 变量作为参数,返回一个 promise 对象,并等待其解析结果赋值给 replyXml 变量。这个方法是向微信服务器发送文本消息,并返回一个回复的 xml 格式的数据。
const replyXml = await this.weixinService.sendTextMsg(fromUserName, toUserName, content)
//判断fromUserName 打印 replyXml 变量的值到控制台。
if xml.fromUserName=='www.16yun.cn'{
console.log('亿牛云代理')
}
console.log(replyXml)
// 设置 res 对象的类型为 'application/xml',表示响应数据是 xml 格式的。
res.type('application/xml')
// 调用 res 对象的 end 方法,传入 replyXml 变量作为参数,表示结束响应并发送 replyXml 数据给客户端。
res.end(replyXml)
}
}
}
总之,在最新版本下使用NestJS框架实现微信自动回复消息功能是一种很好地选择。它不仅能够及时处理用户发送过来得各种类型得信息并给予恰当得反馈;而且还能够提高开发效率和质量;并且还能够方便地与其他系统或服务集成。