前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >NestJS对接微信公众号(一)配置服务器验证

NestJS对接微信公众号(一)配置服务器验证

原创
作者头像
一起重学前端
发布2024-11-24 11:19:51
发布2024-11-24 11:19:51
1850
举报

好文推荐: 职场上如何带新人

文章地址:https://cloud.tencent.com/developer/article/2468891

文章从三个方面介绍如何让新人快速融入团队。带新就如同在与另一个过去的自己对视,去挖掘彼此的闪光点是个挺不错的好习惯。

前言

最近想把之前的微信表情,转换成图片保存下来发送到另一个app当作表情包使用,但是安卓微信没办法直接将表情当做图片保存。在网上搜索一些解决方案。通过微信公众号接收表情-->通过后端生成图片(png、gif)-->通过H5&小程序链接获取图片。感觉挺有趣的,微信公众号有吧,服务器有吧,好的,那就说干就干

一、准备工作

注册微信公众号:你需要有一个已注册的微信公众号,且具备相应的开发者权限,获取到公众号的 AppID 和 AppSecret,这两个参数后续会用到。

创建 NestJS 项目:通过 nest init 命令初始化一个 NestJS 项目(假设你已经安装了 NestJS 的脚手架工具),或者使用已有的 NestJS 项目进行开发。

二、安装依赖

在项目目录下安装 express 和 xml2js 等相关依赖,因为微信公众号服务器验证及消息交互涉及到处理 XML 格式的数据以及基于 Express 风格的中间件机制(NestJS 可以很好地兼容 Express 中间件)。

代码语言:bash
复制
npm install express xml2js

三、配置服务器验证中间件

微信公众号开发前必读、入门指引

创建微信公众号配置服务

在 NestJS 项目中创建一个服务来处理微信公众号相关的配置和验证逻辑,例如创建 wechat.service.ts 文件:

代码语言:typescript
复制
import { Injectable } from '@nestjs/common';
import * as crypto from 'crypto';
import { Request, Response, NextFunction } from 'express';

@Injectable()
export class WechatService {
  // TODO:  Token:自主设置,这个token与公众平台wiki中常提的access_token不是一回事。这个token只用于验证开发者服务器。
  private readonly token = 'YOUR_TOKEN'; // 替换为你在微信公众号后台设置的 Token

  checkSignature(req: Request, res: Response, next: NextFunction) {
    const signature = req.query.signature as string;
    const timestamp = req.query.timestamp as string;
    const nonce = req.query.nonce as string;
    const echostr = req.query.echostr as string;

    const array = [this.token, timestamp, nonce].sort();
    const str = array.join('');
    const hash = crypto.createHash('sha1');
    hash.update(str);
    const result = hash.digest('hex');

    if (result === signature) {
      res.send(echostr);
    } else {
      res.status(403).send('Forbidden');
    }
  }
}

这里的 Token 需要和你在微信公众号后台配置服务器时填写的 Token 保持一致,此逻辑用于验证微信服务器发送过来的请求是否合法。注意:Token自主设置,这个token与公众平台wiki中常提的access_token不是一回事。这个token只用于验证开发者服务器。与微信开发平台配置Token一致,详细见下图

创建中间件并应用到 NestJS 应用中创建一个中间件文件,例如 wechat.middleware.ts,将上述服务中的验证逻辑包装成中间件:

代码语言:typescript
复制
import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response, NextFunction } from 'express';
import { WechatService } from './wechat.service';

@Injectable()
export class WechatMiddleware implements NestMiddleware {
  constructor(private readonly wechatService: WechatService) {}

  use(req: Request, res: Response, next: NextFunction) {
    this.wechatService.checkSignature(req, res, next);
  }
}

然后在 main.ts 文件中应用这个中间件:

代码语言:typescript
复制
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { WechatMiddleware } from './wechat.middleware';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.use('/wechat', new WechatMiddleware(app.get(WechatService)).use);
  await app.listen(3000);
}

bootstrap();

这里将中间件应用到了 /wechat 这个路径下,意味着微信公众号服务器发送过来的验证请求会被这个中间件拦截并处理,你需要根据实际情况调整这个路径。

四、在微信公众号后台配置服务器信息

登录微信公众号后台,进入 “开发” - “基本配置” 页面。

在 “服务器配置” 板块中,填写服务器地址(例如 https://nideyumin.com/wechat,要与上述在 NestJS 应用中配置中间件应用的路径相对应)、Token(和代码中设置的一致)、EncodingAESKey(可以随机生成)等信息。

点击 “提交” 按钮,微信公众号会向你填写的服务器地址发送验证请求,若上述代码中的验证逻辑正确,配置就能成功提交,完成服务器验证对接。

这样就完成了 NestJS 与微信公众号的服务器验证对接,后续可以继续开发处理微信公众号消息推送、自定义菜单等更多功能,都是基于这个验证通过的基础上进行拓展的。

未完待续,后面准备接收表情生产图片,持续更新中...

感谢关注点赞评论~

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 一、准备工作
  • 二、安装依赖
  • 三、配置服务器验证中间件
  • 四、在微信公众号后台配置服务器信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档