From 42df8debb081c221ea70f7c397a1f0e1e434934b Mon Sep 17 00:00:00 2001 From: zhl Date: Thu, 6 Apr 2023 10:11:13 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BC=81=E4=B8=9A=E5=BE=AE?= =?UTF-8?q?=E4=BF=A1=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controllers/workflow.controller.ts | 24 +++++------- src/services/WechatWorkService.ts | 53 ++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 15 deletions(-) create mode 100644 src/services/WechatWorkService.ts diff --git a/src/controllers/workflow.controller.ts b/src/controllers/workflow.controller.ts index 58a4f86..1a3564c 100644 --- a/src/controllers/workflow.controller.ts +++ b/src/controllers/workflow.controller.ts @@ -1,27 +1,20 @@ import BaseController from 'common/base.controller' import { ZError } from 'common/ZError' import { role, router } from 'decorators/router' -import { aesDecrypt, base64Decode, sha1 } from 'utils/security.util' import { getSignature, decrypt } from '@wecom/crypto' -let signData = function (timestamp, nonce, echostr, token) { - let hashStr = [timestamp, nonce, echostr, token].sort().join('') - return sha1(hashStr) -} - -const TOKEN = 'qDd25AkMStj6mI9ViNUQt' -const AES_KEY = 'rk7nvsNobBx3aG9jMSTlKc1gMj4GIPDrWs4ZMdlgP4V' - class WorkFlowController extends BaseController { @role('anon') @router('get /workflow/notify') - async sendOneMail(req, res) { + async wxNotifyCheck(req, res) { + const token = process.env.WX_TOKEN + const aesKey = process.env.WX_AES_KEY let { msg_signature, timestamp, nonce, echostr } = req.params - const signature = getSignature(TOKEN, timestamp, nonce, echostr) + const signature = getSignature(token, timestamp, nonce, echostr) if (msg_signature !== signature) { throw new ZError(10, 'sign check failed') } - const { message, id } = decrypt(AES_KEY, echostr) + const { message, id } = decrypt(aesKey, echostr) res.send(message) } @@ -29,12 +22,13 @@ class WorkFlowController extends BaseController { @router('post /workflow/notify') async flowNotify(req, res) { let { msg_signature, timestamp, nonce, xml } = req.params - console.log(xml) - const signature = getSignature(TOKEN, timestamp, nonce, xml.Encrypt) + const token = process.env.WX_TOKEN + const aesKey = process.env.WX_AES_KEY + const signature = getSignature(token, timestamp, nonce, xml.Encrypt) if (msg_signature !== signature) { throw new ZError(10, 'sign check failed') } - const { message, id } = decrypt(AES_KEY, xml.Encrypt) + const { message, id } = decrypt(aesKey, xml.Encrypt) console.log(id) console.log(message) res.send('success') diff --git a/src/services/WechatWorkService.ts b/src/services/WechatWorkService.ts new file mode 100644 index 0000000..ccb7cb4 --- /dev/null +++ b/src/services/WechatWorkService.ts @@ -0,0 +1,53 @@ +import { singleton } from 'decorators/singleton' + +const WX_API_HOST = 'https://qyapi.weixin.qq.com' +@singleton +export class WechatWorkService { + private accessToken: string + private tokenExpire: number + private wxToken: string + private wxAesKey: string + private wxCorpId: string + private wxCorpSecret: string + + constructor() { + this.wxToken = process.env.WX_TOKEN + this.wxAesKey = process.env.WX_AES_KEY + this.wxCorpId = process.env.WX_CORP_ID + this.wxCorpSecret = process.env.WX_CORP_SECRET + } + + /** + * 获取微信企业号的access_token + * https://developer.work.weixin.qq.com/resource/devtool + */ + public async refreshAccessToken() { + const url = `${WX_API_HOST}/cgi-bin/gettoken` + // use axios get url + let config = { + method: 'get', + maxBodyLength: Infinity, + url, + } + let response = await axios.request(config).then(response => { + return response.data + }) + } + /** + * 获取审批申请详情 + * https://developer.work.weixin.qq.com/devtool/interface/alone?id=18615 + * @param spNo 审批单号 + */ + public async fetchApprovalDetail(spNo: string) { + const url = `${WX_API_HOST}/cgi-bin/oa/getapprovaldetail` + } + + /** + * 根据media_id获取文件 + * https://developer.work.weixin.qq.com/devtool/interface/alone?id=18615 + * @param mediaId + */ + public async fetchFile(mediaId: string) { + const url = `${WX_API_HOST}/cgi-bin/media/get` + } +}