thinkraz-api-sdk
Version:
橡芮科技API开发包
264 lines (246 loc) • 10 kB
JavaScript
const Promise = require('bluebird');
const baseClass = require('../lib/baseClass');
const Payment = require('./Payment');
module.exports = class Orders extends baseClass {
createOrderObject(totalFee, orderObjectData) {
if (!totalFee) totalFee = 0;
if (!orderObjectData) orderObjectData = {};
return Object.assign(orderObjectData, {
totalFee: totalFee
});
}
makeOrderWithPayment(orders, expires, notifyUrl, notifyParams, notifyHeaders) {
let payment = new Payment('/payment', this.getHeaders());
return this.makeOrder(orders, expires).then((order)=> {
let amount = order.totalFee;
let id = order.id;
return payment.makePayment(amount, id, notifyUrl, notifyParams, notifyHeaders);
})
}
makeOrder(orders, expires) {
return new Promise((resolve, reject) => {
if (!expires) expires = 600;
if (!orders) orders = [];
if (!Array.isArray(orders)) {
orders = [orders];
}
this.request().post(this.getPath(), {
expiresIn: expires,
orders: orders
}).then(order => {
resolve(order);
}).catch(err => {
reject(err);
});
});
}
payOrder(orderId, channel, fee, paymentData) {
return new Promise((resolve, reject) => {
if (!paymentData) paymentData = {};
this.request().post(`${this.getPath()}/pay/${orderId}`, Object.assign(paymentData, {
orderId: orderId,
channel: channel,
fee: fee
})).then(order => {
resolve(order);
}).catch(err => {
reject(err);
});
});
}
refundOrder(orderId, channel, fee, refundData) {
return new Promise((resolve, reject) => {
if (!refundData) refundData = {};
fee = parseFloat(fee);
if (fee > 0) {
fee = 0 - fee;
}
this.request().post(`${this.getPath()}/refund/${orderId}`, Object.assign(refundData, {
orderId: orderId,
channel: channel,
fee: fee
})).then(order => {
resolve(order);
}).catch(err => {
reject(err);
});
});
}
/**
* 回滚订单
* @param orderId
* @param [subOrderId] 指定退回某个子订单id,可以留空
* @param [amount] 退回金额,留空则为全部退回
* @return {Promise.<Array>} [{"status":"success","channel":"101464_CASH","amount":2}]}
*/
refundOrderRollback(orderId, subOrderId, amount) {
let payment = new Payment('/payment', this.getHeaders());
return payment.getPayment({where: {orderId: orderId}}).then((result)=> {
let paymentId = result.id;
return payment.refundPaymentRollback(paymentId,null, amount);
}).then((payments)=> {
console.log(payments); //TODO CHECK THIS
return this.getOrder(orderId).then((order)=> {
return new Promise((resolve, reject)=> {
resolve([order.paidFee > 0, payments]);
});
})
}).then(([needRefundOrder,payments])=> {
if (subOrderId) orderId = subOrderId;
// payments = [ { status: 'success', channel: '101464_CASH', amount: 2 } ]
return new Promise((resolve, reject)=> {
if (!needRefundOrder) {
resolve(payments);
return;
}
let promises = [];
if (!amount) {
amount = 9999999999;
}
for (let i = 0; i < payments.length; i++) {
if(payments[i].status != 'success') continue;
let channel = payments[i].channel;
let channelAmount = payments[i].amount;
if (amount > channelAmount) {
promises.push(this.refundOrder(orderId, channel, channelAmount, {
orderId: orderId,
channel: channel,
fee: channelAmount
}));
amount -= channelAmount;
} else if (amount <= channelAmount && amount > 0) {
promises.push(this.refundOrder(orderId, channel, amount, {
orderId: orderId,
channel: channel,
fee: amount
}));
amount = 0;
}
}
Promise.all(promises).then((e)=> {
resolve(payments);
}).catch((e)=> {
reject(e);
});
});
});
}
/**
* 按channel退回一笔订单
* @param orderId
* @param channel
* @param fee
* @param receiver
* @param subOrderId
* @return {Promise.<TResult>}
*/
refundOrderWithPayment(orderId, channel, fee, receiver, subOrderId) {
let payment = new Payment('/payment', this.getHeaders());
return payment.getPayment({where: {orderId: orderId}}).then((result)=> {
let paymentId = result.id;
return payment.refundPaymentByOtherChannel(paymentId, channel, fee, receiver);
}).then((object)=> {
return new Promise((resolve, reject)=> {
let amount = object.amount;
let status = object.status;
if (status != 'SUCCESS') {
reject('refund failed');
}
let refundData = {
orderId: orderId,
channel: channel,
fee: amount
};
//TODO 如果order refund失败,之前payment的怎么办?SdkError: Only can refund paid order
if (subOrderId)
orderId = subOrderId;
this.refundOrder(orderId, channel, fee, refundData).then(resolve).catch(reject);
});
})
}
findOrders(options, integrate) {
return new Promise((resolve, reject) => {
if (!options) options = {};
if (integrate === null || integrate === undefined) integrate = true;
this.request().get(this.getPath(), Object.assign(options, {integrate: integrate})).then(results => {
resolve(results);
}).catch(err => {
reject(err);
});
});
}
unpaidOrders(options, integrate) {
return new Promise((resolve, reject) => {
if (!options) options = {};
if (integrate === null || integrate === undefined) integrate = true;
this.request().get(`${this.getPath()}/unpaid`, Object.assign(options, {integrate: integrate})).then(results => {
resolve(results);
}).catch(err => {
reject(err);
});
});
}
payingOrders(options, integrate) {
return new Promise((resolve, reject) => {
if (!options) options = {};
if (integrate === null || integrate === undefined) integrate = true;
this.request().get(`${this.getPath()}/paying`, Object.assign(options, {integrate: integrate})).then(results => {
resolve(results);
}).catch(err => {
reject(err);
});
});
}
paidOrders(options, integrate) {
return new Promise((resolve, reject) => {
if (!options) options = {};
if (integrate === null || integrate === undefined) integrate = true;
this.request().get(`${this.getPath()}/paid`, Object.assign(options, {integrate: integrate})).then(results => {
resolve(results);
}).catch(err => {
reject(err);
});
});
}
expiredOrders(options, integrate) {
return new Promise((resolve, reject) => {
if (!options) options = {};
if (integrate === null || integrate === undefined) integrate = true;
this.request().get(`${this.getPath()}/expired`, Object.assign(options, {integrate: integrate})).then(results => {
resolve(results);
}).catch(err => {
reject(err);
});
});
}
refundedOrders(options, integrate) {
return new Promise((resolve, reject) => {
if (!options) options = {};
if (integrate === null || integrate === undefined) integrate = true;
this.request().get(`${this.getPath()}/refunded`, Object.assign(options, {integrate: integrate})).then(results => {
resolve(results);
}).catch(err => {
reject(err);
});
});
}
getOrder(orderId) {
return new Promise((resolve, reject) => {
this.request().get(`${this.getPath()}/${orderId}`).then(order => {
resolve(order);
}).catch(err => {
reject(err);
});
});
}
updateOrder(orderId, updateObj, options) {
return new Promise((resolve, reject) => {
if (!options) options = {};
this.request().put(`${this.getPath()}/${orderId}`, updateObj, {where: JSON.stringify(options)}).then(order => {
resolve(order);
}).catch(err => {
reject(err);
});
});
}
};