generate qr code from pix function implementation

can't use the qrcode-pix library because of a broken dependency based on crc v4.1.1, so, needed to use a previous version from crc
This commit is contained in:
RcleydsonR 2022-11-04 01:09:33 -03:00
parent ca419792ab
commit 810f44071b
2 changed files with 82 additions and 0 deletions

View File

@ -14,6 +14,8 @@
"dependencies": { "dependencies": {
"@headlessui/vue": "^1.7.3", "@headlessui/vue": "^1.7.3",
"@heroicons/vue": "^2.0.12", "@heroicons/vue": "^2.0.12",
"crc": "^3.8.0",
"qrcode": "^1.5.1",
"vue": "^3.2.41", "vue": "^3.2.41",
"vue-router": "^4.1.5" "vue-router": "^4.1.5"
}, },

80
src/utils/QrCodePix.ts Normal file
View File

@ -0,0 +1,80 @@
import qrcode from 'qrcode';
import type {QRCodeToDataURLOptions} from 'qrcode';
import { crc16ccitt } from 'crc';
interface PixParams {
pixKey: string;
merchantCity: string;
merchantName: string;
value?: number;
transactionId?: string;
message?: string;
cep?: string;
currency?: number;
countryCode?: string;
}
const Pix = ({
pixKey,
merchantCity,
merchantName,
value,
message,
cep,
transactionId = '',
currency = 986,
countryCode = 'BR',
}: PixParams) => {
const payloadKeyString = generatePixKey(pixKey, message);
const payload: string[] = [
formatEMV('00', '01'), //Payload Format Indicator
formatEMV('26', payloadKeyString), // Merchant Account Information
formatEMV('52', '0000'), //Merchant Category Code
formatEMV('53', String(currency)), // Transaction Currency
];
if (String(value) === '0') {
value = undefined;
}
if (value) {
payload.push(formatEMV('54', value.toFixed(2)));
}
payload.push(formatEMV('58', countryCode.toUpperCase())); // Country Code
payload.push(formatEMV('59', merchantName)); // Merchant merchantName
payload.push(formatEMV('60', merchantCity)); // Merchant merchantCity
if (cep) {
payload.push(formatEMV('61', cep)); // Postal Code
}
payload.push(formatEMV('62', formatEMV('05', transactionId))); // Additional Data Field Template
payload.push('6304');
const stringPayload = payload.join('');
const crcResult = crc16ccitt(stringPayload).toString(16).toUpperCase().padStart(4, '0');
const payloadPIX = `${stringPayload}${crcResult}`;
return {
payload: (): string => payloadPIX,
base64QrCode: (options?: QRCodeToDataURLOptions): Promise<string> => qrcode.toDataURL(payloadPIX, options),
};
}
const generatePixKey = (pixKey: string, message?: string): string => {
const payload: string[] = [formatEMV('00', 'BR.GOV.BCB.PIX'), formatEMV('01', pixKey)];
if (message) {
payload.push(formatEMV('02', message));
}
return payload.join('');
}
const formatEMV = (id: string, param: string): string => {
const len = param.length.toString().padStart(2, '0');
return `${id}${len}${param}`;
}
export {type PixParams, Pix };