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;