28/02/2024
Este artigo explica como gerar QR Code e Código PIX usando PHP, especificando, além da chave para pagamento, o valor para pagamento e um identificador de transação.
Segue abaixo o código PHP completo que ilustra como gerar QR Code e Código PIX. Este script inclui funções para formatação de campos, cálculo do CRC16, e geração do código PIX, abordando a especificação da chave para pagamento, o valor do pagamento, e um identificador de transação.
<?php
function formataCampo($id, $valor) {
return $id . str_pad(strlen($valor), 2, '0', STR_PAD_LEFT) . $valor;
}
function calculaCRC16($dados) {
$resultado = 0xFFFF;
for ($i = 0; $i < strlen($dados); $i++) {
$resultado ^= (ord($dados[$i]) << 8);
for ($j = 0; $j < 8; $j++) {
if ($resultado & 0x8000) {
$resultado = ($resultado << 1) ^ 0x1021;
} else {
$resultado <<= 1;
}
$resultado &= 0xFFFF;
}
}
return strtoupper(str_pad(dechex($resultado), 4, '0', STR_PAD_LEFT));
}
function geraPix($chave, $idTx = '', $valor = 0.00) {
$resultado = "000201";
$resultado .= formataCampo("26", "0014br.gov.bcb.pix" . formataCampo("01", $chave));
$resultado .= "52040000"; // Código fixo
$resultado .= "5303986"; // Moeda (Real)
if ($valor > 0) {
$resultado .= formataCampo("54", number_format($valor, 2, '.', ''));
}
$resultado .= "5802BR"; // País
$resultado .= "5901N"; // Nome
$resultado .= "6001C"; // Cidade
$resultado .= formataCampo("62", formataCampo("05", $idTx ?: '***'));
$resultado .= "6304"; // Início do CRC16
$resultado .= calculaCRC16($resultado); // Adiciona o CRC16 ao final
return $resultado;
}
// Exemplos de chave PIX
//
// E-mail: nome@exemplo.com.br
// CPF: 12345678901 (só números)
// CNPJ: 12345678000123 (só números)
// Celular: +5511912345678 (+55 + DDD + número)
//
$chave = "nome@exemplo.com.br";
// Valor da transação
$valorTransacao = 1.23;
// Identificador único da transação, caso exista
$idTransacao = "";
// Obtem código copia e cola do PIX
$codigoPix = geraPix($chave, $idTransacao, $valorTransacao);
// Exibe o QRCode com o PIX
echo '<p><img src="https://chart.googleapis.com/chart?cht=qr&chs=300x300&chl=' . urlencode($codigoPix) . '"></p>';
// Exibe o Código PIX (copia e cola)
echo "<p>Código PIX: " . $codigoPix . "<p>";
?>
Para garantir um entendimento completo, vamos decompor o código fornecido, explicando cada função e como elas interagem para gerar o código PIX e o QR Code.
A função formataCampo()
concatena o ID do campo, o tamanho do valor e o valor.
function formataCampo($id, $valor) {
return $id . str_pad(strlen($valor), 2, '0', STR_PAD_LEFT) . $valor;
}
A função calculaCRC16()
calcula o CRC16 dos dados para validar o código PIX. Utiliza operações bit a bit para processar cada caractere dos dados.
function calculaCRC16($dados) {
$resultado = 0xFFFF;
for ($i = 0; $i < strlen($dados); $i++) {
$resultado ^= (ord($dados[$i]) << 8);
for ($j = 0; $j < 8; $j++) {
if ($resultado & 0x8000) {
$resultado = ($resultado << 1) ^ 0x1021;
} else {
$resultado <<= 1;
}
$resultado &= 0xFFFF;
}
}
return strtoupper(str_pad(dechex($resultado), 4, '0', STR_PAD_LEFT));
}
A função geraPix()
gera o código PIX completo, incorporando todos os campos necessários para a transação, incluindo a chave PIX, o valor e o identificador da transação.
function geraPix($chave, $idTx = '', $valor = 0.00) {
$resultado = "000201";
$resultado .= formataCampo("26", "0014br.gov.bcb.pix" . formataCampo("01", $chave));
$resultado .= "52040000"; // Código fixo
$resultado .= "5303986"; // Moeda (Real)
if ($valor > 0) {
$resultado .= formataCampo("54", number_format($valor, 2, '.', ''));
}
$resultado .= "5802BR"; // País
$resultado .= "5901N"; // Nome
$resultado .= "6001C"; // Cidade
$resultado .= formataCampo("62", formataCampo("05", $idTx ?: '***'));
$resultado .= "6304"; // Início do CRC16
$resultado .= calculaCRC16($resultado); // Adiciona o CRC16 ao final
return $resultado;
}
Para iniciar uma transação PIX, é essencial definir a chave PIX do destinatário, que identifica a conta para recebimento. A chave pode ser um e-mail, CPF, CNPJ ou número de celular. Neste exemplo, utilizamos um endereço de e-mail como chave PIX.
// Exemplos de chave PIX
//
// E-mail: nome@exemplo.com.br
// CPF: 12345678901 (só números)
// CNPJ: 12345678000123 (só números)
// Celular: +5511912345678 (+55 + DDD + número)
//
$chave = "nome@exemplo.com.br";
Para completar a transação PIX, precisamos definir o valor a ser transferido e, opcionalmente, um identificador único para a transação. O valor é especificado em reais, enquanto o identificador pode ser qualquer string que ajude a associar a transação a uma venda, como um código de pedido ou de identificação do cliente.
// Valor da transação
$valorTransacao = 1.23;
// Identificador único da transação, caso exista
$idTransacao = "";
Após definir a chave PIX, o valor da transação e o identificador único, o próximo passo é gerar o código PIX propriamente dito. Utilizamos a função geraPix()
para criar esse código. Com o código em mãos, geramos um QR Code para facilitar o pagamento, usando um serviço externo de geração de QR Codes. Finalmente, exibimos tanto o QR Code quanto o código PIX em texto, permitindo que seja facilmente copiado e utilizado em transações.
// Obtem código copia e cola do PIX
$codigoPix = geraPix($chave, $idTransacao, $valorTransacao);
// Exibe o QRCode com o PIX
echo '<p><img src="https://chart.googleapis.com/chart?cht=qr&chs=300x300&chl=' . urlencode($codigoPix) . '"></p>';
// Exibe o Código PIX (copia e cola)
echo "<p>Código PIX: " . $codigoPix . "<p>";
Este artigo demonstrou como gerar QR Code e código PIX para pagamentos em PHP. Antes de implementar em ambientes de produção, teste rigorosamente o código e o QR Code gerado para assegurar a precisão e a segurança das transações com seus clientes.