work-wechat
Version:
企业微信(非微信企业号)集成API。
188 lines (144 loc) • 10.7 kB
JavaScript
'use strict';var _stringify = require('babel-runtime/core-js/json/stringify');var _stringify2 = _interopRequireDefault(_stringify);var _regenerator = require('babel-runtime/regenerator');var _regenerator2 = _interopRequireDefault(_regenerator);var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator');var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);var _promise = require('babel-runtime/core-js/promise');var _promise2 = _interopRequireDefault(_promise);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}
var rp = require('request-promise');
var objectAssign = require('object-assign');
var cacheManager = require('cache-manager');
var fsStore = require('cache-manager-fs');
var memoryCache = cacheManager.caching({
store: 'memory',
max: 100,
ttl: 7140,
promiseDependency: _promise2.default });
var diskCache = cacheManager.caching({
store: fsStore,
options: {
ttl: 7140,
maxsize: 1000 * 1000 * 1000,
path: 'cache',
preventfill: true },
promiseDependency: _promise2.default });
var errors = require('./lib/errors.js');
var libs = require('./lib');
/*
src/common/config/workwechat.js
workwechat: {
token: 'xxxxxxxxxxxxxxx',
corpid: 'wxe1234567890abcde',
appsecret: '1234567890abcdefghijklmnopqrstuv',
encodingAESKey: '1234567890abcdefghijklmnopqrstuvxyz12345678',
AESKey: '1PVNV80z24KmCm2U',
iv: '1572033555800355',
pathname: 'api'
}
*/
var workwechat = function workwechat(options) {
this.options = objectAssign({
pathname: 'workwechat' },
options);
this.token = this.options.token;
this.corpid = this.options.corpid;
this.appsecret = this.options.appsecret;
this.encodingAESKey = this.options.encodingAESKey;
this.access_token = {
"access_token": null,
"expires_on": 0 };
this.jsapi_ticket = {
"ticket": null,
"expires_on": 0 };
this.cache = {
get: function () {var _ref = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee(key) {var mem, disk;return _regenerator2.default.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0:_context.next = 2;return (
memoryCache.get(key));case 2:mem = _context.sent;_context.next = 5;return (
diskCache.get(key));case 5:disk = _context.sent;return _context.abrupt('return',
mem || disk);case 7:case 'end':return _context.stop();}}}, _callee, this);}));function get(_x) {return _ref.apply(this, arguments);}return get;}(),
set: function () {var _ref2 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee2(key, val) {return _regenerator2.default.wrap(function _callee2$(_context2) {while (1) {switch (_context2.prev = _context2.next) {case 0:
memoryCache.set(key, val);
diskCache.set(key, val);case 2:case 'end':return _context2.stop();}}}, _callee2, this);}));function set(_x2, _x3) {return _ref2.apply(this, arguments);}return set;}() };
//this.api_limit = api_limit;
for (var name in libs) {
this[name]();
}
};
workwechat.prototype = {
jsonpf: function jsonpf(json) {
return JSON.parse((0, _stringify2.default)(json));
},
timestamp: function timestamp(delay) {
delay = Number(delay) || 0;
return new Date().getTime() + delay * 1000;
},
aesEncrypt: function aesEncrypt(data, secretKey, iv, mode) {
secretKey = secretKey || this.options.AESKey;
mode = mode || 'aes-128-cbc';
iv = iv || this.options.iv;
var encipher = crypto.createCipheriv(mode, secretKey, iv),
encoded = encipher.update(data, 'utf8', 'hex');
encoded += encipher.final('hex');
return encoded;
},
handleError: function handleError(errcode, onlymsg) {
var errorConfig = think.parseConfig({
"key": "errcode",
"msg": "errmsg" },
think.config('error'));
var result = {};
result[errorConfig.key] = errors[errcode] && errcode || 0;
result[errorConfig.msg] = errors[errcode] || "";
if (onlymsg) {
return result[errorConfig.msg];
}
return result;
},
/**
* get request
* @return {Promise} []
*/
get: function () {var _ref3 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee3(path, content) {var method = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'GET';var refresh = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;var _self, options, opt, token, data;return _regenerator2.default.wrap(function _callee3$(_context3) {while (1) {switch (_context3.prev = _context3.next) {case 0:
_self = this;
path = path.replace('CORPID', _self.corpid).replace('APPSECRET', _self.appsecret);
content = content || '';
options = {
url: 'https://qyapi.weixin.qq.com' + path,
method: method,
agent: false,
rejectUnauthorized: false,
body: content,
json: true };
opt = options;
//var api_name = path.replace('/cgi-bin/', '').replace(/\?.*/, '').split('/').join('_');
if (!/ACCESS_TOKEN/.test(opt.url)) {_context3.next = 14;break;}_context3.next = 8;return (
_self.accessToken(refresh));case 8:token = _context3.sent;if (!
token.access_token) {_context3.next = 13;break;}
opt.url = opt.url.replace('ACCESS_TOKEN', token.access_token);_context3.next = 14;break;case 13:return _context3.abrupt('return',
token);case 14:_context3.next = 16;return (
rp(opt));case 16:data = _context3.sent;if (!(
data && data.errcode == 40001)) {_context3.next = 19;break;}return _context3.abrupt('return',
_self.get(path, content, method, true));case 19:if (!(
data && data.errcode)) {_context3.next = 21;break;}return _context3.abrupt('return',
_self.handleError(data.errcode));case 21:return _context3.abrupt('return',
data);case 22:case 'end':return _context3.stop();}}}, _callee3, this);}));function get(_x4, _x5, _x6, _x7) {return _ref3.apply(this, arguments);}return get;}(),
/**
* post request
* @return {Promise} []
*/
post: function () {var _ref4 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee4(path, content) {return _regenerator2.default.wrap(function _callee4$(_context4) {while (1) {switch (_context4.prev = _context4.next) {case 0:return _context4.abrupt('return',
this.get(path, content, 'POST'));case 1:case 'end':return _context4.stop();}}}, _callee4, this);}));function post(_x10, _x11) {return _ref4.apply(this, arguments);}return post;}(),
/**
* get access_token
* @return {String} []
*/
accessToken: function () {var _ref5 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee5(refresh) {var token;return _regenerator2.default.wrap(function _callee5$(_context5) {while (1) {switch (_context5.prev = _context5.next) {case 0:_context5.t1 =
!refresh && this.access_token.expires_on > this.timestamp() && this.access_token;if (_context5.t1) {_context5.next = 8;break;}_context5.t2 =
!refresh;if (!_context5.t2) {_context5.next = 7;break;}_context5.next = 6;return this.cache.get('access_token');case 6:_context5.t2 = _context5.sent;case 7:_context5.t1 = _context5.t2;case 8:_context5.t0 = _context5.t1;if (_context5.t0) {_context5.next = 13;break;}_context5.next = 12;return (
this.get('/cgi-bin/gettoken?corpid=CORPID&corpsecret=APPSECRET'));case 12:_context5.t0 = _context5.sent;case 13:token = _context5.t0;
if (token.access_token) {
if (token.expires_in) {
token.expires_in = 0;
token.expires_on = this.timestamp(7140);
this.cache.set('access_token', token);
}
this.access_token = token;
}return _context5.abrupt('return',
token);case 16:case 'end':return _context5.stop();}}}, _callee5, this);}));function accessToken(_x12) {return _ref5.apply(this, arguments);}return accessToken;}() };
for (var name in libs) {
workwechat.prototype[name] = libs[name];
}
module.exports = workwechat;