NestJS企业微信消息推送

NestJS企业微信消息推送

本篇主要是实现推送企业微信消息
消息队列和定时任务会在下一篇文章中写到,需要源码可以评论,到时候附上链接
企业微信api参考文档
nestjs官网
nestjs中文文档

1. 使用 nestjs 创建项目

# 安装nestjs
npm i -g @nestjs/cli

# 创建项目 项目名称自定义
nest new project-name

2. 创建提供者(Provider)

wechat.service.ts

import { Injectable } from '@nestjs/common';
@Injectable()
export class WechatService {
}

获取access_token,access_token是调用企业微信api的凭证,需要企业id以及应用凭证,可在企业微信后台看到

async getAssesstToken (){
        const { data } = await axios.get(`https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=${this.corpid}&corpsecret=${this.corpsecret}`)
        //console.log(data,'token')
        return data.access_token
 }

注意点:

  1. 如果没有安装axios,执行下安装命令
  2. 因为获取token在7200s左右访问得到的是同样的结果,避免无意义的请求以及接口访问限制,需要对接口做缓存处理

缓存access_token

  1. 安装node-cache
yarn add node-cache
  1. 使用
import { Injectable } from '@nestjs/common';
import axios from 'axios';
import * as NodeCache from 'node-cache'

const TokenCache = new NodeCache();
@Injectable()
export class WechatService {
    private corpid = '企业id'
    private corpsecret = '应用密钥'
    //  获取token
    async getAssesstToken (){
        if(TokenCache.get('assess_token')) return TokenCache.get('assess_token')
        const { data } = await axios.get(`https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=${this.corpid}&corpsecret=${this.corpsecret}`)
        //console.log(data,'token')
        // 设置缓存的键,数据以及时间,需要注意时间的单位是秒而不是毫秒
        TokenCache.set('assess_token',data.access_token,60 * 100)
        return data.access_token
    }
}

发送消息

更多消息类型以及具体参数信息请参考文档

async sendMessage(messageInfo?:any){
    const assess_token = await this.getAssesstToken()
    const {data} = await axios.post('https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=' + assess_token,{
        touser: 'User01', // 发送人
        msgtype : "textcard",
        agentid:this.agentid, // 应用id
        textcard: {
           title:`标题`,
           description:`描述`,
           url,
           btntxt:'查看详情'
        },
    })
    //console.log(data)
    if(data.errcode){
        return '失败'
    }else{
     return '成功'
    }
}

wechat.service.ts 完整代码

import { Injectable } from '@nestjs/common';
import axios from 'axios';
import * as NodeCache from 'node-cache'

const TokenCache = new NodeCache();

@Injectable()
export class WechatService {
    private corpid = '企业id'
    private corpsecret = '应用密钥'
    private agentid = '应用编号'

    //  获取token
    async getAssesstToken (){
        if(TokenCache.get('assess_token')) return TokenCache.get('assess_token')
        const { data } = await axios.get(`https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=${this.corpid}&corpsecret=${this.corpsecret}`)
        console.log(data,'token')
        TokenCache.set('assess_token',data.access_token,60 * 100)
        return data.access_token
    }

    // 发送企业微信消息
    async sendMessage(message?:string){
	    const assess_token = await this.getAssesstToken()
	    const {data} = await axios.post('https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=' + assess_token,{
	        touser: 'User01', // 发送人
	        msgtype : "textcard",
	        agentid:this.agentid, // 应用id
	        textcard: {
	           title:`标题`,
	           description:message || '描述',
	           url,
	           btntxt:'查看详情'
	        },
	    })
	    //console.log(data)
	    if(data.errcode){
	        return '失败'
	    }else{
	     return '成功'
	    }
	}
}

3. 依赖注入

可以再创建一个控制器和模块,整体注入到app module中
也可以只将提供者注入到app module中

@Module({
  imports: [WechatModule],//需要自己创建
  controllers: [AppController],
  providers: [WechatService],
})
export class AppModule { }

4. 使用

  1. 在主进程中
    一般不会有这种用途,只是说在main.ts中也是可以获取到提供者的实例的
import { NestFactory } from '@nestjs/core';
import { NestExpressApplication } from '@nestjs/platform-express';
import { join } from 'path';
import { AppModule } from './app.module';
import { WechatService } from './Modules/wechat/wechat.service';

const Port = 3000

async function bootstrap() {
  const app = await NestFactory.create<NestExpressApplication>(AppModule,{cors:true});
  app.useGlobalInterceptors(new LoggingInterceptor());
  app.useStaticAssets(join(__dirname, './', 'public'));
  // 获取实例
  const wechatService= app.get(WechatService ) 
  // 调用方法
  wechatService.sendMessage('123')
  await app.listen(Port);
  console.log('localhost:' + Port + ' Server Start')
}
bootstrap();  

  1. 控制器(controller)中,当对应地址被访问就会调用对应方法发送信息
import { Controller, Get, Query } from '@nestjs/common';
import { WechatService } from './wechat.service';

@Controller('wechat')
export class WechatController {
    constructor(private readonly service: WechatService) { }

    @Get('send')
    sendMessage(@Query() {message}){
        return this.service.sendMessage(message)
    }
}
上一篇:Linux Ctrl+Z的使用方法


下一篇:7.nestjs文件上传