Pix QRCode Estático - PHP

Pix Logo

PIX

Pix é um modo de transferência monetária instantâneo e de pagamento eletrônico instantâneo em real brasileiro, oferecido pelo Banco Central do Brasil a pessoas físicas e jurídicas, que funciona 24 horas, ininterruptamente, sendo o mais recente meio de pagamento do Sistema de Pagamentos Brasileiro.

PIX e QRCode

O QR Code dinâmico e o QR Code estático, enquanto mecanismos para envio ou disponibilização prévia de informações para fins de iniciação de um Pix, seguirão o padrão do BR Code, nos termos do Manual do BR Code1. Nesses casos, o usuário recebedor disponibiliza os dados de pagamento em um QR Code, para ser capturado por imagem pelo usuário pagador. Podem atuar na emissão de QR Code o prestador de serviços de pagamento (PSP) do recebedor, a Secretaria do Tesouro Nacional (STN) e, em casos de uso específicos, órgãos do governo federal2 , enquanto usuários finais do Pix, desde que possuam contrato firmado com o BCB para fins de utilização do Sisbacen e que apresentem a certificação de segurança requerida para essa finalidade3 . O aplicativo do PSP do usuário pagador, que deve estar instalado em seu dispositivo móvel e que é utilizado para a leitura do QR Code, acessará o backend4 do PSP do pagador, que gera a ordem de pagamento.

Definições Gerais do BRCode

Conforme especificado no Manual do BR Code, o Pix precisa definir seu GUI (identificador único do arranjo) para ser utilizado ao longo dos IDs

GUI Do Pix Valor Tamanho
GUI - Globally Unique Identifier br.gov.bcb.pix 14 Caracteres

O QR Code estático no Pix conterá o seguinte conjunto de informações:

ID Nome BR Code Tamanho Valor
00 Payload Format Indicator 02 01
26 Merchant Account Information 58 GUI + Chave
52 Merchant Category Code 04 0000
53 Transaction Currency 03 986
58 Country Code 02 BR
59 Merchant Name 13 Fulano de Tal
60 Merchant City 08 Brasilia
62 Aditional Field Data Template 07 ID + nome + tamanho + valor
63 CRC 16 04 0x1D3D – incluindo “6304” (ID 63 e tamanho 04)

Em nosso código PHP adicionamos o ID em constantes:

    const ID_PAYLOAD_FORMAT_INDICATOR = '00';
    const ID_MERCHANT_ACCOUNT_INFORMATION = '26';
    const ID_MERCHANT_ACCOUNT_INFORMATION_GUI = '00';
    const ID_MERCHANT_ACCOUNT_INFORMATION_KEY = '01';
    const ID_MERCHANT_ACCOUNT_INFORMATION_DESCRIPTION = '02';
    const ID_MERCHANT_CATEGORY_CODE = '52';
    const ID_TRANSACTION_CURRENCY = '53';
    const ID_TRANSACTION_AMOUNT = '54';
    const ID_COUNTRY_CODE = '58';
    const ID_MERCHANT_NAME = '59';
    const ID_MERCHANT_CITY = '60';
    const ID_ADDITIONAL_DATA_FIELD_TEMPLATE = '62';
    const ID_ADDITIONAL_DATA_FIELD_TEMPLATE_TXID = '05';
    const ID_CRC16 = '63';

CRC16

O CRC16 é usado para verificar se os dados enviados na transação foram corrompidos ou alterados durante a transmissão. Se houver alguma discrepância no código CRC16 recebido, a transação é considerada inválida e não é processada. em nosso código utilizamos o seguinte metódo para Calculo do CRC16 com constantes hexadecimal que são definidas pela documentação do PIX

 private function getCRC16($payload) {
        //ADICIONA DADOS GERAIS NO PAYLOAD
        $payload .= self::ID_CRC16.'04';
  
        //DADOS DEFINIDOS PELO BACEN
        $polinomio = 0x1021;
        $resultado = 0xFFFF;
  
        //CHECKSUM
        if (($length = strlen($payload)) > 0) {
            for ($offset = 0; $offset < $length; $offset++) {
                $resultado ^= (ord($payload[$offset]) << 8);
                for ($bitwise = 0; $bitwise < 8; $bitwise++) {
                    if (($resultado <<= 1) & 0x10000) $resultado ^= $polinomio;
                    $resultado &= 0xFFFF;
                }
            }
        }
  
        //RETORNA CÓDIGO CRC16 DE 4 CARACTERES
        return self::ID_CRC16.'04'.strtoupper(dechex($resultado));
    }