shopee-v2-api
Version:
324 lines (287 loc) • 9.03 kB
JavaScript
/* -------------------------------------------------------------------------- */
/* Imports */
/* -------------------------------------------------------------------------- */
const _ = require('lodash');
/* -------------------------------------------------------------------------- */
/* Constants */
/* -------------------------------------------------------------------------- */
const {
constants
} = require('./constants');
/* -------------------------------------------------------------------------- */
/* Common / Auth */
/* -------------------------------------------------------------------------- */
const {
buildSignKey,
buildUrl,
get,
post,
RefreshToken
} = require('./auth');
/* -------------------------------------------------------------------------- */
/* API */
/* -------------------------------------------------------------------------- */
/**
* 배송 채널 목록
* @param {*} userShop
* @returns
*/
exports.GetLogistics = async (userShop) => {
try {
// access token 유효 확인
let {
shop_id,
accessToken
} = await RefreshToken(userShop);
// uri
const uri = '/api/v2/logistics/get_channel_list';
// sign key
const {
signKey,
currentTimeStamp
} = buildSignKey(uri, accessToken, shop_id);
// url
const url = buildUrl(uri, {
partner_id: constants.partnerId,
timestamp: currentTimeStamp,
sign: signKey,
access_token: accessToken,
shop_id: shop_id
});
// request && response data
const responseData = await get(url);
// 데이터 형식 변경
if (responseData.response && responseData.response.logistics_channel_list) {
let result = responseData.response.logistics_channel_list
.filter((logistic) => logistic.enabled)
.map((logistic) => ({
logistic_id: logistic.logistics_channel_id,
logistic_name: logistic.logistics_channel_name,
has_cod: logistic.cod_enabled,
fee_type: logistic.fee_type,
sizes: logistic.size_list,
enabled: logistic.enabled,
weight_limits: logistic.weight_limit,
volume_limits: logistic.item_max_dimension,
item_max_dimension: logistic.item_max_dimension,
preferred: logistic.preferred,
logistics_description: logistic.logistics_description,
force_enabled: logistic.force_enabled,
mask_channel_id: logistic.mask_channel_id
}));
return result;
} else {
return [];
}
} catch (err) {
throw err;
}
}
/**
* 주문의 배송 수단 조회
* @param {*} userShop
* @param {*} ordersn
* @returns
*/
exports.GetLogisticInfo = async (userShop, ordersn) => {
try {
// access token 유효 확인
let {
shop_id,
accessToken
} = await RefreshToken(userShop);
// uri
const uri = '/api/v2/logistics/get_shipping_parameter';
// sign key
const {
signKey,
currentTimeStamp
} = buildSignKey(uri, accessToken, shop_id);
// url
const url = buildUrl(uri, {
partner_id: constants.partnerId,
timestamp: currentTimeStamp,
sign: signKey,
access_token: accessToken,
shop_id: shop_id,
order_sn: ordersn
});
// request && response data
const responseData = await get(url);
if (responseData.response) {
return responseData.response;
} else {
return null;
}
} catch (err) {
throw err;
}
}
/**
* 발주(송장번호) 요청
* @param {*} userShop
* @param {*} ordersn
* @param {*} packageNo
* @param {*} method
* @returns
*/
exports.Init = async (userShop, ordersn, method, packageNo = null) => {
try {
// access token 유효 확인
let {
shop_id,
accessToken
} = await RefreshToken(userShop);
// uri
const uri = '/api/v2/logistics/ship_order';
// sign key
const {
signKey,
currentTimeStamp
} = buildSignKey(uri, accessToken, shop_id);
// url
const url = buildUrl(uri, {
partner_id: constants.partnerId,
timestamp: currentTimeStamp,
sign: signKey,
access_token: accessToken,
shop_id: shop_id
});
// request
const body = _.assign({
order_sn: ordersn,
package_number: packageNo,
}, method);
// response data
const responseData = await post(url, JSON.stringify(body));
if (responseData.request_id) {
return true;
} else {
return false;
}
} catch (err) {
throw err;
}
}
/**
* 송장 번호 조회
* @param {*} userShop
* @param {*} ordersn
* @param {*} packageNo
* @returns
*/
exports.GetTrackingNo = async (userShop, ordersn, packageNo = null) => {
try {
// access token 유효 확인
let {
shop_id,
accessToken
} = await RefreshToken(userShop);
// uri
const uri = '/api/v2/logistics/get_tracking_number';
// sign key
const {
signKey,
currentTimeStamp
} = buildSignKey(uri, accessToken, shop_id);
// url
const url = buildUrl(uri, {
partner_id: constants.partnerId,
timestamp: currentTimeStamp,
sign: signKey,
access_token: accessToken,
shop_id: shop_id,
order_sn: ordersn,
package_number: packageNo
});
// request && response data
const responseData = await get(url);
if (responseData.response &&
responseData.response.tracking_number && responseData.response.tracking_number.length > 0) {
return responseData.response.tracking_number;
} else {
return null;
}
} catch (err) {
throw err;
}
}
/**
* 배송 조회
* @param {*} userShop
* @param {*} ordersn
* @param {*} packageNo
* @returns
*/
exports.GetTrackingMessage = async (userShop, ordersn, packageNo = null) => {
try {
// access token 유효 확인
let {
shop_id,
accessToken
} = await RefreshToken(userShop);
// uri
const uri = '/api/v2/logistics/get_tracking_info';
// sign key
const {
signKey,
currentTimeStamp
} = buildSignKey(uri, accessToken, shop_id);
// url
const url = buildUrl(uri, {
partner_id: constants.partnerId,
timestamp: currentTimeStamp,
sign: signKey,
access_token: accessToken,
shop_id: shop_id,
order_sn: ordersn,
package_number: packageNo
});
// request && response data
const responseData = await get(url);
if (responseData.response && responseData.response.order_sn) {
return responseData.response.tracking_info;
} else {
return [];
}
} catch (err) {
throw err;
}
}
exports.GetOrderLogistics = async (userShop, ordersn, packageNo = null) => {
try {
// access token 유효 확인
let {
shop_id,
accessToken
} = await RefreshToken(userShop);
// uri
const uri = '/api/v2/logistics/get_shipping_document_data_info';
// sign key
const {
signKey,
currentTimeStamp
} = buildSignKey(uri, accessToken, shop_id);
// url
const url = buildUrl(uri, {
partner_id: constants.partnerId,
timestamp: currentTimeStamp,
sign: signKey,
access_token: accessToken,
shop_id: shop_id,
});
const body = {
order_sn: ordersn,
package_number: packageNo,
};
// request && response data
const responseData = await post(url, JSON.stringify(body));
if (responseData.response && responseData.response.shipping_document_info) {
return responseData.response.shipping_document_info;
} else {
return null;
}
} catch (err) {
throw err;
}
}