forked from wengqianshan/dingtalk-node
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
155 lines (146 loc) · 4.01 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
var request = require('request');
var qs = require('qs');
var _ = require('lodash');
var apis = require('./apis');
var token;
var tokenCreateTime;
var tokenExpireTime = 7200 * 1000;
/**
* 日志封装,方便后期日志多样化处理
**/
function log() {
args = Array.prototype.slice.call(arguments);
console.log(args)
}
function App(config) {
var defaults = {
domain: 'https://oapi.dingtalk.com',
cid: 'CorpID',
secret: 'CorpSecret',
redirect_uri: 'REDIRECT_URI'
};
this.config = _.merge(defaults, config);
}
/**
* 获取token
* @param {function} callback 回调
* @returns {null}
**/
App.prototype.getToken = function(callback) {
//log('获取token')
var cid = this.config.cid;
var secret = this.config.secret;
request({
method: 'GET',
url: this.config.domain + '/gettoken',
json: true,
qs: {
corpid: cid,
corpsecret: secret
}
}, function(err, response, body) {
if (err) {
//log('出错了', err);
return callback(err);
}
//log('返回数据', body);
var json = body;
var errcode = json.errcode;
if (errcode !== 0) {
//log(json);
}
token = json.access_token;
tokenCreateTime = Date.now();
callback(err, json);
})
}
/**
* 统一请求接口
* @param {string} path 请求路径,bui自动拼接成完整的url
* @param {object} params 请求参数集合
* @param {function} callback 回调,请求成功与否都会触发回调,成功回调会回传数据
* @returns {null}
**/
App.prototype.doRequest = function(path, params, callback) {
var _this = this;
var action = function(t) {
var url = _this.config.domain + '/' + path;
if (t) {
url += '?access_token=' + t;
}
var method = 'GET';
if (params.method === 'POST') {
delete params.method;
method = 'POST';
}
var obj = {
method: method,
url: url,
json: true
};
if (method === 'POST') {
obj.body = params;
} else {
obj.qs = params;
}
//log('请求参数:', obj)
request(obj, function(err, response, body) {
if (err) {
//log('出错了', err);
return callback(err);
}
//log('返回数据', body);
var json = body;
var errcode = json.errcode;
if (errcode !== 0) {
//log(json);
}
callback(err, json);
})
};
//支持已经获取access_token的情况
if (params.access_token) {
var _token = params.access_token;
delete params.access_token;
return action(_token);
}
//如果有判断三种情况:1token没过期; 2不检查token; 3token过期或者没有设置token等情况
if ((token && tokenCreateTime && (Date.now() - tokenCreateTime < tokenExpireTime))) {
action(token);
} else {
//log('token过期或者未设置')
this.getToken(function(err, json) {
if (err) {
return callback(err);
}
action(json.access_token);
});
}
}
/**
* 批量生成接口
**/
apis.forEach(function(item) {
var p = item.path;
var method = item.method;
var alias = item.alias;
var functionName = _.camelCase(alias || p);
App.prototype[functionName] = function(params, callback) {
if (_.isFunction(params)) {
callback = params;
params = {};
}
var params = params || {};
var callback = callback || function() {};
if (method === 'POST') {
params.method = 'POST';
}
this.doRequest(p, params, function(err, json) {
if (err) {
//log('获取数据失败');
}
callback(err, json);
});
}
});
module.exports = App;