const paypal = require('paypal-rest-sdk');
const express = require("express")
const router = express.Router()
const jwt = require('jsonwebtoken');
const User = require("../../schema/User");
const Sale = require('../../schema/Sale');
const JWT_SECRET = 'B!llHe$$';
paypal.configure({
// mode: 'sandbox', // Use 'sandbox' for testing, 'live' for production
// client_id: 'AcsLi6OLNFiHnuqZa5RHev1yDZeaf980ImsizcwmEsRLNfjgzkczaozN44DZTSUN_nCLX1ZknwrkZWCx',
// client_secret: 'EB1qJJduOXEWqOpc7GfVW9Zz8TLy89cZdHsi7v0_tHKPdZaWEXpaJiRALkHiNR4B5Gkqybfeivhbf6V-',
mode: 'live', // Use 'sandbox' for testing, 'live' for production
client_id: 'ARwlw8cpJMUY3CZe_KNZqJepfFzPjGru8xu_tm4RSemT_sn11Ysmp75pDE35Egqn6ey0-esluykEeYJ6',
client_secret: 'EGljsT1a06yKNErJ4oi2tHcqxFUrLt2BT4ZxKDfKHDmuM7MjhHS85Npgt-DP0lJfoVhjQKrTMyQrLJrE',
});
router.post('/create-payment', (req, res) => {
try {
// const { info } = req.body
const user = req.user
let totalAmount = 0;
let totalCredits = 0;
const items = user.cart.map((item) => {
totalCredits += item.credits;
totalAmount += item.price;
return {
"name": item.packageNo,
"sku": "Package",
"price": item.price,
"currency": "USD",
"quantity": 1
}
})
const data = { items, totalAmount, totalCredits, user }
const authtoken = jwt.sign(data, JWT_SECRET);
var create_payment_json = {
"intent": "sale",
"payer": {
"payment_method": "paypal"
},
"redirect_urls": {
"return_url": `https://needapair.com/api/payment/success/${authtoken}`,
"cancel_url": "https://needapair.com/api/payment/cancel"
// "return_url": `http://localhost:8000/api/payment/success/${authtoken}`,
// "cancel_url": "http://localhost:8000/api/payment/cancel"
},
"transactions": [{
"item_list": {
"items": items
},
"amount": {
"currency": "USD",
"total": Number(totalAmount.toFixed(2))
},
"description": "This is the payment description."
}]
};
console.log('create_payment_json', create_payment_json)
console.log('totalAmount', totalAmount)
// return
paypal.payment.create(create_payment_json, function (error, payment) {
if (error) {
throw error;
} else {
for (let i = 0; i < payment.links.length; i++) {
if (payment.links[i].rel === "approval_url") {
res.redirect(payment.links[i].href);
}
}
}
});
} catch (error) {
console.log(error)
res.redirect(`/packages?error=${error.message}`)
}
});
router.get("/success/:token", async (req, res) => {
try {
const token = req.params.token
const packageData = jwt.verify(token, JWT_SECRET)
console.log("packageData", packageData)
const payerId = req.query.PayerID;
const paymentId = req.query.paymentId;
const execute_payment_json = {
payer_id: payerId,
transactions: [
{
amount: {
currency: "USD",
total: Number(packageData.totalAmount.toFixed(2)),
},
},
],
};
paypal.payment.execute(
paymentId,
execute_payment_json,
async function (error, payment) {
if (error) {
res.redirect(`/packages?error=Failed to Buy Package.`)
console.log(error.response);
throw error;
} else {
const query = req.query
const sale = await Sale.create({ payment, query, user: packageData.user.id })
const user = await User.findById(req.user.id)
user.credits += packageData.totalCredits
user.sale = sale._id
user.cart = []
await user.save()
res.redirect(`/packages?message=${packageData.totalCredits} Credits has been Purchased.`)
}
}
);
} catch (error) {
console.log(error)
}
});
router.get("/cancel", (req, res) => {
console.log("Failed to but")
res.redirect(`/packages?error=Failed to Buy Package.`)
});
module.exports = router