this is a payment gateway using paid market
for some reason to verify the payment it is sending several and several error messages of the type
❌ | Algum erro detectado
AxiosError: connect ETIMEDOUT 108.139.97.216:443
at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1495:16) {
port: 443,
address: '108.139.97.216',
syscall: 'connect',
code: 'ETIMEDOUT',
errno: -4039,
config: {
transitional: {
silentJSONParsing: true,
forcedJSONParsing: true,
clarifyTimeoutError: false
},
adapter: [Function: httpAdapter],
transformRequest: [ [Function: transformRequest] ],
transformResponse: [ [Function: transformResponse] ],
timeout: 0,
xsrfCookieName: 'XSRF-TOKEN',
xsrfHeaderName: 'X-XSRF-TOKEN',
maxContentLength: -1,
maxBodyLength: -1,
env: { FormData: [Function] },
validateStatus: [Function: validateStatus],
headers: {
Accept: 'application/json, text/plain, */*',
Authorization: 'Bearer APP_USR-5678297262813678-121209-8a3077b4dbc6e69f79cad7d65dae1e9c-1184595585',
'User-Agent': 'axios/0.27.2'
},
method: 'get',
url: 'https://api.mercadolibre.com/collections/notifications/61870666058',
data: undefined
},
but it is still acknowledging that the payment has been approved
what happens is that after being approved it is in an infinite loop of approvals
which even sends several messages of approved payment and adds the amount enter image description here
this is the code:
const Discord = require("discord.js")
const { JsonDatabase, } = require("wio.db");
const axios = require("axios")
const moment = require("moment")
var mercadopago = require("mercadopago");
const db3 = new JsonDatabase({ databasePath:"./databases/myJsonIDs.json" });
const dbcv = new JsonDatabase({ databasePath:"./databases/myJsonBotConfig.json" });
const db4 = new JsonDatabase({ databasePath:"./databases/myJsonSaldo.json" });
module.exports = {
name: "adicionarsaldo",
run: async(client, message, args) => {
const row = new Discord.MessageActionRow()
.addComponents(
new Discord.MessageButton()
.setCustomId(`gerarpix`)
.setEmoji('<:Dinheiro:1114682101917307011>')
.setLabel('Adicionar Saldo')
.setStyle('PRIMARY'),
);
const embed = await message.reply({ embeds: [new Discord.MessageEmbed()
.setTitle(`${dbcv.get(`title`)} | Adicionar saldo`)
.setDescription(`**> Olá, aqui você pode adicionar saldo.**`)
.setThumbnail(`${dbcv.get(`foto`)}`)
.setFooter({ text: `${dbcv.get(`title`)} | Todos os Direitos Reservados.` })
.setColor(dbcv.get(`color`))], components: [row]})
const interação = embed.createMessageComponentCollector({ componentType: "BUTTON", });
interação.on("collect", async (interaction) => {
if (message.author.id != interaction.user.id) {
return;
}
if (interaction.customId === "gerarpix") {
interaction.deferUpdate();
message.channel.send(`<a:carregando4:1104203026304073798> | Qual o valor de saldo que você quer adicionar (mesmo valor que você vai pagar)?`).then(msg => {
const filter = m => m.author.id === interaction.user.id;
const collector = msg.channel.createMessageCollector({ filter, max: 1 });
collector.on("collect", message => {
message.delete()
const newsa = message.content
db4.set(`${interaction.user}.id`, `${interaction.user}`)
db4.set(`${interaction.user}.saldopendente`, `${newsa}`)
msg.edit("<a:sim:1104203193958813726> | O saldo está pendente, pague!")
const severi = interaction.customId;
let quantidade1 = 1;
let precoalt = newsa;
var data_id = Math.floor(Math.random() * 999999999999999);
db3.set(`${data_id}.id`, `${data_id}`)
db3.set(`${data_id}.status`, `Pendente (1)`)
db3.set(`${data_id}.userid`, `${interaction.user.id}`)
db3.set(`${data_id}.nomeid`, `saldo`)
db3.set(`${data_id}.qtdid`, `${quantidade1}`)
db3.set(`${data_id}.precoid`, `${precoalt}`)
db3.set(`${data_id}.entrid`, `Andamento`)
const timer2 = setTimeout(function() {
if ((interaction.guild.channels.cache.find(c => c.topic === interaction.user.id))) {
c.delete();
}
db3.delete(`${data_id}`)
}, 300000)
console.log(dbcv.get(`access_token`))
const logs = new Discord.MessageEmbed()
.setTitle(`${dbcv.get(`title`)} | Logs`)
.setDescription(`<a:sim:1104203193958813726> **O <@${interaction.user.id}> acabou de fazer um pedido para adicionar saldo \n<:Dinheiro:1114682101917307011> Valor: ${newsa}**`)
.setFooter({ text: `${dbcv.get(`title`)} | Todos os Direitos Reservados.` })
.setColor(dbcv.get(`color`))
client.channels.cache.get(dbcv.get(`logs_staff`)).send({ embeds: [logs], content: `||<@&${dbcv.get(`equipe`)}>||` })
const venda = setTimeout(function () {
if ((interaction.guild.channels.cache.find(c => c.topic === interaction.user.id))) { c.delete(); }
db3.delete(`${interaction.user.id}`)
}, 1800000)
mercadopago.configurations.setAccessToken(dbcv.get(`access_token`));
var payment_data = {
transaction_amount: Number(newsa),
description: `Pagamento | ${interaction.user.username}`,
payment_method_id: 'pix',
payer: {
email: '[email protected]',
first_name: 'Homero',
last_name: 'Brum',
identification: {
type: 'CPF',
number: '09111189770' // it's aleatory
},
address: {
zip_code: '06233200',
street_name: 'Av. das Nações Unidas',
street_number: '3003',
neighborhood: 'Bonfim',
city: 'Osasco',
federal_unit: 'SP'
}
}
};
mercadopago.payment.create(payment_data).then(function (data) {
executado = false;
db3.set(`${data_id}.status`, `Pendente (2)`);
const buffer = Buffer.from(data.body.point_of_interaction.transaction_data.qr_code_base64, "base64");
const attachment = new Discord.MessageAttachment(buffer, "payment.png");
const embedqrcode = new Discord.MessageEmbed()
.setImage("attachment://payment.png")
.setFooter("Após efetuar o pagamento, o tempo de entrega é de no máximo 1 minuto!")
.setTitle(`**${dbcv.get(`title`)} | Qr Code**`)
.setDescription(`**${data_id} Para pagar com Qr Code basta abrir o aplicativo do seu banco, clicar em Qr Code e alinhar o celular com a imagem a seguir.**`)
.setColor(dbcv.get(`color`));
message.channel.send({ embeds: [embedqrcode], content: "<a:carregando4:1104203026304073798> | Aguardando o Pagamento...", files: [attachment] });
setTimeout(() => {
message.channel.send(`**:pix: | Copia e Cola:**
${data.body.point_of_interaction.transaction_data.qr_code}`);
}, 1000);
const collector = msg.channel.createMessageComponentCollector();
const lopp = setInterval(function () {
const time2 = setTimeout(function () {
clearInterval(lopp);
}, 1800000);
axios
.get(`https://api.mercadolibre.com/collections/notifications/${data.body.id}`, {
headers: {
Authorization: `Bearer ${dbcv.get(`access_token`)}`,
},
})
.then(async (doc) => {
if (doc.data.collection.status === "approved") {
db3.set(`${data_id}.status`, `Processando`);
}
if (`${db3.get(`${data_id}.status`)}` === "Processando") {
clearTimeout(time2);
clearInterval(lopp);
clearInterval(venda);
const currentSaldo = parseFloat(db4.get(`${interaction.user.id}.saldo`)) || 0;
const newsa = parseFloat(currentSaldo);
const somado = currentSaldo + newsa;
db3.set(`${interaction.user.id}.status`, `Concluido`);
db4.set(`${interaction.user.id}.saldo`, somado.toString());
const embedentrega2 = new Discord.MessageEmbed()
.setDescription(`<a:verifc:1059297851877892176> | Pagamento Aprovado verifique a sua DM! \n <:info:1066002037927592019> | ID da sua compra || ${interaction.user.id} ||`)
.setColor(`${dbcv.get(`color`)}`)
.setImage(`${dbcv.get(`thumbnail`)}`)
msg.channel.send({ embeds: [embedentrega2] })
const membro = interaction.guild.members.cache.get(interaction.user.id)
const role = interaction.guild.roles.cache.find(role => role.id === dbcv.get(`role`))
membro.roles.add(role)
const canalif = client.channels.cache.get(dbcv.get(`logs_staff`))
const message2 = canalif.send({
embeds: [new Discord.MessageEmbed()
.setTitle(`${dbcv.get(`title`)} | Saldo Aprovado`)
.addField(` | Comprador:`, `${interaction.user}`)
.addField(` | Data da compra:`, `${moment().format('LLLL')}`)
.addField(`<:DS_caixa:1066002175421071380> | Produto:`, `Saldo`)
.addField(`<:Dinheiro:1059297379473424444> | Preço:`, `R$${currentSaldo}`)
.addField(`✨ | Id da compra:`, `${data_id}`)
.setColor(dbcv.get(`color`))
.setThumbnail(client.user.displayAvatarURL())
],
components: [row]
})
}
})
})
});
})
})
}
})
}
}
I tried everything but no results, always the same thing
This may have something to do with your use of the
setIntervalfunction which repeats a function using a fixed interval in milliseconds. At the very minimum, you could try replacing that withsetTimeout. If that still doesn't work, try the following.Generally, when you are doing AJAX calls or external asynchronous calls, you will not need to use any timeouts or intervals. You might try using a 'success' or 'error' block which resumes whenever the data is ready.
This is the high level jQuery code I've used in the past: