UNPKG

thinkraz-api-sdk

Version:

橡芮科技API开发包

264 lines (246 loc) 10 kB
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); }); }); } };