thunderpix
Version:
Biblioteca javascript de padronização de gateways de pagamentos PIX
117 lines (116 loc) • 4.72 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
class Payload {
data;
PAYLOAD_FORMAT_INDICATOR;
MERCHANT_ACCOUNT_INFORMATION;
MERCHANT_ACCOUNT_INFORMATION_GUI;
MERCHANT_ACCOUNT_INFORMATION_KEY;
MERCHANT_CATEGORY_CODE;
TRANSACTION_CURRENCY;
TRANSACTION_AMOUNT;
COUNTRY_CODE;
MERCHANT_NAME;
MERCHANT_CITY;
ADDITIONAL_DATA_FIELD;
ADDITIONAL_DATA_FIELD_TXTID;
CRC16;
constructor(data, PAYLOAD_FORMAT_INDICATOR = "00", MERCHANT_ACCOUNT_INFORMATION = "26", MERCHANT_ACCOUNT_INFORMATION_GUI = "00", MERCHANT_ACCOUNT_INFORMATION_KEY = "01", MERCHANT_CATEGORY_CODE = "52", TRANSACTION_CURRENCY = "53", TRANSACTION_AMOUNT = "54", COUNTRY_CODE = "58", MERCHANT_NAME = "59", MERCHANT_CITY = "60", ADDITIONAL_DATA_FIELD = "62", ADDITIONAL_DATA_FIELD_TXTID = "05", CRC16 = "63") {
this.data = data;
this.PAYLOAD_FORMAT_INDICATOR = PAYLOAD_FORMAT_INDICATOR;
this.MERCHANT_ACCOUNT_INFORMATION = MERCHANT_ACCOUNT_INFORMATION;
this.MERCHANT_ACCOUNT_INFORMATION_GUI = MERCHANT_ACCOUNT_INFORMATION_GUI;
this.MERCHANT_ACCOUNT_INFORMATION_KEY = MERCHANT_ACCOUNT_INFORMATION_KEY;
this.MERCHANT_CATEGORY_CODE = MERCHANT_CATEGORY_CODE;
this.TRANSACTION_CURRENCY = TRANSACTION_CURRENCY;
this.TRANSACTION_AMOUNT = TRANSACTION_AMOUNT;
this.COUNTRY_CODE = COUNTRY_CODE;
this.MERCHANT_NAME = MERCHANT_NAME;
this.MERCHANT_CITY = MERCHANT_CITY;
this.ADDITIONAL_DATA_FIELD = ADDITIONAL_DATA_FIELD;
this.ADDITIONAL_DATA_FIELD_TXTID = ADDITIONAL_DATA_FIELD_TXTID;
this.CRC16 = CRC16;
}
EVM(id, subject) {
if (subject.length > 99)
throw new Error("Content of EVM not over 99 chars!");
return (this.padder(id) + this.padder(subject.length) + subject.toString());
}
calcCRC16CCITT(subject) {
let result = 0xffff;
if (subject.length > 0) {
for (let offset = 0; offset < subject.length; offset++) {
result ^= subject.charCodeAt(offset) << 8;
for (let bitwise = 0; bitwise < 8; bitwise++) {
if ((result <<= 1) & 0x10000)
result ^= 0x1021;
result &= 0xffff;
}
}
}
return result.toString(16).toUpperCase();
}
padder(subject) {
return subject.toString().padStart(2, "0");
}
getPayloadFormatIndicator() {
return this.EVM(this.PAYLOAD_FORMAT_INDICATOR, "01");
}
getMerchantAccountInformation() {
if (!this.data.key)
throw new Error("Pix key is mandatory!");
const GUI = this.EVM(this.MERCHANT_ACCOUNT_INFORMATION_GUI, "BR.GOV.BCB.PIX");
const KEY = this.EVM(this.MERCHANT_ACCOUNT_INFORMATION_KEY, this.data.key);
return this.EVM(this.MERCHANT_ACCOUNT_INFORMATION, `${GUI}${KEY}`);
}
getMerchantCategoryCode() {
return this.EVM(this.MERCHANT_CATEGORY_CODE, "0000");
}
getTransactionCurrency() {
return this.EVM(this.TRANSACTION_CURRENCY, "986");
}
getTransactionAmount() {
if (this.data.amount !== undefined) {
const value = Number(this.data.amount).toFixed(2).toString();
return this.EVM(this.TRANSACTION_AMOUNT, value);
}
return "";
}
getCountryCode() {
return this.EVM(this.COUNTRY_CODE, "BR");
}
getMerchantName() {
if (!this.data.name)
throw new Error("Name is mandatory!");
return this.EVM(this.MERCHANT_NAME, this.data.name);
}
getMerchantCity() {
if (!this.data.city)
throw new Error("Citi is mandatory!");
return this.EVM(this.MERCHANT_CITY, this.data.city);
}
getTransactionId() {
if (this.data.transactionId !== undefined) {
const transactionId = this.EVM(this.ADDITIONAL_DATA_FIELD_TXTID, this.data.transactionId);
return this.EVM(this.ADDITIONAL_DATA_FIELD, transactionId);
}
return "";
}
getCRC16(subject) {
const calculated = this.calcCRC16CCITT(`${subject}6304`);
return this.EVM(this.CRC16, calculated);
}
get() {
const payload = this.getPayloadFormatIndicator() +
this.getMerchantAccountInformation() +
this.getMerchantCategoryCode() +
this.getTransactionCurrency() +
this.getTransactionAmount() +
this.getCountryCode() +
this.getMerchantName() +
this.getMerchantCity() +
this.getTransactionId();
return `${payload}${this.getCRC16(payload)}`;
}
}
exports.default = Payload;