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
}
注意点:
- 如果没有安装axios,执行下安装命令
- 因为获取token在7200s左右访问得到的是同样的结果,避免无意义的请求以及接口访问限制,需要对接口做缓存处理
缓存access_token
- 安装node-cache
yarn add node-cache
- 使用
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. 使用
- 在主进程中
一般不会有这种用途,只是说在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();
- 控制器(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)
}
}