UNPKG

sdk-node-apis-efi

Version:

Module for integration with Efi Bank API

68 lines (67 loc) 2.59 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.computeCRC = computeCRC; exports.buildPixPayload = buildPixPayload; exports.createStaticPix = createStaticPix; const qrcode_1 = __importDefault(require("qrcode")); function computeCRC(value) { const bytes = Buffer.from(value, 'utf8'); let crc = 0xffff; for (const byte of bytes) { crc ^= byte << 8; for (let i = 0; i < 8; i += 1) { crc = crc & 0x8000 ? (crc << 1) ^ 0x1021 : crc << 1; crc &= 0xffff; } } return crc.toString(16).toUpperCase().padStart(4, '0'); } function tlv(tag, value) { return `${tag.padStart(2, '0')}${String(value.length).padStart(2, '0')}${value}`; } function buildPixPayload({ chave, merchantName, merchantCity, transactionAmount, txid = '***', infoAdicional, oneTime = false, merchantCategoryCode = '0000', transactionCurrency = 986, countryCode = 'BR', }) { if (!chave) throw new Error('A chave PIX e obrigatoria'); if (!merchantName) throw new Error('O nome do recebedor e obrigatorio'); if (!merchantCity) throw new Error('A cidade do recebedor e obrigatoria'); let payload = tlv('00', '01'); if (oneTime) { payload += tlv('02', '12'); } let merchantAccountInfo = tlv('00', 'br.gov.bcb.pix'); merchantAccountInfo += tlv('01', chave); if (infoAdicional) { merchantAccountInfo += tlv('02', infoAdicional); } payload += tlv('26', merchantAccountInfo); payload += tlv('52', merchantCategoryCode); payload += tlv('53', String(transactionCurrency).padStart(3, '0')); if (transactionAmount !== undefined && transactionAmount !== null) { const amount = transactionAmount.toFixed(2).replace(/\.00$/, ''); payload += tlv('54', amount); } payload += tlv('58', countryCode); payload += tlv('59', merchantName); payload += tlv('60', merchantCity); payload += tlv('62', tlv('05', txid)); payload += '6304'; payload += computeCRC(payload); return payload; } async function createStaticPix(options) { const payload = buildPixPayload(options); const svgString = await qrcode_1.default.toString(payload, { type: 'svg', errorCorrectionLevel: 'L', margin: 4, }); return { qrcode: payload, imagemQrcode: `data:image/svg+xml;base64,${Buffer.from(svgString).toString('base64')}`, }; }