thunderpix
Version:
Biblioteca javascript de padronização de gateways de pagamentos PIX
193 lines (192 loc) • 7.09 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const axios_1 = __importDefault(require("axios"));
const index_1 = require("../../utils/all/index");
class MercadoPagoProvider {
baseUrl;
clientId;
clientSecret;
accessToken;
providerInfo = {
name: 'Mercado Pago',
description: 'A solução completa de pagamentos para o seu negócio.',
documentation: 'https://www.mercadopago.com.br/developers/pt',
isOnline: true,
vendor: {
name: 'Mercado Pago',
shotname: 'mercado_pago',
url: 'https://www.mercadopago.com.br',
api: 'https://api.mercadopago.com',
versions: [
{
name: 'br.com.mercadopago.api-v1',
version: '1.0.0',
path: '/',
}
],
},
};
constructor(configs) {
if (configs.isTest) {
this.baseUrl = 'https://api.mercadopago.com/sandbox';
}
else {
this.baseUrl = 'https://api.mercadopago.com';
}
this.clientId = configs.clientId;
this.clientSecret = configs.clientSecret;
this.accessToken = null;
}
generateProviderWidthdraw(body) {
throw new Error('Method not implemented.');
}
listProviderWidthdraw(body) {
throw new Error('Method not implemented.');
}
searchProviderWidthdraw(body) {
throw new Error('Method not implemented.');
}
async generateToken() {
const auth = Buffer.from(`${this.clientId}:${this.clientSecret}`).toString('base64');
const response = await axios_1.default.post(`${this.baseUrl}/oauth/token`, {
grant_type: 'client_credentials',
client_id: this.clientId,
client_secret: this.clientSecret,
}, {
headers: {
Authorization: `Basic ${auth}`,
'Content-Type': 'application/json',
},
});
this.accessToken = response.data.access_token;
}
getHeaders() {
if (!this.accessToken) {
throw new Error('Token de acesso não foi gerado.');
}
return {
Authorization: `Bearer ${this.accessToken}`,
'Content-Type': 'application/json',
};
}
async gerarQrCode(valueCents, expirationTime, description) {
const payload = {
transaction_amount: valueCents / 100,
description,
payment_method_id: 'pix',
date_of_expiration: new Date(expirationTime ? expirationTime * 1000 : Date.now() + 3600 * 1000).toISOString(),
};
const response = await axios_1.default.post(`${this.baseUrl}/v1/payments`, payload, {
headers: this.getHeaders(),
});
return response.data;
}
async listarPagamentos(page = 1, registrationStartDate, registrationEndDate) {
const params = {
offset: (page - 1) * 20,
limit: 20,
range: 'date_created',
begin_date: registrationStartDate,
end_date: registrationEndDate,
};
const response = await axios_1.default.get(`${this.baseUrl}/v1/payments/search`, {
headers: this.getHeaders(),
params,
});
return response.data;
}
async consultarPagamentoPorId(paymentId) {
const response = await axios_1.default.get(`${this.baseUrl}/v1/payments/${paymentId}`, {
headers: this.getHeaders(),
});
return response.data;
}
async cadastrarPagamento(valueCents, receiverName, receiverDocument, pixKey, pixKeyType, authorized = false) {
const payload = {
transaction_amount: valueCents / 100,
payment_method_id: pixKey ? 'pix' : 'bank_transfer',
description: `Pagamento para ${receiverName}`,
payer: {
email: `${receiverDocument}@email.com`,
identification: {
type: pixKeyType || 'CPF',
number: receiverDocument,
},
},
pix_key: pixKey,
statement_descriptor: 'Pagamento PIX',
};
const response = await axios_1.default.post(`${this.baseUrl}/v1/payments`, payload, {
headers: this.getHeaders(),
});
return response.data;
}
async cadastrarWebhook(url, event) {
const payload = {
url,
topics: [event],
};
const response = await axios_1.default.post(`${this.baseUrl}/v1/webhooks`, payload, {
headers: this.getHeaders(),
});
return response.data;
}
async generatingPixBilling(body) {
var valueCents = Number.isInteger(body.valueCents)
? body.valueCents
: Math.round(body.valueCents * 100);
var expireTimestamp = Math.round(new Date().getTime() / 1000 + (body.expires ?? 3600));
await this.generateToken();
var data = await this.gerarQrCode(valueCents, expireTimestamp);
return {
qrcode: data.point_of_interaction.transaction_data.qr_code,
pixkey: data.point_of_interaction.transaction_data.qr_code_base64,
value: {
original: body.valueCents,
cents: valueCents,
fixed: (valueCents / 100).toFixed(2),
float: valueCents / 100,
},
expires: {
timestamp: expireTimestamp,
dateTime: new Date(expireTimestamp * 1000).toLocaleString('pt-BR'),
iso: new Date(expireTimestamp * 1000).toISOString(),
},
code: data.id ?? (0, index_1.randomUUID)(),
};
}
async listingPixBilling(body) {
var data = await this.listarPagamentos(body.page ?? 1, body.registrationDateStart ?? new Date().toISOString(), body.registrationDateEnd ?? new Date().toISOString());
data = data.results.map((mp) => {
return {
referenceCode: mp.id,
valueCents: mp.transaction_amount * 100,
content: mp.point_of_interaction.transaction_data.qr_code,
status: mp.status,
registrationDate: mp.date_created,
paymentDate: mp.date_approved,
};
});
return data;
}
async getBalance() {
return {
valueCents: 0,
valueFloat: 0.0
};
}
async searchPixBilling(body) {
var data = await this.consultarPagamentoPorId(body.reference);
return {
referenceCode: data.id,
valueCents: data.transaction_amount * 100,
status: data.status,
registrationDate: data.date_created,
paymentDate: data.date_approved,
};
}
}
exports.default = MercadoPagoProvider;