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?