├── Pix.js
├── README.md
└── index.js
/Pix.js:
--------------------------------------------------------------------------------
1 | module.exports = class Pix {
2 | constructor(pixKey, description, merchantName, merchantCity, txid, amount) {
3 | this.pixKey = pixKey;
4 | this.description = description;
5 | this.merchantName = merchantName;
6 | this.merchantCity = merchantCity;
7 | this.txid = txid;
8 | this.amount = amount.toFixed(2);
9 |
10 | this.ID_PAYLOAD_FORMAT_INDICATOR = "00";
11 | this.ID_MERCHANT_ACCOUNT_INFORMATION = "26";
12 | this.ID_MERCHANT_ACCOUNT_INFORMATION_GUI = "00";
13 | this.ID_MERCHANT_ACCOUNT_INFORMATION_KEY = "01";
14 | this.ID_MERCHANT_ACCOUNT_INFORMATION_DESCRIPTION = "02";
15 | this.ID_MERCHANT_CATEGORY_CODE = "52";
16 | this.ID_TRANSACTION_CURRENCY = "53";
17 | this.ID_TRANSACTION_AMOUNT = "54";
18 | this.ID_COUNTRY_CODE = "58";
19 | this.ID_MERCHANT_NAME = "59";
20 | this.ID_MERCHANT_CITY = "60";
21 | this.ID_ADDITIONAL_DATA_FIELD_TEMPLATE = "62";
22 | this.ID_ADDITIONAL_DATA_FIELD_TEMPLATE_TXID = "05";
23 | this.ID_CRC16 = "63";
24 | }
25 |
26 | _getValue(id, value) {
27 | const size = String(value.length).padStart(2, "0");
28 | return id + size + value;
29 | }
30 |
31 | _getMechantAccountInfo() {
32 | const gui = this._getValue(
33 | this.ID_MERCHANT_ACCOUNT_INFORMATION_GUI,
34 | "br.gov.bcb.pix"
35 | );
36 | const key = this._getValue(
37 | this.ID_MERCHANT_ACCOUNT_INFORMATION_KEY,
38 | this.pixKey
39 | );
40 | const description = this._getValue(
41 | this.ID_MERCHANT_ACCOUNT_INFORMATION_DESCRIPTION,
42 | this.description
43 | );
44 |
45 | return this._getValue(
46 | this.ID_MERCHANT_ACCOUNT_INFORMATION,
47 | gui + key + description
48 | );
49 | }
50 |
51 | _getAdditionalDataFieldTemplate() {
52 | const txid = this._getValue(
53 | this.ID_ADDITIONAL_DATA_FIELD_TEMPLATE_TXID,
54 | this.txid
55 | );
56 | return this._getValue(this.ID_ADDITIONAL_DATA_FIELD_TEMPLATE, txid);
57 | }
58 |
59 | getPayload() {
60 | const payload =
61 | this._getValue(this.ID_PAYLOAD_FORMAT_INDICATOR, "01") +
62 | this._getMechantAccountInfo() +
63 | this._getValue(this.ID_MERCHANT_CATEGORY_CODE, "0000") +
64 | this._getValue(this.ID_TRANSACTION_CURRENCY, "986") +
65 | this._getValue(this.ID_TRANSACTION_AMOUNT, this.amount) +
66 | this._getValue(this.ID_COUNTRY_CODE, "BR") +
67 | this._getValue(this.ID_MERCHANT_NAME, this.merchantName) +
68 | this._getValue(this.ID_MERCHANT_CITY, this.merchantCity) +
69 | this._getAdditionalDataFieldTemplate();
70 |
71 | return payload + this._getCRC16(payload);
72 | }
73 |
74 | _getCRC16(payload) {
75 | function ord(str) {
76 | return str.charCodeAt(0);
77 | }
78 | function dechex(number) {
79 | if (number < 0) {
80 | number = 0xffffffff + number + 1;
81 | }
82 | return parseInt(number, 10).toString(16);
83 | }
84 |
85 | //ADICIONA DADOS GERAIS NO PAYLOAD
86 | payload = payload + this.ID_CRC16 + "04";
87 |
88 | //DADOS DEFINIDOS PELO BACEN
89 | let polinomio = 0x1021;
90 | let resultado = 0xffff;
91 | let length;
92 |
93 | //CHECKSUM
94 | if ((length = payload.length) > 0) {
95 | for (let offset = 0; offset < length; offset++) {
96 | resultado ^= ord(payload[offset]) << 8;
97 | for (let bitwise = 0; bitwise < 8; bitwise++) {
98 | if ((resultado <<= 1) & 0x10000) resultado ^= polinomio;
99 | resultado &= 0xffff;
100 | }
101 | }
102 | }
103 |
104 | //RETORNA CÓDIGO CRC16 DE 4 CARACTERES
105 | return this.ID_CRC16 + "04" + dechex(resultado).toUpperCase();
106 | }
107 | };
108 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
11 | Classe que gera um código pix estático pagável
12 |
13 |
14 |