Ofereço ajuda em Java, C/C++, Python, C#, LISP, AutoLisp, AutoCAD
+55 (062) 98553-6711
Ofereço ajuda em PHP, Python, C#, JavaScript, Laravel, Google Ads e SEO
+55 (062) 98243-1195

Você está aqui: PHP ::: Boletos Bancários, Arquivos de Remessa e Retornos do Banco ::: Caixa Econômica Federal - Banco 104

Boleto Bancário PHP - Como montar a linha digitável (representação numérica do código de barras) e seu dígito verificador (Módulo 10) - Boleto Caixa Econômica

Quantidade de visualizações: 3379 vezes
Esta dica fecha nossa série de estudos sobre os boletos bancários da Caixa Econômica (Banco 104). Na dica anterior vimos como montar o código de barras e o seu dígito verificador. E, uma vez montado o código de barras completo, já temos todas as informações para montar sua representação numérica, ou seja, a linha digitável do boleto. Dessa forma, é importante que você entenda bem as funções demonstradas nas dicas anteriores.

Na Especificação do Código de Barras para Bloquetos de Cobrança Sem Registro e Registrada no SIGCB (67.119 v005 micro), a linha digitável, ou representação numérica, para a cobrança contém cinco campos, conforme discriminação a seguir:

1º Campo - Composto por: código do banco (posições 1 a 3 do código de barras), código da moeda (posição 4 do código de barras), as cinco primeiras posições do campo livre (posições 20 a 24 do código de barras) e digito verificador deste campo;

2º Campo - Composto pelas posições 6 a 15 do campo livre (posições 25 a 34 do código de barras) e digito verificador deste campo;

3º Campo - Composto pelas posições 16 a 25 do campo livre (posições 35 a 44 do código de barras) e digito verificador deste campo;

4º Campo - Dígito verificador geral do código de barras (posição 5 do código de barras);

5º Campo - Composto pelo "fator de vencimento" (posições 6 a 9 do código de barras) e pelo valor nominal do documento (posições 10 a 19 do código de barras), com a inclusão de zeros entre eles até compor as 14 posições do campo e sem edição (sem ponto e sem vírgula). Não obstante existam 10 posições, o valor nominal do documento não poderá exceder R$ 9.999.999,99.

O cálculo que mostrarei a seguir está de acordo com as instruções do Manual de Leiaute de Arquivo Eletrônico Padrão CNAB 240 - Cobrança Bancária Caixa - SIGCB - Versão 67.118 v024 micro e Especificação do Código de Barras para Bloquetos de Cobrança Sem Registro e Registrada no SIGCB (67.119 v005 micro). Tenha certeza de verificar sua versão do manual antes de usar o código apresentado.

Dito isso, veja o código PHP completo para uma função que recebe o código de barras completo e retorna a linha digitável, devidamente espaçada e com os pontos, conforme recomendações do manual:

----------------------------------------------------------------------
Precisa de ajuda? Chama no WhatsApp +55 (62) 98553-6711 (Osmar)

Este código foi útil? Paga um cafezinho pra mim :-(
PIX: osmar@arquivodecodigos.com.br 
----------------------------------------------------------------------

<?php
  // função que recebe o código de barras completo
  // e monta a linha digitável do boleto
  function montarLinhaDigitavel($codigoBarras){
    // vamos nos concentrar no primeiro campo
    $campo1 = substr($codigoBarras, 0, 3) .
      substr($codigoBarras, 3, 1) . substr($codigoBarras, 19, 5);
	  
    // agora o segundo campo
    $campo2 = substr($codigoBarras, 24, 10);   
	
    // agora o terceiro campo
    $campo3 = substr($codigoBarras, 34, 10);
	
    // agora o quarto campo
    $campo4 = substr($codigoBarras, 4, 1);
	
    // finalmente o quinto campo
    $campo5 = substr($codigoBarras, 5, 4) .
      substr($codigoBarras, 9, 10);
	
    $linhaDigitavel = substr($campo1, 0, 5) . "." . substr($campo1, 5, 5) . 
     dvLinhaDigitavel($campo1) . " " . substr($campo2, 0, 5) . "." 
     . substr($campo2, 5, 5) . dvLinhaDigitavel($campo2) . 
     " " . substr($campo3, 0, 5) . "."  . substr($campo3, 5, 5) . 
     dvLinhaDigitavel($campo3) . " " . $campo4 . " " . $campo5;
	
    return $linhaDigitavel;  
  }
  
  // atenção a esta função. Aqui nós usamos o Módulo 10
  function dvLinhaDigitavel($valor){
    // vamos inverter o valor
    $valor = strrev($valor);
    // vamos definir os índices de múltiplicação
    $indices = "2121212121";
    // e aqui a soma da multiplicação coluna por coluna
    $soma = 0;
	
    // fazemos a multiplicação coluna por coluna agora
    for($i = 0; $i < strlen($valor); $i++){
      $res = ((int)($valor[$i])) * 
       ((int)($indices[$i]));
	   
      // Quando o resultado da multiplicação for um número 
      // com 2 dígitos, somar os 2 algarismos.
      // Ex: (10: 1+0 = 1). 
      if($res > 9){
	// vamos converter o valor númerico em string
	$res = strval($res);
	$res = ((int)($res[0]) + (int)($res[1]));   
      }
	   
      $soma = $soma + $res;   
    }
	
    // obtemos o resto da divisão da soma por 10
    $resto = $soma % 10;
    
    //  Se o resto da divisão for 0 (zero), o DV 
    // será 0 (zero).
    if($resto == 0){
      $digito = 0;	
    }
    // Se o Total da Soma for inferior a 10, o DV corresponde
    // à diferença entre 10 e o Total da Soma
    else if($soma < 10){
      $digito = 10 - $soma;	
    }
    else{ 
      // subtraímos onze pelo resto da divisão
      $digito = 10 - $resto;  	
    }
	
    return $digito;  
  }
    
  // ATENÇÃO: Se você ainda não entende os dados abaixo.
  // revise as dicas anteriores antes de continuar
  
  $banco = "104";
  $moeda = "9";
  $carteira = "1"; //  
  $emissao = "4"; // cedente
  $nossoNumero = "222333777777777";
  $valor = "321.12"; // sempre duas casas decimais
  $vencimento = "23/08/2006";
  $fator = fatorVencimento($vencimento);
  $nossoNumeroCompleto = $carteira . $emissao . $nossoNumero;
  $cedente = "005507";
  $dvCedente = dvCodigoCedente($cedente);
  $campoLivre = montarCampoLivre($cedente, $dvCedente,
    $nossoNumeroCompleto);
  $codigoBarras = montarCodigoBarras($banco, $moeda, $fator,
    $valor, $campoLivre);
  
  // agora que temos o código de barras completo, vamos
  // montar a linha digitável
  $linhaDigitavel = montarLinhaDigitavel($codigoBarras);
  // e mostramos o resultado
  echo "A linha digitável completa é: " . $linhaDigitavel;
?>

Ao executar este código PHP nós teremos o seguinte resultado:

A linha digitável completa é: 10490.05505 77222.133348 77777.777713 4 32420000032112

Para não deixar o código desta dica muito longo, eu omiti algumas funções, que podem ser facilmente encontradas nas dicas anteriores.

Link para compartilhar na Internet ou com seus amigos:

Desafios, Exercícios e Algoritmos Resolvidos de PHP

Veja mais Dicas e truques de PHP

Dicas e truques de outras linguagens

E-Books em PDF

E-Book 350 Exercícios Resolvidos de Java - PDF com 500 páginas
Domine lógica de programação e a linguagem Java com o nosso E-Book 350 Exercícios Exercícios de Java, para você estudar onde e quando quiser.

Este e-book contém exercícios resolvidos abrangendo os tópicos: Java básico, matemática e estatística, programação dinâmica, strings e caracteres, entrada e saída, estruturas condicionais, vetores e matrizes, funções, laços, recursividade, internet, arquivos e diretórios, programação orientada a objetos e muito mais.
Ver Conteúdo do E-book
E-Book 650 Dicas, Truques e Exercícios Resolvidos de Python - PDF com 1.200 páginas
Domine lógica de programação e a linguagem Python com o nosso E-Book 650 Dicas, Truques e Exercícios Exercícios de Python, para você estudar onde e quando quiser.

Este e-book contém dicas, truques e exercícios resolvidos abrangendo os tópicos: Python básico, matemática e estatística, banco de dados, programação dinâmica, strings e caracteres, entrada e saída, estruturas condicionais, vetores e matrizes, funções, laços, recursividade, internet, arquivos e diretórios, programação orientada a objetos e muito mais.
Ver Conteúdo do E-book

Linguagens Mais Populares

1º lugar: Java
2º lugar: Python
3º lugar: C#
4º lugar: PHP
5º lugar: C
6º lugar: Delphi
7º lugar: JavaScript
8º lugar: C++
9º lugar: VB.NET
10º lugar: Ruby



© 2025 Arquivo de Códigos - Todos os direitos reservados
Neste momento há 23 usuários muito felizes estudando em nosso site.