265 lines
13 KiB
JavaScript
265 lines
13 KiB
JavaScript
const { MercadoPagoConfig, Preference, Payment } = require('mercadopago');
|
|
|
|
const express = require('express');
|
|
const router = express.Router();
|
|
|
|
//const client = new MercadoPagoConfig({ accessToken: 'TEST-7218616229800258-090908-d403b108f1f9c31e432f525c8abb14b3-115139428' });
|
|
const client = new MercadoPagoConfig({ accessToken: 'APP_USR-7218616229800258-090908-6281afa294bbb2de7f68e1e336539ba1-115139428' });
|
|
|
|
var routes = function () {
|
|
|
|
|
|
|
|
router.post('/buy', function (req, res) {
|
|
console.log(`${new Date().toUTCString()} - ${req.originalUrl} ${' called'}`);
|
|
const idprodutos = parseInt(req.body.idprodutos);
|
|
const idusuarios = parseInt(req.body.idusuarios);
|
|
const qtd = parseInt(req.body.qtd);
|
|
|
|
const sqlQuery = `SELECT
|
|
pdt.idprodutos,
|
|
pdt.valor,
|
|
sis.idsistemas,
|
|
sis.nome,
|
|
tpl.idtiposlicenca,
|
|
tpl.descricao,
|
|
(SELECT us.cpf from usuarios us WHERE us.idusuarios = ?) as cpf
|
|
FROM produtos pdt
|
|
INNER JOIN sistemas sis ON sis.idsistemas = pdt.idsistemas
|
|
INNER JOIN tiposlicenca tpl ON tpl.idtiposlicenca = pdt.idtiposlicenca
|
|
WHERE pdt.idprodutos = ?`;
|
|
|
|
mysqlConnection.query(sqlQuery, [idusuarios, idprodutos], function (error, results, fields) {
|
|
if (error) {
|
|
return res.status(500).send({ error: 'Erro ao consultar o banco de dados.' });
|
|
}
|
|
|
|
const produto = results[0];
|
|
if (produto['idtiposlicenca'] == 6) {
|
|
const sqlGerarChave = `CALL GerarInserirChave(?, ?, ?, @SerialKey, @idChave);`;
|
|
mysqlConnection.query(sqlGerarChave, [produto['cpf'], 30, produto['idsistemas']], function (chaveError, resChave) {
|
|
if (chaveError) {
|
|
return res.status(500).send({ error: 'Erro ao gerar chave.' });
|
|
}
|
|
else {
|
|
const serial = resChave[0]?.[0]['SerialKey']
|
|
res.status(200).send({url: null, chave: serial});
|
|
}
|
|
})
|
|
}
|
|
else {
|
|
const sqlGetVenda = `SELECT * FROM produtosvendas WHERE idprodutos = ? AND idusuarios = ? AND quantidade = ? AND status IS NULL;`;
|
|
mysqlConnection.query(sqlGetVenda, [produto.idprodutos, idusuarios, qtd], function (getError, getVenda) {
|
|
if (getError) {
|
|
return res.status(500).send({ error: 'Erro ao consultar venda no banco de dados.' });
|
|
}
|
|
|
|
if (getVenda.length == 0) {
|
|
const sqlCreate = `INSERT INTO produtosvendas (idprodutos, idusuarios, quantidade, valor) VALUES (?, ?, ?, ?)`;
|
|
mysqlConnection.query(sqlCreate, [produto.idprodutos, idusuarios, qtd, qtd * produto.valor], function (createError, venda) {
|
|
if (createError) {
|
|
return res.status(500).send({ error: 'Erro ao criar venda no banco de dados.' });
|
|
}
|
|
|
|
const preference = new Preference(client);
|
|
const pref = {
|
|
body: {
|
|
items: [
|
|
{
|
|
title: produto.nome + " " + produto.descricao,
|
|
quantity: qtd,
|
|
unit_price: produto.valor
|
|
}
|
|
],
|
|
notification_url: 'https://zendioninc.com.br/api/checkout/webhook',
|
|
external_reference: "" + venda.insertId
|
|
}
|
|
};
|
|
//console.log(pref);
|
|
preference.create(pref)
|
|
.then(response => {
|
|
//console.log(response);
|
|
const newPreferenceId = response.id; // ID da nova preferência criada
|
|
|
|
// Atualiza o campo preference_id no banco de dados
|
|
const updateQuery = `UPDATE produtosvendas SET preference_id = ? WHERE idprodutosvendas = ?`;
|
|
mysqlConnection.query(updateQuery, [newPreferenceId, venda.insertId], function (updateError) {
|
|
if (updateError) {
|
|
return res.status(500).send({ error: 'Erro ao atualizar o preference_id no banco de dados.' });
|
|
}
|
|
|
|
// Redireciona para o checkout com a nova preferência
|
|
res.status(200).send({url: response.init_point});
|
|
//res.redirect(response.init_point);
|
|
});
|
|
})
|
|
.catch(error => {
|
|
console.error('Erro ao criar a preferência:', error);
|
|
return res.status(500).send({ error: 'Erro ao criar a preferência de pagamento.' });
|
|
});
|
|
});
|
|
}
|
|
else {
|
|
// Se já existir, redireciona para o checkout utilizando o preference_id existente
|
|
const init_point = `https://www.mercadopago.com.br/checkout/v1/redirect?pref_id=${getVenda[0].preference_id}`;
|
|
res.status(200).send({url: init_point});
|
|
//return res.redirect(init_point);
|
|
}
|
|
});
|
|
}
|
|
});
|
|
});
|
|
|
|
router.post('/webhook', function (req, res) {
|
|
const paymentData = req.body;
|
|
|
|
//console.log(paymentData);
|
|
|
|
// Verifica o tipo de notificação recebida
|
|
if (paymentData.type === 'payment') {
|
|
const paymentId = paymentData.data.id;
|
|
//console.log(paymentId);
|
|
|
|
// Consultar o status do pagamento no Mercado Pago usando o ID
|
|
const payment = new Payment(client);
|
|
payment.get({
|
|
id: paymentId,
|
|
})
|
|
.then(response => {
|
|
//console.log(response);
|
|
const vendaId = response.external_reference;
|
|
const status = response.status;
|
|
|
|
if (vendaId == null) {
|
|
console.error('ID da venda nao informado!');
|
|
return res.status(500).send('ID da venda nao informado!');
|
|
}
|
|
|
|
const updateQuery = `UPDATE produtosvendas SET status = ? WHERE idprodutosvendas = ?;`;
|
|
mysqlConnection.query(updateQuery, [status, vendaId], function (error) {
|
|
if (error) {
|
|
console.error('Erro ao atualizar status do pagamento no banco de dados:', error);
|
|
return res.status(500).send('Erro ao atualizar banco de dados.');
|
|
}
|
|
|
|
if (status === 'approved') {
|
|
// Pagamento foi aprovado, agora você pode liberar a licença
|
|
console.log('Pagamento aprovado!');
|
|
|
|
const getQuery = `SELECT
|
|
pdt.idsistemas,
|
|
usu.idusuarios,
|
|
usu.cpf,
|
|
tpl.dias
|
|
FROM produtosvendas pdv
|
|
INNER JOIN usuarios usu ON usu.idusuarios = pdv.idusuarios
|
|
INNER JOIN produtos pdt ON pdt.idprodutos = pdv.idprodutos
|
|
INNER JOIN tiposlicenca tpl ON tpl.idtiposlicenca = pdt.idtiposlicenca
|
|
WHERE pdv.idprodutosvendas = ?;`;
|
|
mysqlConnection.query(getQuery, [vendaId], function (errGet, resGet) {
|
|
if (errGet) {
|
|
console.error('Erro ao consultar dados do usuario no banco de dados:', errGet);
|
|
return res.status(500).send('Erro ao consultar dados do usuario no banco de dados');
|
|
}
|
|
const dados = resGet[0];
|
|
const sqlGenerateSerial = `CALL GerarChave(?, ?, @serialKey); SELECT @serialKey AS serial;`;
|
|
mysqlConnection.query(sqlGenerateSerial, [dados.cpf, dados.dias], function (err, results) {
|
|
if (err) {
|
|
console.error('Erro ao gerar serial:', err);
|
|
return res.status(500).send('Erro ao gerar serial');
|
|
}
|
|
const serial = results[1][0].serial;
|
|
const sqlInsertSerial = `
|
|
INSERT INTO chaves (licenca, data_criacao, data_validade, idusuarios, usada, idsistemas)
|
|
VALUES (?, NOW(), DATE_ADD(NOW(), INTERVAL ? DAY), ?, 0, ?);
|
|
`;
|
|
mysqlConnection.query(sqlInsertSerial, [serial, dados.dias, dados.idusuarios, dados.idsistemas], function (errInsert) {
|
|
if (errInsert) {
|
|
console.error('Erro ao registrar serial:', errInsert);
|
|
return res.status(500).send('Erro ao registrar serial');
|
|
}
|
|
res.status(200).send('Licença liberada com sucesso!');
|
|
});
|
|
});
|
|
});
|
|
} else {
|
|
// Se o status for diferente de "approved", trate adequadamente (pendente, recusado, etc.)
|
|
console.log('Status do pagamento:', status);
|
|
res.status(200).send('Pagamento não aprovado.');
|
|
}
|
|
});
|
|
})
|
|
.catch(error => {
|
|
console.error('Erro ao consultar o pagamento:', error);
|
|
res.status(500).send('Erro ao consultar o pagamento.');
|
|
});
|
|
} else {
|
|
res.status(400).send('Tipo de notificação não suportado.');
|
|
}
|
|
});
|
|
|
|
|
|
router.get('/getProductsSell/:idsistemas', function (req, res) {
|
|
const idsistemas = parseInt(req.params.idsistemas);
|
|
ExecuteQuery(`SELECT
|
|
pdt.idprodutos,
|
|
pdt.valor,
|
|
tpl.descricao
|
|
FROM produtos pdt
|
|
INNER JOIN tiposlicenca tpl ON tpl.idtiposlicenca = pdt.idtiposlicenca
|
|
WHERE pdt.idsistemas = ${idsistemas} AND pdt.ativado = 1
|
|
ORDER BY tpl.dias ASC;;`, req, res);
|
|
});
|
|
|
|
router.get('/getAllProducts/:idsistemas', function (req, res) {
|
|
const idsistemas = parseInt(req.params.idsistemas);
|
|
ExecuteQuery(`SELECT
|
|
pdt.idprodutos,
|
|
pdt.valor,
|
|
pdt.ativado,
|
|
tpl.idtiposlicenca,
|
|
tpl.descricao,
|
|
(SELECT COUNT(1) FROM produtosvendas pdv WHERE pdv.idprodutos = pdt.idprodutos) AS vendas,
|
|
(SELECT COUNT(1) FROM produtosvendas pdv WHERE pdv.idprodutos = pdt.idprodutos AND pdv.status = 'approved') AS compensados
|
|
FROM produtos pdt
|
|
INNER JOIN tiposlicenca tpl ON tpl.idtiposlicenca = pdt.idtiposlicenca
|
|
WHERE pdt.idsistemas = ${idsistemas}
|
|
ORDER BY pdt.valor ASC;`, req, res);
|
|
});
|
|
|
|
router.post('/insertProduto', function (req, res, next) {
|
|
const idsistemas = parseInt(req.body.idsistemas);
|
|
const idtiposlicenca = parseInt(req.body.idtiposlicenca);
|
|
const valor = req.body.valor;
|
|
const ativado = req.body.ativado ? 1 : 0;
|
|
|
|
const sqlQuery = `INSERT INTO produtos (idsistemas, idtiposlicenca, valor, ativado)
|
|
VALUES (${idsistemas}, ${idtiposlicenca}, ${valor}, ${ativado});`;
|
|
ExecuteQuery(sqlQuery, req, res);
|
|
});
|
|
|
|
router.patch('/updateProduto', function (req, res, next) {
|
|
const idprodutos = parseInt(req.body.idprodutos);
|
|
const idsistemas = parseInt(req.body.idsistemas);
|
|
const idtiposlicenca = parseInt(req.body.idtiposlicenca);
|
|
const valor = req.body.valor;
|
|
const ativado = req.body.ativado ? 1 : 0;
|
|
const sqlQuery = `update produtos set
|
|
idtiposlicenca = ${idtiposlicenca},
|
|
valor = ${valor},
|
|
ativado = ${ativado}
|
|
where idprodutos = ${idprodutos};`;
|
|
ExecuteQuery(sqlQuery, req, res);
|
|
});
|
|
|
|
router.delete('/deleteProduto/:idprodutos', function (req, res, next) {
|
|
const idprodutos = req.params.idprodutos;
|
|
const sqlQuery = `DELETE FROM produtos WHERE idprodutos = ${idprodutos};`;
|
|
ExecuteQuery(sqlQuery, req, res);
|
|
});
|
|
|
|
|
|
return router;
|
|
}
|
|
|
|
module.exports = routes; |