123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255 |
- 'use strict';
- // 企业微信一些方法
- const axios = require('axios');
- class wxWork {
- constructor(ctx) {
- this.ctx = ctx;
- }
- async setSuiteTicket(suite_ticket) {
- return await this.ctx.app.redis.set('suite_ticket', suite_ticket, 'EX', 1800);// 最多半小时有效期,企业微信会自动请求刷新获取
- }
- async getSuiteTicket() {
- try {
- const suite_ticket = this.ctx.app.redis.get('suite_ticket');
- if (!suite_ticket) {
- throw '还没有设置过';
- }
- return suite_ticket;
- } catch (error) {
- console.log(error);
- return false;
- }
- }
- async getSuiteAccessToken() {
- const suite_access_token = await this.ctx.app.redis.get('suite_access_token');
- if (!suite_access_token) {
- const suite_ticket = await this.getSuiteTicket();
- const post_data = {
- suite_id: this.ctx.app.config.qywx.suiteID,
- suite_secret: this.ctx.app.config.qywx.suiteSecret,
- suite_ticket,
- };
- // const response = await this.ctx.helper.sendRequest('https://qyapi.work.weixin.qq.com/cgi-bin/service/get_suite_token', post_data, 'POST');
- // console.log(response);
- const { data } = await axios.post('https://qyapi.weixin.qq.com/cgi-bin/service/get_suite_token', post_data);
- const { suite_access_token, expires_in } = data;
- if (suite_access_token) {
- await this.ctx.app.redis.set('suite_access_token', suite_access_token, 'EX', expires_in);// 最多两个小时有效期
- return suite_access_token;
- }
- }
- return suite_access_token;
- }
- async savePermanentCode(temporary_code) {
- return await this.ctx.app.redis.set('temporary_code', temporary_code, 'EX', 600);// 最多10分钟有效期,企业信息要入库
- }
- // 设置永久授权码(代开发授权凭证)
- async setPermanentCode() {
- const temporary_code = await this.ctx.app.redis.get('temporary_code');
- if (!temporary_code) {
- console.log('不存在授权码');
- return false;
- }
- const suite_access_token = await this.getSuiteAccessToken();
- const { data } = await axios.post(`https://qyapi.weixin.qq.com/cgi-bin/service/get_permanent_code?suite_access_token=${suite_access_token}`, {
- auth_code: temporary_code,
- });
- const {
- permanent_code,
- auth_corp_info,
- auth_user_info,
- auth_info,
- } = data;
- if (permanent_code) {
- const agentid = auth_info.agent[0].agentid;
- const result = await this.ctx.service.wxWork.insertCorp(permanent_code, agentid, auth_corp_info, auth_user_info);
- console.log(result, permanent_code, agentid, auth_corp_info, auth_user_info);
- console.log(auth_corp_info.corp_name + ' 授权企业成功');
- await this.ctx.app.redis.del('temporary_code');
- return result;
- }
- console.error('获取永久授权码失败', data);
- return false;
- }
- // 读取企业的通讯录 access_token
- async getCorpTxlAccessToken(corpID) {
- try {
- let token = await this.ctx.app.redis.get(`${corpID}_txl_access_token`);
- if (!token) {
- const corpInfo = await this.ctx.service.wxWork.getDataByCondition({ corpid: corpID });
- if (!corpInfo) {
- throw '未绑定该企业';
- }
- const { data } = await axios.get(`https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=${corpID}&corpsecret=8SZKdgpUICzj9ImEjrqHHVCD6NxEpgWqkoEb0KzzG40`);
- const { access_token, expires_in } = data;
- if (!access_token) {
- throw '获取 corp_access_token 失败';
- }
- await this.ctx.app.redis.set(`${corpID}_txl_access_token`, access_token, 'EX', expires_in);
- token = access_token;
- }
- return token;
- } catch (e) {
- console.log(e);
- return null;
- }
- }
- // 读取企业的 access_token
- async getCorpAccessToken(corpID) {
- try {
- let token = await this.ctx.app.redis.get(`${corpID}_access_token`);
- if (!token) {
- const corpInfo = await this.ctx.service.wxWork.getDataByCondition({ corpid: corpID });
- if (!corpInfo) {
- throw '未绑定该企业';
- }
- const { data } = await axios.get(`https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=${corpID}&corpsecret=${corpInfo.permanent_code}`);
- const { access_token, expires_in } = data;
- if (!access_token) {
- throw '获取 corp_access_token 失败';
- }
- await this.ctx.app.redis.set(`${corpID}_access_token`, access_token, 'EX', expires_in);
- token = access_token;
- }
- return token;
- } catch (e) {
- console.log(e);
- return null;
- }
- }
- // 读取企业用户信息, 只获取一次
- async getCorpUser(token, code) {
- try {
- const { data: user_data } = await axios.get(`https://qyapi.weixin.qq.com/cgi-bin/auth/getuserinfo?access_token=${token}&code=${code}`);
- if (user_data.errcode !== 0) {
- throw '获取企业微信用户信息失败';
- }
- const user_ticket = user_data.user_ticket;
- const { data: user_detail_data } = await axios.post(`https://qyapi.weixin.qq.com/cgi-bin/auth/getuserdetail?access_token=${token}`, {
- user_ticket,
- });
- if (user_detail_data.errcode !== 0) {
- throw '获取企业微信用户详细信息失败';
- }
- const user_info = {
- userid: user_data.userid,
- avatar: user_detail_data.avatar !== undefined ? user_detail_data.avatar : null,
- gender: user_detail_data.gender !== undefined ? user_detail_data.gender : null,
- };
- return user_info;
- } catch (e) {
- console.log(e);
- return null;
- }
- }
- // 读取企业用户信息
- async getCorpUserCommonData(token, userid, corpID) {
- try {
- const { data: user_common_data } = await axios.get(`https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token=${token}&userid=${userid}`);
- if (user_common_data.errcode !== 0) {
- throw '获取企业微信用户详细信息失败';
- }
- const corpInfo = await this.ctx.service.wxWork.getDataByCondition({ corpid: corpID });
- const user_info = {
- userid: user_common_data.userid,
- name: user_common_data.name,
- department: user_common_data.department,
- position: user_common_data.position,
- company: corpInfo.corp_name,
- };
- return user_info;
- } catch (e) {
- console.log(e);
- return null;
- }
- }
- // 获取通讯录
- async getUserList(corpid) {
- const token = await this.getCorpTxlAccessToken(corpid);
- const { data: user_data } = await axios.post(`https://qyapi.weixin.qq.com/cgi-bin/user/list_id?access_token=${token}`);
- console.log(user_data, user_data.dept_user);
- return user_data.dept_user;
- }
- // 发送模板卡片信息
- async sendTemplateCard(userids, corpid, title, desc, content, url = '', btntxt = null) {
- try {
- const corpInfo = await this.ctx.service.wxWork.getDataByCondition({ corpid });
- if (!corpInfo) {
- throw '该企业不存在';
- }
- const token = await this.getCorpAccessToken(corpid);
- const templateCard = {
- card_type: 'text_notice',
- main_title: {
- title,
- desc,
- },
- horizontal_content_list: content,
- };
- if (btntxt) {
- templateCard.jump_list = {
- type: 1,
- title: btntxt,
- url,
- };
- }
- templateCard.card_action = {
- type: 1,
- url,
- };
- const data = await axios.post(`https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=${token}`, {
- touser: userids.join('|'),
- msgtype: 'template_card',
- agentid: corpInfo.agentid,
- template_card: templateCard,
- });
- console.log(data);
- return data;
- } catch (e) {
- console.log(e);
- return null;
- }
- }
- // 发送文本卡片信息
- async sendTextCard(userids, corpid, title, content, url = '', btntxt = null) {
- try {
- const corpInfo = await this.ctx.service.wxWork.getDataByCondition({ corpid });
- if (!corpInfo) {
- throw '该企业不存在';
- }
- const token = await this.getCorpAccessToken(corpid);
- const textCard = {
- title,
- description: content,
- };
- if (url) textCard.url = url ? url : '';
- if (btntxt) textCard.btntxt = btntxt;
- const data = await axios.post(`https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=${token}`, {
- touser: userids.join('|'),
- msgtype: 'textcard',
- agentid: corpInfo.agentid,
- textcard: textCard,
- });
- console.log(data);
- return data;
- } catch (e) {
- console.log(e);
- return null;
- }
- }
- }
- module.exports = wxWork;
|