floranet/api/controller/Payment/paypal/paypal.providers.js

81 lines
2.2 KiB
JavaScript

const paypal = require('paypal-rest-sdk');
const db = require("../../../db/db");
class PayPalProviders {
async New(orderFk, price) {
try {
const payReq = JSON.stringify({
'intent': 'sale',
'redirect_urls': {
'return_url': `${process.env.BASE_URL}/checkout/success?orderId=${orderFk}&type=paypal`,
'cancel_url': `${process.env.BASE_URL}/checkout/error`
},
'payer': {
'payment_method': 'paypal'
},
'transactions': [{
'amount': {
'total': price,
'currency': 'EUR'
},
'description': 'This is the payment transaction description.'
}]
});
const newOrder = await new Promise(async (resolve, reject) => {
paypal.payment.create(payReq, function (error, payment) {
if (error) {
reject(error)
} else {
//capture HATEOAS links
var links = {};
payment.links.forEach(function (linkObj) {
links[linkObj.rel] = {
'href': linkObj.href,
'method': linkObj.method
};
})
//if redirect url present, redirect user
if (links.hasOwnProperty('approval_url')) {
resolve(
{
id: payment.id,
link: links['approval_url'].href,
}
)
} else {
console.error('no redirect URI present');
}
}
});
}).then(res => res)
return newOrder
} catch (error) {
throw error;
}
}
async success(paymentId, payerId, orderId) {
try {
return new Promise(async (resolve, reject) => {
paypal.payment.execute(paymentId, payerId, async function (error, payment) {
if (error) {
reject()
} else {
if (payment.state == 'approved') {
await db.order_confirm(orderId)
resolve({ id: payment.id })
} else {
reject()
}
}
});
}).then(res => res)
} catch (error) {
throw error
}
}
}
module.exports = new PayPalProviders();