thunderpix
Version:
Biblioteca javascript de padronização de gateways de pagamentos PIX
278 lines (277 loc) • 10.1 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 PagarMeProvider {
baseUrl;
apiKey;
providerInfo = {
name: 'Pagar.me',
description: 'A plataforma completa para aceitar pagamentos online.',
documentation: 'https://docs.pagar.me',
isOnline: true,
vendor: {
name: 'Pagar.me',
shotname: 'pagarme',
url: 'https://pagar.me',
api: 'https://api.pagar.me',
versions: [
{
name: 'br.com.pagarme.api-v1',
version: '1.0.0',
path: '/core/v1',
},
{
name: 'br.com.pagarme.api-v2',
version: '1.2.0',
path: '/core/v2',
},
{
name: 'br.com.pagarme.api-v3',
version: '2.3.0',
path: '/core/v3',
},
{
name: 'br.com.pagarme.api-v4',
version: '3.4.0',
path: '/core/v4',
},
{
name: 'br.com.pagarme.api-v5',
version: '4.5.0',
path: '/core/v5',
},
],
},
};
constructor(configs) {
this.apiKey = configs.apiKey;
this.baseUrl = 'https://api.pagar.me/core/v5';
}
getHeaders() {
return {
'Content-Type': 'application/json',
};
}
async gerarTransacaoCredito(valueCents, cardDetails, customer) {
const payload = {
api_key: this.apiKey,
amount: valueCents,
payment_method: 'credit_card',
card_number: cardDetails.number,
card_expiration_date: cardDetails.expiration_date,
card_holder_name: cardDetails.holder_name,
card_cvv: cardDetails.cvv,
customer,
};
const response = await axios_1.default.post(`${this.baseUrl}/transactions`, payload, {
headers: this.getHeaders(),
});
return response.data;
}
async gerarQrCode(valueCents, expirationTime, description) {
const payload = {
api_key: this.apiKey,
amount: valueCents,
payment_method: 'pix',
pix_expiration_date: expirationTime
? new Date(expirationTime * 1000).toISOString()
: new Date(Date.now() + 3600 * 1000).toISOString(),
description,
};
const response = await axios_1.default.post(`${this.baseUrl}/transactions`, payload, {
headers: this.getHeaders(),
});
return response.data;
}
async listarTransacoes(page = 1, startDate, endDate) {
const params = {
api_key: this.apiKey,
page,
count: 20,
date_created_since: startDate,
date_created_until: endDate,
};
const response = await axios_1.default.get(`${this.baseUrl}/transactions`, {
headers: this.getHeaders(),
params,
});
return response.data;
}
async consultarTransacaoPorId(transactionId) {
const response = await axios_1.default.get(`${this.baseUrl}/transactions/${transactionId}`, {
params: { api_key: this.apiKey },
headers: this.getHeaders(),
});
return response.data;
}
async estornarTransacao(transactionId) {
const response = await axios_1.default.post(`${this.baseUrl}/transactions/${transactionId}/refund`, {
api_key: this.apiKey,
}, {
headers: this.getHeaders(),
});
return response.data;
}
async cadastrarWebhook(url, event) {
const payload = {
api_key: this.apiKey,
url,
events: [event],
};
const response = await axios_1.default.post(`${this.baseUrl}/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.gerarQrCode(valueCents, expireTimestamp);
return {
pixkey: body.pixkey,
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: (0, index_1.randomUUID)(),
};
}
async listingPixBilling(body) {
var data = await this.listarTransacoes(body.page ?? 1, body.registrationDateStart ?? new Date().toISOString(), body.registrationDateEnd ?? new Date().toISOString());
data = data.data.map((mp) => {
return {
referenceCode: mp.id,
valueCents: mp.amount,
content: mp.pix_qr_code,
status: mp.status,
registrationDate: mp.date_created,
paymentDate: mp.date_updated,
};
});
return {
qrcodes: data,
meta: {
current_page: body.page || 1,
total_pages: Math.ceil(data.length / 20),
total_items_amount: data.length,
total_value_cents: data.reduce((acc, curr) => acc + curr.valueCents, 0),
},
};
}
async getBalance() {
return {
valueCents: 0,
valueFloat: 0.0,
};
}
async searchPixBilling(body) {
var data = await this.consultarTransacaoPorId(body.reference);
return {
referenceCode: data.id,
valueCents: data.amount,
status: data.status,
registrationDate: data.date_created,
paymentDate: data.date_updated,
};
}
async generateProviderWidthdraw(body) {
const payload = {
api_key: this.apiKey,
amount: body.valueCents,
bank_account: {
bank_code: body.bankIspb,
agencia: body.agency,
conta: body.account,
conta_dv: '0',
type: body.accountType === 'checking' ? 'conta_corrente' : 'conta_poupanca',
document_number: body.receiverDocument,
legal_name: body.receiverName,
},
};
const response = await axios_1.default.post(`${this.baseUrl}/transfers`, payload, {
headers: this.getHeaders(),
});
return {
reference_code: response.data.id,
idempotent_id: body.idempotentId,
value_cents: body.valueCents,
pix_key_type: body.pixKeyType || '',
pix_key: body.pixKey || '',
receiver_name: body.receiverName,
receiver_document: body.receiverDocument,
status: response.data.status,
};
}
async listProviderWidthdraw(body) {
const params = {
api_key: this.apiKey,
page: body.page || 1,
count: 20,
date_created_since: body.registrationDateStart,
date_created_until: body.registrationDateEnd,
};
const response = await axios_1.default.get(`${this.baseUrl}/transfers`, {
headers: this.getHeaders(),
params,
});
const withdrawals = response.data.map((transfer) => ({
referenceCode: transfer.id,
idempotentId: transfer.correlation_id || '',
valueCents: transfer.amount,
pixKeyType: 'N/A',
pixKey: 'N/A',
receiverName: transfer.recipient_name,
receiverDocument: transfer.recipient_document_number,
status: transfer.status,
registrationDate: transfer.date_created,
paymentDate: transfer.date_updated,
cancellationDate: transfer.date_canceled || null,
cancellationReason: transfer.reason || null,
endToEnd: 'N/A',
}));
return {
payments: withdrawals,
meta: {
current_page: body.page || 1,
total_pages: Math.ceil(response.data.length / 20),
total_items_amount: response.data.length,
total_value_cents: withdrawals.reduce((acc, withdrawal) => acc + withdrawal.valueCents, 0),
},
};
}
async searchProviderWidthdraw(body) {
const response = await axios_1.default.get(`${this.baseUrl}/transfers/${body.correlationId}`, {
headers: this.getHeaders(),
params: { api_key: this.apiKey },
});
const transfer = response.data;
return {
referenceCode: transfer.id,
idempotentId: transfer.correlation_id || '',
valueCents: transfer.amount,
pixKeyType: 'N/A',
pixKey: 'N/A',
receiverName: transfer.recipient_name,
receiverDocument: transfer.recipient_document_number,
status: transfer.status,
registrationDate: transfer.date_created,
paymentDate: transfer.date_updated,
cancellationDate: transfer.date_canceled || null,
endToEnd: 'N/A',
};
}
}
exports.default = PagarMeProvider;