| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253 | 
							- '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,
 
-             });
 
-             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,
 
-             });
 
-             return data;
 
-         } catch (e) {
 
-             console.log(e);
 
-             return null;
 
-         }
 
-     }
 
- }
 
- module.exports = wxWork;
 
 
  |