xiongzhu 2 anos atrás
pai
commit
38c2d98728

+ 18 - 0
src/weixin/entities/accessToken.entity.ts

@@ -0,0 +1,18 @@
+import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm'
+
+@Entity()
+export class AccessToken {
+    @PrimaryGeneratedColumn()
+    id: number
+
+    @Column()
+    accessToken: string
+
+    @Column()
+    expireAt: Date
+
+    constructor(accessToken: string, expireAt: Date) {
+        this.accessToken = accessToken
+        this.expireAt = expireAt
+    }
+}

+ 11 - 3
src/weixin/weixin.controller.ts

@@ -1,4 +1,12 @@
-import { Controller } from '@nestjs/common';
+import { Controller, Get } from '@nestjs/common'
+import { WeixinService } from './weixin.service'
 
-@Controller('weixin')
-export class WeixinController {}
+@Controller('/weixin')
+export class WeixinController {
+    constructor(private readonly weixinService: WeixinService) {}
+
+    @Get('/accessToken')
+    public async getAccessToken() {
+        return await this.weixinService.getAccessToken()
+    }
+}

+ 10 - 5
src/weixin/weixin.module.ts

@@ -1,9 +1,14 @@
-import { Module } from '@nestjs/common';
-import { WeixinController } from './weixin.controller';
-import { WeixinService } from './weixin.service';
+import { Module } from '@nestjs/common'
+import { WeixinController } from './weixin.controller'
+import { WeixinService } from './weixin.service'
+import weixinConfig from './weixin.config'
+import { ConfigModule } from '@nestjs/config'
+import { TypeOrmModule } from '@nestjs/typeorm'
+import { AccessToken } from './entities/accessToken.entity'
 
 @Module({
-  controllers: [WeixinController],
-  providers: [WeixinService]
+    imports: [ConfigModule.forFeature(weixinConfig), TypeOrmModule.forFeature([AccessToken])],
+    controllers: [WeixinController],
+    providers: [WeixinService]
 })
 export class WeixinModule {}

+ 45 - 2
src/weixin/weixin.service.ts

@@ -1,4 +1,47 @@
-import { Injectable } from '@nestjs/common';
+import { Inject, Injectable } from '@nestjs/common'
+import weixinConfig from './weixin.config'
+import { ConfigType } from '@nestjs/config'
+import { ApiConfig, ApiConfigKit, AccessTokenApi } from 'tnwx'
+import { InjectRepository } from '@nestjs/typeorm'
+import { AccessToken } from './entities/accessToken.entity'
+import { LessThan, Not, Repository } from 'typeorm'
+import { addSeconds } from 'date-fns'
 
 @Injectable()
-export class WeixinService {}
+export class WeixinService {
+    constructor(
+        @Inject(weixinConfig.KEY)
+        private readonly weixinConfiguration: ConfigType<typeof weixinConfig>,
+        @InjectRepository(AccessToken)
+        private readonly accessTokenRepository: Repository<AccessToken>
+    ) {
+        let apiConfig = new ApiConfig(weixinConfiguration.appId, weixinConfiguration.appSecret, '')
+        ApiConfigKit.putApiConfig(apiConfig)
+        // 开启开发模式,方便调试
+        ApiConfigKit.devMode = true
+        // 设置当前应用
+        ApiConfigKit.setCurrentAppId(apiConfig.getAppId)
+    }
+
+    async getAccessToken() {
+        let accessToken = await this.accessTokenRepository.findOneBy({
+            expireAt: LessThan(new Date())
+        })
+        if (accessToken) {
+            if (accessToken.expireAt.getTime() - new Date().getTime() < 600 * 1000) {
+                this.refreshAccessToken()
+            }
+            return accessToken.accessToken
+        }
+        return await this.refreshAccessToken()
+    }
+
+    async refreshAccessToken() {
+        const res = await AccessTokenApi.getAccessToken()
+        const newToken = await this.accessTokenRepository.save(
+            new AccessToken(res.getAccessToken, addSeconds(new Date(), res.getExpiresIn - 300))
+        )
+        await this.accessTokenRepository.delete({ id: Not(newToken.id) })
+        return newToken.accessToken
+    }
+}