pix-utils
Version:
Set of tools to parse, generate and validate payments of Brazil Instant Payment System (Pix)
58 lines • 5.84 kB
JavaScript
import { generatePixObject } from './assembler';
import { computeCRC } from './crc';
import { parseEmv } from './emvHandler';
import { PixElementType, } from './types/pixElements';
import { EmvAdditionalDataSchema, EmvMaiSchema, EmvSchema, } from './types/pixEmvSchema';
import { generateErrorObject } from './utils/generateErrorObject';
import { hasElementError, isPix } from './validate';
export function parsePix(brCode) {
// Parse EMV Code
const emvElements = parseEmv({ emvCode: brCode });
if (!emvElements.isValid)
return generateErrorObject('invalid emv code');
// Validate CRC16
const crc = computeCRC(brCode);
if (crc !== emvElements.getTag(EmvSchema.TAG_CRC))
return generateErrorObject('invalid crc');
// Extract Elements
const elements = extractElements(emvElements);
if (hasElementError(elements))
return generateErrorObject(elements.message);
return generatePixObject(elements);
}
export function extractMandatoryElements(emvElements) {
return {
merchantCategoryCode: emvElements.getTag(EmvSchema.TAG_MCC),
transactionCurrency: emvElements.getTag(EmvSchema.TAG_TRANSACTION_CURRENCY),
countryCode: emvElements.getTag(EmvSchema.TAG_COUNTRY_CODE),
merchantName: emvElements.getTag(EmvSchema.TAG_MERCHANT_NAME),
merchantCity: emvElements.getTag(EmvSchema.TAG_MERCHANT_CITY),
};
}
export function extractElements(emvElements) {
const basicElements = extractMandatoryElements(emvElements);
if (isPix(emvElements, 'static')) {
const amountNumber = +emvElements.getTag(EmvSchema.TAG_TRANSACTION_AMOUNT);
const transactionAmount = !isNaN(amountNumber) ? amountNumber : 0;
return {
type: PixElementType.STATIC,
...basicElements,
pixKey: emvElements.getSubTag(EmvMaiSchema.TAG_MAI_PIXKEY, EmvSchema.TAG_MAI),
transactionAmount,
infoAdicional: emvElements.getSubTag(EmvMaiSchema.TAG_MAI_INFO_ADD, EmvSchema.TAG_MAI),
txid: emvElements.getSubTag(EmvAdditionalDataSchema.TAG_TXID, EmvSchema.TAG_ADDITIONAL_DATA),
fss: emvElements.getSubTag(EmvMaiSchema.TAG_MAI_FSS, EmvSchema.TAG_MAI),
};
}
if (isPix(emvElements, 'dynamic')) {
return {
type: PixElementType.DYNAMIC,
...basicElements,
url: emvElements.getSubTag(EmvMaiSchema.TAG_MAI_URL, EmvSchema.TAG_MAI),
};
}
if (!isPix(emvElements, 'pix') || !isPix(emvElements, 'valid'))
return generateErrorObject('invalid pix');
return generateErrorObject('error');
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDaEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUNuQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sRUFFTCxjQUFjLEdBR2YsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFlBQVksRUFDWixTQUFTLEdBRVYsTUFBTSxzQkFBc0IsQ0FBQztBQUU5QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxNQUFNLFlBQVksQ0FBQztBQUVwRCxNQUFNLFVBQVUsUUFBUSxDQUFDLE1BQWM7SUFDckMsaUJBQWlCO0lBQ2pCLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ2xELElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTztRQUFFLE9BQU8sbUJBQW1CLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUV6RSxpQkFBaUI7SUFDakIsTUFBTSxHQUFHLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQy9CLElBQUksR0FBRyxLQUFLLFdBQVcsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQztRQUMvQyxPQUFPLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBRTVDLG1CQUFtQjtJQUNuQixNQUFNLFFBQVEsR0FBRyxlQUFlLENBQUMsV0FBVyxDQUFDLENBQUM7SUFFOUMsSUFBSSxlQUFlLENBQUMsUUFBUSxDQUFDO1FBQUUsT0FBTyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFNUUsT0FBTyxpQkFBaUIsQ0FBQyxRQUFRLENBQWUsQ0FBQztBQUNuRCxDQUFDO0FBRUQsTUFBTSxVQUFVLHdCQUF3QixDQUN0QyxXQUFzQjtJQUV0QixPQUFPO1FBQ0wsb0JBQW9CLEVBQUUsV0FBVyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDO1FBQzNELG1CQUFtQixFQUFFLFdBQVcsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLHdCQUF3QixDQUFDO1FBQzNFLFdBQVcsRUFBRSxXQUFXLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQztRQUMzRCxZQUFZLEVBQUUsV0FBVyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUM7UUFDN0QsWUFBWSxFQUFFLFdBQVcsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDO0tBQzlELENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxVQUFVLGVBQWUsQ0FDN0IsV0FBc0I7SUFFdEIsTUFBTSxhQUFhLEdBQUcsd0JBQXdCLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDNUQsSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxFQUFFO1FBQ2hDLE1BQU0sWUFBWSxHQUFHLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUMzRSxNQUFNLGlCQUFpQixHQUFHLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsRSxPQUFPO1lBQ0wsSUFBSSxFQUFFLGNBQWMsQ0FBQyxNQUFNO1lBQzNCLEdBQUcsYUFBYTtZQUNoQixNQUFNLEVBQUUsV0FBVyxDQUFDLFNBQVMsQ0FDM0IsWUFBWSxDQUFDLGNBQWMsRUFDM0IsU0FBUyxDQUFDLE9BQU8sQ0FDbEI7WUFDRCxpQkFBaUI7WUFDakIsYUFBYSxFQUFFLFdBQVcsQ0FBQyxTQUFTLENBQ2xDLFlBQVksQ0FBQyxnQkFBZ0IsRUFDN0IsU0FBUyxDQUFDLE9BQU8sQ0FDbEI7WUFDRCxJQUFJLEVBQUUsV0FBVyxDQUFDLFNBQVMsQ0FDekIsdUJBQXVCLENBQUMsUUFBUSxFQUNoQyxTQUFTLENBQUMsbUJBQW1CLENBQzlCO1lBQ0QsR0FBRyxFQUFFLFdBQVcsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsT0FBTyxDQUFDO1NBQ3hFLENBQUM7S0FDSDtJQUNELElBQUksS0FBSyxDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsRUFBRTtRQUNqQyxPQUFPO1lBQ0wsSUFBSSxFQUFFLGNBQWMsQ0FBQyxPQUFPO1lBQzVCLEdBQUcsYUFBYTtZQUNoQixHQUFHLEVBQUUsV0FBVyxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQyxPQUFPLENBQUM7U0FDeEUsQ0FBQztLQUNIO0lBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQztRQUM1RCxPQUFPLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBRTVDLE9BQU8sbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDdEMsQ0FBQyJ9