sync-alisdk
Version:
Taobao Open API & Message Client.
131 lines (119 loc) • 3.33 kB
JavaScript
var util = require('../topUtil.js');
var RestClient = require('./network.js')
/**
* TOP API Client.
*
* @param {Object} options, must set `appkey` and `appsecret`.
* @constructor
*/
function LinkClient(options) {
if (!(this instanceof LinkClient)) {
return new LinkClient(options);
}
options = options || {};
this.url = options.url || 'http://link.cainiao.com/gateway/link.do';
this.appsecret = options.appsecret;
this.logistic_provider_id = options.logistic_provider_id;
}
/**
* Invoke an api by method name.
*
* @param {String} method, method name
* @param {Object} params
* @param {Array} reponseNames, e.g. ['tmall_selected_items_search_response', 'tem_list', 'selected_item']
* @param {Object} defaultResponse
* @param {Function(err, response)} callback
*/
LinkClient.prototype.invoke = function (type, method, params, reponseNames, callback) {
const cb = (err, result) => {
if (err) {
return callback(err);
}
var response = result;
if (reponseNames && reponseNames.length > 0) {
var retResult = undefined;
for (var i = 0; i < reponseNames.length; i++) {
var name = reponseNames[i];
retResult = response[name];
if (retResult != undefined) {
response = retResult;
break;
}
}
}
callback(null, response);
}
return this.request(type, method, params, cb);
};
/**
* Request API.
*
* @param {Object} params
* @param {String} method
* @param {String} [type='GET']
* @param {Function(err, result)} callback
* @public
*/
LinkClient.prototype.request = function (type, method, params, callback) {
const json_params = JSON.stringify(params);
const args = {
"msg_type": method,
"logistic_provider_id": this.logistic_provider_id,
"data_digest": this.sign(json_params),
"logistics_interface": json_params
}
let request = null;
if(type === 'get'){
request = RestClient.get(this.url);
}else{
request = RestClient.post(this.url);
}
for(let key in args){
request.field(key, args[key]);
}
request.end(function(response){
if(response.statusCode === 200 || response.statusCode === 201){
const data = JSON.parse(response.body);
const errRes = data && data.success;
if (errRes === 'false') {
const err = new Error(data.errorMsg || 'xxx');
callback(err, data);
}else{
callback(null, data);
}
}else{
const err = new Error('NetWork-Error');
err.name = 'NetWork-Error';
err.code = 15;
err.sub_code = response.statusCode;
callback(err, null);
}
})
};
/**
* Sign API request.
* see http://open.taobao.com/doc/detail.htm?id=111#s6
*
* @param {Object} params
* @return {String} sign string
*/
LinkClient.prototype.sign = function (str) {
const basestring = str + this.appsecret;
const ok = Buffer.from(basestring, 'utf-8');
return util.hash('md5', ok, 'base64');
};
/**
* execute top api
*/
LinkClient.prototype.execute = function (apiname, params) {
let that = this;
return new Promise(function (resolve, reject) {
that.invoke('post',apiname, params, [util.getApiResponseName(apiname)], (err, response) => {
if (err) {
return reject(err);
}
resolve(response);
});
})
};
exports.LinkClient = LinkClient;