├── 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 | Logo 6 | 7 | 8 |

pix-js

9 | 10 |

11 | Classe que gera um código pix estático pagável 12 |
13 | 14 |

15 |

16 | 17 | 18 | 19 | ## Sobre o projeto 20 | 21 | Se você precisa criar um QR code pix usando Javascript, essa classe pode te ajudar. Conteúdo baseado na [versão em PHP do William Costa](https://github.com/william-costa/wdev-qrcode-pix-estatico-php). 22 | 23 | ## Objetivos do projeto 24 | 25 | - [x] Aprender sobre o PIX 26 | - [x] Gerar códigos PIX personalizados 27 | - [x] Praticar classes no javascript 28 | 29 | ## Exemplo 30 | 31 | Exemplo da criação de um código no valor de R$ 5,50 32 | 33 | ```js 34 | const Pix = require("./Pix"); 35 | const pix = new Pix( 36 | ">CHAVE PIX<", 37 | ">DESCRIÇÃO DO PAGAMENTO<", 38 | ">NOME DO BENEFICIADO<", 39 | ">CIDADE<", 40 | ">TXID<", 41 | 5.5 42 | ); 43 | 44 | const payload = pix.getPayload(); 45 | ``` 46 | 47 | O conteúdo do payload deve ser algo como a string abaixo. Agora basta inserir essa string em um QR code da forma que for mais conveniente. 48 | 49 | `00020126610014br.gov.bcb.pix0111>CHAVE PIX<0224>DESCRIÇÃO DO PAGAMENTO<52040000530398654045.505802BR5921>NOME DO BENEFICIADO<6008>CIDADE<62100506>TXID<6304A2F7` 50 | 51 | ## Contact 52 | 53 | Gabriel - [@ezrealblindado](https://twitter.com/ezrealblindado) - gabrielrocha1997@gmail.com 54 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const Pix = require("./Pix"); 2 | const pix = new Pix( 3 | ">CHAVE PIX<", 4 | ">DESCRIÇÃO DO PAGAMENTO<", 5 | ">NOME DO BENEFICIADO<", 6 | ">CIDADE<", 7 | ">TXID<", 8 | 5.5 9 | ); 10 | 11 | const payload = pix.getPayload(); 12 | --------------------------------------------------------------------------------