Array
(
)

Geração de Codigo de Boleto

PHP
Carmélio
   - 04 abr 2016

Boa tarde galera, estou com um problema ao gerar o código de um boleto, será que alguém pode me ajudar, o problema é o seguinte:
Eu informo todos os dados para a geração do boleto, porém existe um código verificador dos códigos que não batem de jeito nenhum, vou colocar os dados para vcs entenderem melhor.
No boleto da Caixa o código de barras é
86680000002-2 02000703071-9 92015022500-0 00018211599-8

porém no que eu gero vem com o seguinte número:
86600000002-0 02000703071-9 92015022500-0 00018211599-8
o valor de pagamento do cliente é de 20 reais com vencimento para 25/02/2015 e o código do cliente é 1821. estou usando esta data e valor inicialmente para fazer os testes, pois já tenho um boleto deste funcionando antes de eu gerar o arquivo.
#Código

// aqui é a gravação dos dados para poder gerar o boleto
<? session_start();
import_request_variables("gp");

 include 'db.php';
 db_connect() or die ("Erro ao tentar conectar ao banco de dados. Erro: ".mysql_error());
include 'funcoes_cef.php'; 

$dadosboleto["cnpj"]="07030719000114";

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Pagamento</title>
<link href="estilos.css" rel="stylesheet" type="text/css" />
<STYLE TYPE="text/css">
.folha {

	page-break-after:always;
}

<!--.cp {  font: bold 10px Arial; color: black}
<!--.ti {  font: 9px Arial, Helvetica, sans-serif}
<!--.ld { font: bold 15px Arial; color: #000000}
<!--.ct { FONT: 9px "Arial Narrow"; COLOR: #000033} 
<!--.cn { FONT: 9px Arial; COLOR: black }
<!--.bc { font: bold 20px Arial; color: #000000 }
<!--.ld2 { font: bold 12px Arial; color: #000000 }
-->
</STYLE>
</head>

<body>
<div id="print" align="right" style="border:1px gray solid;margin-bottom:10px;padding:3px;background-color:#FFFFCC;font-family:Arial;font">
	 <input type="button" style="border:1px black solid;" onClick="javascript:history.go(-2);" value="Voltar">   <input type="button" style="border:1px black solid;" onClick="document.getElementById('print').style.display='none';window.print(); document.getElementById('print').style.display='inline';" value="Imprimir"><br>
</div>
<div class='folha'>

<?
	$dadosboleto["data_vencimento"]=$vencimento;
	list($dia, $mes, $ano)=explode("/", $vencimento);
	$vencimento="$ano-$mes-$dia";
$diacerto="";
$instrucoes="NÃO RECEBER APÓS O VENCIMENTO.";

$ccc=mysql_query("select codigo, nome, endereco, bairro, cidade, cep, uf, numero, complemento, plano  from clientes where codigo='$codcliente' ") or die ("Erro: ".mysql_error());
list($codigo, $dadosboleto["nomecliente"], $endereco, $bairro, $cidade, $cep, $uf, $numero, $complemento, $plano)=mysql_fetch_array($ccc);
$dadosboleto["endereco1"]="$endereco $numero $complemento $bairro";
$dadosboleto["endereco2"]="$cep $cidade $uf";


?>

<table width="745" border="0" height="270">
  <tr>
    <td height="20" colspan="3" class="lista2">ASSOCIACAO BRAS. BEN. DE APOIO AO CIDADÃO</td>
    <td width="381" rowspan="5" valign="top"><table width="100%" border="0" cellpadding="0" cellspacing="0">
      <tr class="style7">
        <td height="25" style="border-bottom:1.2px #000000 solid">Dependentes</td>
        <td style="border-bottom:1.2px #000000 solid">Parentesco</td>
      </tr>
      <?
	  $ssql = mysql_query("select nome, parentesco from dependentes where codcliente='$codcliente' order by nome asc ") or die ("Erro: ".mysql_error()); 
	while ($linha=mysql_fetch_array($ssql)){
	list($dependente, $parentesco)=$linha;

      echo "<tr class=lista2>
        <td height='22'>$dependente</td>
        <td>$parentesco</td>
      </tr>";
	}
	  ?>
    </table></td>
    </tr>
  <tr>
    <td width="70" height="20"> </td>
    <td width="83" class="lista3">Associado(a)</td>
    <td width="193" align="right" class="textotitulo"><? echo str_pad($codigo, 9, "0", STR_PAD_LEFT); ?></td>
    </tr>
  <tr>
    <td width="72" height="50"> </td>
    <td colspan="2" valign="top" class="lista3"><?
    echo $dadosboleto["nomecliente"]."<br>$endereco, $numero $complemento <br> $bairro <br> $cep $cidade  $uf"; 
	
	?></td>
    </tr>
  <tr>
    <td width="72"> </td>
    <td colspan="2"> </td>
    </tr>
  <tr>
    <td colspan="3"><p class="lista3">Para reemissão deste carnê será cobrada uma taxa de R$ 2,00 (Dois Reais)</p>
      <p class="textotitulo">ABBAC</p></td>
    </tr>
</table>
</div>
<div class="folha">
<?
$valoranterior=$valor;
	$nossonumero=$codigo.substr($vencimento, 2,2)."99";
	
	$resultao=mysql_query("select adesao from plano where codigo='$plano' ") or die ("Erro: ".mysql_error());
	list($adesao)=mysql_fetch_array($resultao);

	if (empty($adesao) or $adesao==0){
		$adesao=10;	
	}


	$TAXAUNICA=(((pravalor($valor))*12)*0.8)+$adesao;
$result=mysql_query("insert into prestacoes (codcliente, nossonumero, parcela, emissao, valor, vencimento, usuariocad) values ( '$codcliente', '$nossonumero', 'UNICA', '".date("Y-m-d")."', '".$TAXAUNICA."', '$vencimento', '$_SESSION[login]')") or die ("Erro: ".mysql_error());


$dadosboleto["nosso_numero"]=str_pad($nossonumero, 13, "0", STR_PAD_LEFT);
$parcela="UNICA";
$dadosboleto["valor_boleto"]=number_format($TAXAUNICA, 2, ",",".");

include 'layout_cef.php';
unset($dadosboleto["valor_boleto"]);
$instrucoes="APÓS 5 DIAS DE VENCIDO COBRAR JUROS DE 0,33% AO DIA.";

for ($x=1; $x<=$parcelas; $x++){
	$nossonumero=$codigo.substr($vencimento, 2,2).substr($vencimento, 5,2);
	
	if ($x==1){
		$valor=number_format((pravalor($valor)+$adesao),2,",",".");
		$dadosboleto["valor_boleto"]=$valor;
	} else {
		$valor=$valoranterior;
		$dadosboleto["valor_boleto"]=$valor;
	}

/*		$valor=number_format($valor,2,",",".");
		$dadosboleto["valor_boleto"]=number_format($valor,2,",",".");

		$valor=number_format($x,2,",",".");
		$dadosboleto["valor_boleto"]=number_format($x,2,",",".");
*/		
	$result=mysql_query("insert into prestacoes (codcliente, nossonumero, parcela, emissao, valor, vencimento, usuariocad) values ( '$codcliente', '$nossonumero', '$x/$parcelas', '".date("Y-m-d")."', '".pravalor($valor)."', '$vencimento', '$_SESSION[login]')") or die ("Erro: ".mysql_error());
	
	$adesao=0;
	
	$dadosboleto["nosso_numero"]=str_pad($nossonumero, 13, "0", STR_PAD_LEFT);
	$parcela="$x/$parcelas";
	list($ano, $mes, $dia)=explode("-", $vencimento);
	$dadosboleto["data_vencimento"]="$dia/$mes/$ano";


//****** isso aqui não tinha ******////
		echo "</div><div class='folha'>";
//***** depois ver se vai tirar esta linha de cima ****////

	include 'layout_cefteste.php';

	//if ($x==2 or $x==6 or $x==10){
		echo "</div><div class='folha'>";
	//}
		$mes++;
		if ($mes>12){
			$mes=01;
			$ano++;
		}
		if ($mes==2 and $dia>28){
			$diacerto=$dia;
			$dia=28;
		} 
		if (($mes==4 or $mes==6 or $mes==9 or $mes==11)  and $dia>30){
			$diacerto=$dia;
			$dia=30;
		}
		
		
		$vencimento= $ano."-".str_pad($mes, 2, "0", STR_PAD_LEFT)."-".$dia;
		
		if ($diacerto!=""){
			$dia=$diacerto;
			$diacerto="";
		}
		
}

mysql_free_result($ccc);

?>
</div>
</body>
</html>

// aqui é quando eu chamo o layout
<?

$codigobanco = "104";
$codigo_banco_com_dv = geraCodigoBanco($codigobanco);
$nummoeda = "86";
if ($parcela=="UNICA"){
	$terceironum=6;
} else {
	$terceironum=7;
}
list($dia, $mes, $ano)=explode("/", $dadosboleto["data_vencimento"]);
$fator_vencimento = "$ano$mes$dia";

//valor tem 10 digitos, sem virgula
$valorbol = formata_numero($dadosboleto["valor_boleto"],11,0,"valor");
//agencia é 4 digitos
$cnpj = substr($dadosboleto["cnpj"],0,8);
//conta é 5 digitos
$conta = formata_numero($dadosboleto["conta"],5,0);
//dv da conta
$conta_dv = formata_numero($dadosboleto["conta_dv"],1,0);
//carteira é 2 caracteres
$nossonum = $dadosboleto["nosso_numero"];

//conta cedente (sem dv) com 11 digitos   (Operacao de 3 digitos + Cedente de 8 digitos)
$conta_cedente = formata_numero($dadosboleto["conta_cedente"],11,0);
//dv da conta cedente
$conta_cedente_dv = formata_numero($dadosboleto["conta_cedente_dv"],1,0);
echo "$nummoeda$terceironum$valorbol$cnpj$fator_vencimento$nossonum";
$dv = digitoVerificador_barra("$nummoeda$terceironum$valorbol$cnpj$fator_vencimento$nossonum");
// Numero para o codigo de barras com 44 digitos
$linha = "$nummoeda$terceironum$dv$valorbol$cnpj$fator_vencimento$nossonum";


$dadosboleto["codigo_barras"] = $linha;
$dadosboleto["linha_digitavel"] = monta_linha_digitavelcar($linha);
$dadosboleto["agencia_codigo"] = $agencia_codigo;
$dadosboleto["codigo_banco_com_dv"] = $codigo_banco_com_dv;

?>

//aqui são as funções
function modulo_10($num) { 
		$numtotal10 = 0;
        $fator = 2;

        // Separacao dos numeros
        for ($i = strlen($num); $i > 0; $i--) {
            // pega cada numero isoladamente
            $numeros[$i] = substr($num,$i-1,1);
            // Efetua multiplicacao do numero pelo (falor 10)
            $temp = $numeros[$i] * $fator; 
            $temp0=0;
            foreach (preg_split('//',$temp,-1,PREG_SPLIT_NO_EMPTY) as $k=>$v){ $temp0+=$v; }
            $parcial10[$i] = $temp0; //$numeros[$i] * $fator;
            // monta sequencia para soma dos digitos no (modulo 10)
            $numtotal10 += $parcial10[$i];
            if ($fator == 2) {
                $fator = 1;
            } else {
                $fator = 2; // intercala fator de multiplicacao (modulo 10)
            }
        }
		
        // várias linhas removidas, vide função original
        // Calculo do modulo 10
        $resto = $numtotal10 % 10;
        $digito = 10 - $resto;
        if ($resto == 0) {
            $digito = 0;
        }
		
        return $digito;
		
}

function modulo_11($num, $base=43, $r=0)  {
                                

    $soma = 0;
    $fator = 2;

    /* Separacao dos numeros */
    for ($i = strlen($num); $i > 0; $i--) {
        // pega cada numero isoladamente
        $numeros[$i] = substr($num,$i-1,1);
        // Efetua multiplicacao do numero pelo falor
        $parcial[$i] = $numeros[$i] * $fator;
        // Soma dos digitos
        $soma += $parcial[$i];
        if ($fator == $base) {
            // restaura fator de multiplicacao para 2 
            $fator = 1;
        }
        $fator++;
    }

    /* Calculo do modulo 11 */
    if ($r == 0) {
        $soma *= 10;
        $digito = $soma % 11;
        if ($digito == 10) {
            $digito = 0;
        }
        return $digito;
    } elseif ($r == 1){
        $resto = $soma % 11;
        return $resto;
    }
}

function monta_linha_digitavel($codigo) {
		

        $p1 = substr($codigo, 0, 11);
        $p2 = modulo_11($p1);
		$campo1="$p1-$p2";
		$p3 = substr($codigo, 11, 11);
        $p4 = modulo_10($p3);
		$campo2="$p3-$p4";
        $p5 = substr($codigo, 22, 11);
        $p6 = modulo_10($p5);
		$campo3="$p5-$p6";
		$p7 = substr($codigo, 33, 11);
        $p8 = modulo_10($p7);
		$campo4="$p7-$p8";
		

        return "$campo1 $campo2 $campo3 $campo4"; 
}

Vlw galera, conto com a ajuda de vcs.

Marcio Araujo
   - 05 abr 2016

É o gerador de código de boleto? Existem alguns posts sobre esse problema, já viu se algum deles pode te ajudar?

Carmélio
   - 13 abr 2016

teria como me passar um destes posts, o meu não é um boleto bancário como o Linha digitavel, é tipo um carnê, onde utilizo os padrões da febraban, quer q eu envie os arquivos para vc analisar?