sdk-node-apis-efi
Version:
Module for integration with Efi Bank API
68 lines (67 loc) • 2.59 kB
JavaScript
;
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')}`,
};
}