Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 7 additions & 8 deletions lib/Api.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,15 @@ var Promise = require('bluebird');
var util = require('./util');
var config = require('./config');
var Request = require('./Request');
var YhsdParamError = require('./Error').YhsdParamError;

var reqCountMap = {};
paramError = new Error('缺少参数');
promiseError = new Error('`getRequestCount`和`saveRequestCount`必须是 function');

function check(option) {
if (option &&
(option.getRequestCount || option.saveRequestCount) &&
(!util.isFunction(option.getRequestCount) || !util.isFunction(option.saveRequestCount))) {
throw promiseError;
throw new YhsdParamError('option.getRequestCount 和 option.saveRequestCount 必须是函数!');;
}
}

Expand Down Expand Up @@ -65,7 +64,7 @@ var reqCountWrap = function (token, fn) {
*/
var Api = function (token, option) {
if (arguments.length < 1) {
throw paramError;
throw new YhsdParamError(['token', 'option']);
}
check(option);

Expand All @@ -91,7 +90,7 @@ Api.prototype = {
*/
get: function (path, query) {
if (arguments.length < 1) {
throw paramError;
throw new YhsdParamError(['path', 'query']);
}
return this.request('GET', query ? path + '?' + querystring.stringify(query) : path, null);
},
Expand All @@ -103,7 +102,7 @@ Api.prototype = {
*/
put: function (path, data) {
if (arguments.length < 2) {
throw paramError;
throw new YhsdParamError(['path', 'data']);
}
return this.request('PUT', path, data);
},
Expand All @@ -115,7 +114,7 @@ Api.prototype = {
*/
post: function (path, data) {
if (arguments.length < 2) {
throw paramError;
throw new YhsdParamError(['path', 'data']);
}
return this.request('POST', path, data);
},
Expand All @@ -126,7 +125,7 @@ Api.prototype = {
*/
delete: function (path) {
if (arguments.length < 1) {
throw paramError;
throw new YhsdParamError(['path']);
}
return this.request('DELETE', path, null);
},
Expand Down
24 changes: 16 additions & 8 deletions lib/Auth.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@ var querystring = require('querystring');
var crypto = require('crypto');
var config = require('./config');
var Request = require('./Request');
var YhsdError = require('./Error').YhsdError;
var YhsdParamError = require('./Error').YhsdParamError;
var timeOffset = 1000 * 60 * 10;
var paramError = new Error('缺少参数');

/**
* 构造函数
Expand All @@ -20,11 +21,11 @@ var paramError = new Error('缺少参数');
*/
var Auth = function (options) {
if (arguments.length < 1 || !options.appKey || !options.appSecret) {
throw paramError;
throw new YhsdParamError(['options.appKey', 'options.appSecret']);
}
if (!options.private) {
if (!options.callbackUrl) {
throw paramError;
throw new YhsdParamError(['options.callbackUrl']);
}
options.scope || (options.scope = ['read_basic']);
}
Expand All @@ -50,7 +51,7 @@ Auth.prototype = {
*/
verifyHmac: function (queryObj) {
if (arguments.length < 1) {
throw paramError;
throw new YhsdParamError(['query.hmac', 'query.time_stamp']);
}
var hmac = queryObj.hmac;
delete queryObj.hmac;
Expand All @@ -67,7 +68,7 @@ Auth.prototype = {
*/
getAuthorizeUrl: function (shopKey, state) {
if (arguments.length < 1) {
throw paramError;
throw new YhsdParamError(['shopKey', 'state']);
}
return this.protocol + '://' + this.host + '/oauth2/authorize?' + querystring.stringify({
response_type: 'code',
Expand Down Expand Up @@ -95,7 +96,7 @@ Auth.prototype = {
};
} else {
if (arguments.length < 1) {
throw paramError;
throw new YhsdParamError(['code']);
}
params = {
grant_type: 'authorization_code',
Expand All @@ -112,8 +113,15 @@ Auth.prototype = {
headers: headers
};
return this._request.request(option, params).then(function (data) {
if (!data.token.length) {
throw new Error('无效的 token');
if (!data || !data.token) {
switch ((data || {}).error) {
case 'invalid_grant':
throw new YhsdError('未授权, 请检查 appKey, appSecret!');
case 'invalid_client':
throw new YhsdError('无效客户端, 请检查 appKey, appSecret!');
default:
throw new YhsdError('获取 token 失败!');
}
}
return data.token;
});
Expand Down
27 changes: 27 additions & 0 deletions lib/Error.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
var util = require('./util')

function YhsdError(message) {
var e = new Error()
e.name = this.name = 'YhsdError';
this.message = message || '';
this.stack = (e).stack;
}
YhsdError.prototype = Object.create(Error.prototype);
YhsdError.prototype.constructor = YhsdError;

module.exports.YhsdError = YhsdError

function YhsdParamError() {
var message = '参数异常';
if (util.isString(arguments[0])) message = '参数异常: ' + arguments.join(';');
if (util.isArray(arguments[0])) message = '缺少参数: ' + arguments[0].join(',');

var e = new Error()
e.name = this.name = 'YhsdParamError';
this.message = message;
this.stack = (e).stack;
}
YhsdParamError.prototype = Object.create(Error.prototype);
YhsdParamError.prototype.constructor = YhsdParamError;

module.exports.YhsdParamError = YhsdParamError
7 changes: 4 additions & 3 deletions lib/WebHook.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
var paramError = new Error('缺少参数');
var crypto = require('crypto');

var YhsdParamError = require('./Error').YhsdParamError;

/**
* 初始化
* @param {string} webHookToken
*/
var WebHook = function(webHookToken) {
if (arguments.length < 1) {
throw paramError;
throw new YhsdParamError(['webHookToken']);
}
this.token = webHookToken;
};
Expand All @@ -21,7 +22,7 @@ WebHook.prototype = {
*/
verifyHmac: function(hmac, bodyData) {
if (arguments.length < 2) {
throw paramError;
throw new YhsdParamError(['hmac', 'bodyData']);
}
var calculatedHmac = crypto.createHmac('sha256', this.token).update(bodyData, 'utf8').digest('base64');
return hmac === calculatedHmac;
Expand Down
6 changes: 6 additions & 0 deletions lib/util.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,12 @@ module.exports = {
isPromise: function (object) {
return object && this.isObject(object) && this.isFunction(object.then);
},
isString: function (string) {
return typeof string === 'string';
},
isArray: function (array) {
return typeof array === 'object' && array instanceof Array;
},
isObject: function (object) {
return typeof object === 'object';
},
Expand Down
Loading