UNPKG

thunderpix

Version:

Biblioteca javascript de padronização de gateways de pagamentos PIX

250 lines (218 loc) 8.07 kB
import axios from 'axios'; import ProviderInterface from '../../interfaces/ProviderInterface'; interface ProviderConstruct { apiKey: string; isTest: boolean; } export default class AsaasProvider implements ProviderInterface { private baseUrl: string; private apiKey: string; public providerInfo = { name: 'Asaas', description: 'Plataforma brasileira de gestão financeira e pagamentos online.', documentation: 'https://asaasv3.docs.apiary.io/', isOnline: true, vendor: { name: 'Asaas', shotname: 'asaas', url: 'https://www.asaas.com', api: 'https://www.asaas.com/api', versions: [ { name: 'br.com.asaas.api-v3', version: 'v3', path: '/v3', }, ], }, }; constructor(configs: ProviderConstruct) { this.apiKey = configs.apiKey; this.baseUrl = configs.isTest ? 'https://sandbox.asaas.com/api/v3' : 'https://www.asaas.com/api/v3'; } listingPixBilling(body?: object): Promise<Object> { throw new Error('Method not implemented.'); } searchPixBilling(body?: object): Promise<Object> { throw new Error('Method not implemented.'); } // Função auxiliar para configurar os headers com token de autorização private getHeaders(): any { return { 'Content-Type': 'application/json', 'access_token': this.apiKey, }; } // Geração de cobrança via PIX (Assas) async gerarQrCodePix( valueCents: number, description: string, customer: { name: string; email: string; phone: string; document: string; } ) { const payload = { customer: { name: customer.name, cpfCnpj: customer.document, email: customer.email, phone: customer.phone, }, billingType: 'PIX', value: valueCents / 100, // Valor em reais description, dueDate: new Date().toISOString().split('T')[0], // Data de vencimento }; const response = await axios.post(`${this.baseUrl}/payments`, payload, { headers: this.getHeaders(), }); return response.data; } // Listar cobranças async listarCobrancas(page: number = 1, startDate?: string, endDate?: string) { const params = { offset: (page - 1) * 10, limit: 10, dateCreated: startDate ? `${startDate},${endDate}` : undefined, }; const response = await axios.get(`${this.baseUrl}/payments`, { headers: this.getHeaders(), params, }); return response.data; } // Consultar cobrança por ID async consultarCobrancaPorId(paymentId: string) { const response = await axios.get(`${this.baseUrl}/payments/${paymentId}`, { headers: this.getHeaders(), }); return response.data; } // Estornar cobrança PIX async estornarCobranca(paymentId: string) { const response = await axios.post( `${this.baseUrl}/payments/${paymentId}/refund`, {}, { headers: this.getHeaders(), } ); return response.data; } // Função para gerar cobrança Pix e retorno formatado async generatingPixBilling(body: PixGeneratingPixBillingInterface): Promise<Object> { const valueCents = Math.round(body.valueCents); const data = await this.gerarQrCodePix(valueCents, body.description, { name: body.name, email: body.email, phone: body.phone, document: body.document, }); return { qrcode: data.pixQrCode, // QR Code em base64 pixkey: data.pixQrCodeId, // ID da transação PIX value: { original: body.valueCents, cents: valueCents, fixed: (valueCents / 100).toFixed(2), float: valueCents / 100, }, expires: { timestamp: new Date().getTime() / 1000 + 3600, // 1 hora dateTime: new Date().toLocaleString('pt-BR'), iso: new Date().toISOString(), }, code: data.id, // Código de referência }; } // Consultar saldo da conta Asaas async getBalance(): Promise<BalanceOutput> { const response = await axios.get(`${this.baseUrl}/finance/balance`, { headers: this.getHeaders(), }); const balance = response.data; return { valueCents: Math.round(balance.balance * 100), // Converte para centavos valueFloat: balance.balance, // Valor decimal }; } // Listar saques (withdrawals) async listProviderWidthdraw(body: listProviderWidthdraw): Promise<listProviderWidthdrawOutput> { const params = { offset: (body.page - 1) * 10, limit: 10, startDate: body.registrationDateStart, endDate: body.registrationDateEnd, }; const response = await axios.get(`${this.baseUrl}/transfers`, { headers: this.getHeaders(), params, }); const withdrawals = response.data.data.map((withdrawal: any) => ({ referenceCode: withdrawal.id, idempotentId: withdrawal.id, valueCents: withdrawal.value * 100, pixKeyType: 'CPF', pixKey: withdrawal.bankAccount, receiverName: withdrawal.name, receiverDocument: withdrawal.cpfCnpj, status: withdrawal.status, registrationDate: withdrawal.dateCreated, paymentDate: withdrawal.datePayment, })); return { payments: withdrawals, meta: { current_page: body.page, total_pages: Math.ceil(response.data.totalCount / 10), total_items_amount: response.data.totalCount, total_value_cents: withdrawals.reduce((acc: any, curr: any) => acc + curr.valueCents, 0), }, }; } // Função de saque (withdrawal) async generateProviderWidthdraw(body: PixGenerateProviderWidthdraw): Promise<generateProviderWidthdrawOutput> { const payload = { bankAccount: body.pixKey, value: (body.valueCents / 100).toFixed(2), description: `Saque para ${body.receiverName}`, }; const response = await axios.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 || 'NA', pix_key: body.pixKey || 'NA', receiver_name: body.receiverName, receiver_document: body.receiverDocument, status: response.data.status, }; } // Consultar saque por referência async searchProviderWidthdraw(body: { correlationId: string }): Promise<Object> { const response = await axios.get(`${this.baseUrl}/transfers/${body.correlationId}`, { headers: this.getHeaders(), }); const withdrawal = response.data; return { referenceCode: withdrawal.id, idempotentId: withdrawal.id, valueCents: withdrawal.value * 100, pixKeyType: 'CPF', pixKey: withdrawal.bankAccount, receiverName: withdrawal.name, receiverDocument: withdrawal.cpfCnpj, status: withdrawal.status, registrationDate: withdrawal.dateCreated, paymentDate: withdrawal.datePayment, }; } }