Open hendmele opened 2 years ago
Sua implementação do str_pad para forçar os 4 caracteres adicionando zeros à esquerda está correta e está consonante com a documentação da API Pix.
Gente, podem atualizar isso, gerou uma dor de cabeça danada essa função.
Senhores,
Tenho tido alguns casos esporádicos (por enquanto 2 em cerca de 1000 códigos gerados), onde os aplicativos de banco não reconhecem a chave. Abaixo uma das chaves.
00020126730014br.gov.bcb.pix0136e57b119f-3f91-4734-93f0-29d6a9c02b0a0211CestaLivres520400005303986540522.005802BR5913Milena Savini6009Sao Paulo622605221wDQuczihqxiuSkkkLu0aS6304EA9
Quebrando a chave parte a parte de acordo com o manual do BACEN, notei que CRC16 está com 3 digitos (EA9) ao invés de 4 dígitos. Gerei manualmente o CRC16 e o resultado foi 0EA9.
Pelo que estou vendo, a função que gera o CRC16 está ignorando zero à esquerda e causando o problema. Podem avaliar comigo se é o caso? E quem sabe fazer a correção?
Não tenho tanta experiência assim para ter certeza absoluta que esse é o erro. Por ora eu fiz um patch pra colocar zero à esquerda e completar 4 caracteres do CRC16, mas não sei se posso estar introduzindo algum problema.
editei a função "" no arquivo Payload.php e ficou assim:
` /**
@return string */ 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 $crc16 = strtoupper(dechex($resultado)); $crc16 = str_pad($crc16,4,"0",STR_PAD_LEFT); //make sure it has 4 chars return self::ID_CRC16.'04'.$crc16; } `
Obrigado.