Ir para conteúdo
  • Cadastre-se

DiegoFernando

Membro
  • Postagens

    22
  • Registro em

  • Última visita

Tudo que DiegoFernando postou

  1. Só pra avisar eu consegui fazer 100%automático. A rotina pra pegar o Retorno da caixa é simples, eu automatizei com o agendador de tarefas do windows (no caso da caixa não precisa user e senha). O Fling FTP varre um diretorio e ao encontrar UPa pro servidor. O mais difícil (pelo menos pra mim) foi alterar o arquivo processar.php para deixar de ler o arquivo enviado no form e passar a varrer a pasta no servidor e processar o arquivo encontrado na mesma. Consegui até depois de processar arquivar o RET num diretório para backup. Depois inclui uma função pra mandar por email as informações e coloquei o processar.php no cron. Pronto tudo automático! (o incoveniente é deixar uma máquina ligada pra isso, mas tenho um notezinho velho aqui que me serviu!)
  2. @edvan A propósito!! O link de validação de cpf não está funcionando no blog! Abs Diego
  3. Fala @AngelCosta Preciso dos arquivos e o link não funciona!!! você ainda os tem? Obrigado.
  4. Vai em OPÇÔES, configurações gerais, segurança, e adiciona o ip do servidor do seu site em Restrição de Acesso ao API. Acho que é isso! Abs
  5. Basta adicionar um novo administrador no sistema e na primeira opção Função do Administrador coloque API, preencha o resto e configure no script os dados do user novo!!! pronto!! só isso!
  6. Amigão, basta você instalar o sistema no seu site conforme as instruções e testar um arquivo de retorno pra ver se dá algum erro ou não! Começa por ai! Abs. PS: Estou usando o sistema até hoje e resolveu minha vida! hehe... Vou tentar fazer 100% automático, mas só quando não tiver nada pra fazer.. (o que é meio difícil! hehe)
  7. Aqui versão 0.2 funcionando 100% pra Caixa SIGCB CNAB240, inclusive mostrando o nome do cliente que pagou e o valor no whmcs antes e depois de dar baixa. Show de bola! Parabens Alexandre Aleixo.
  8. Na verdade eu tinha visto!!! mas não sabia que ele ia voltar pra fazer o código funcionar! hehehel...
  9. Link do grupo no google que esqueci de postar https://groups.google.com/forum/?fromgroups=#!topic/retorno-boletophp/j8UlFfy6g_M Eles conseguem ler os T e U do retorno... abs
  10. Funcionou na CAIXA com perfeição, mas não conseguimos ler as linhas U do retorno, somente as T, isso quer dizer que se um cliente pagar menos do que o valor da fatura você não tem como saber! no meu caso isso nunca aconteceu e atende minhas necessidades. TEm esse grupo no google que ensina a usar o T e U ao mesmo tempo, quem se habilita:?? Pra usar com a caixa substitua o arquivo processar.php por esse: <?php header("Content-Type: text/html; charset=ISO-8859-1",true) ?> <?php /**Script de tratamento de arquivos de retorno padrão FEBRABAN/CNAB240 criado por Manoel Campos da Silva Filho e * Bento David Ribeiro Silva, adaptado por Alexandre Miranda Aleixo em Março de 2013 para aplicar os dados tratados * no script de gerenciamento de cobranças WHMCS. * Testado com arquivo de retorno do Banco Bradesco, carteira 06. * @copyright GPLv2 * @package LeituraArquivoRetornoAdaptadoParaWHMCS * @author Alexandre Miranda Aleixo - alexandre@opticalhost.com.br * @created 28/03/2013 * @version 0.1 * APOIE O TRABALHO DE QUEM LHE DISPONIBILIZOU ESSE SCRIPT DE GRAÇA! * MANTENHA OS CRÉDITOS COMO FORMA DE AGRADECIMENTO! */ //Adiciona a classe strategy RetornoBanco que vincula um objeto de uma sub-classe //de RetornoBase, e assim, executa o processamento do arquivo de uma determinada //carteira de um banco específico. require_once("RetornoBanco.php"); require_once("RetornoFactory.php"); /**Função handler a ser associada ao evento aoProcessarLinha de um objeto da classe * RetornoBase. A função será chamada cada vez que o evento for disparado. * * A coluna do tipo DETALHE em retorno CNAB240 tem 2 segmentos(duas linhas) "T" e "U" * este exemplo lista no nome da empresa * e alguns dados do DETALHE de cada boleto pago. * Nota: o Segmento "U" sempre é continuação do Segmento "T" que o precedeu * @param RetornoBase $self Objeto da classe RetornoBase que está processando o arquivo de retorno * @param $numLn Número da linha processada. * @param $vlinha Vetor contendo a linha processada, contendo os valores da armazenados * nas colunas deste vetor. Nesta função o usuário pode fazer o que desejar, * como setar um campo em uma tabela do banco de dados, para indicar * o pagamento de um boleto de um determinado cliente. * @see linhaProcessada1 */ // função de conversão da data do modelo brasileiro (ex: 25/02/2009) para o formato internacional para banco de dados (ex: 2009-02-25) function formatadata($data, $tipo = 1) { $data = str_replace('-', '/', $data); $dividir = explode("/", $data); $parte1 = $dividir[0]; $parte2 = $dividir[1]; $parte3 = $dividir[2]; $data = "$parte3-$parte2-$parte1"; if ($tipo == 1) $data = str_replace('-', '/', $data); return $data; } // fim da função de conversão da data do modelo brasileiro... //inicio do processamento do arquivo de retorno function linhaProcessada($self, $numLn, $vlinha) { if($vlinha) { if($vlinha["registro"] == $self::HEADER_ARQUIVO) { include("Config.php"); echo " <h1>Importar arquivo de retorno para o WHMCS:</h1> <br> Empresa: <b>".$vlinha['nome_empresa']."</b><br />"; echo "Banco: <b>".$vlinha['banco']." - ".$vlinha["nome_banco"]."</b><br />"; //notificação para evitar que arquivos de retorno de outros bancos sejam baixados como sendo de um banco diferente If ($banco != $vlinha['banco']) {echo"<font color=\"#FF0000\">ATENÇÃO: Número do banco neste arquivo de retorno não confere com o número configurado no Config.php desse script!</font><br /><br />"; } //fim notificação para evitar que arquivos de retorno de outros bancos sejam baixados como sendo de um banco diferente echo "Data do arquivo de retorno: <b>".$vlinha["data_geracao_arq"]."</b><br /><br />"; if (!isset($_GET['aplicar'])) {echo"As seguintes entradas serão aplicadas no WHMCS:<br /><br />";} } //O registro detalhe U são dados adicionais do registro de pagamento //e não necessariamente precisa ser usado. //Pode ser que o arquivo de retorno não tenha o registro detalhe separado em //duas linhas (T e U). Assim, nestes casos, pode-se fazer apenas um //if($vlinha["registro"] == $self::DETALHE) else if($vlinha["registro"] == $self::DETALHE && $vlinha["segmento"] == "T") { //exibindo os dados para confirmar se devem ser aplicados no API do WHMCS if (isset($_GET['aplicar'])) { include("Config.php"); //api que puxa os dados da fatura para posteriormente vermos se está paga ou não. $postfields = array(); $postfields["username"] = $username; $postfields["password"] = md5($password); $postfields["action"] = "getinvoice"; $postfields["invoiceid"] = $vlinha["n_documento"]; $postfields["responsetype"] = "json"; $query_string = ""; foreach ($postfields AS $k=>$v) $query_string .= "$k=".urlencode($v)."&"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 30); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $query_string); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); $jsondata = curl_exec($ch); if (curl_error($ch)) die("Connection Error: ".curl_errno($ch).' - '.curl_error($ch)); curl_close($ch); $dadosfatura = json_decode($jsondata); # Decode JSON String //fim api que puxa os dados da fatura para posteriormente vermos se está paga ou não. // Se fatura não está paga, executa... if ($dadosfatura->status == "Unpaid") { $postfields2["username"] = $username; $postfields2["password"] = md5($password); $postfields2["action"] = "addinvoicepayment"; #função que marca como pago a fatura $postfields2["transid"] = $banco."Dt".formatadata($vlinha['vencimento'], 2)."T".$vlinha['nosso_numero']."Seq".$vlinha['sequencial']."R$".$vlinha['valor']."Bc".$vlinha["banco_receb"]."Ag".$vlinha["ag_receb"]."-".$vlinha["dv_receb"]; $postfields2["invoiceid"] = $vlinha["n_documento"]; #número da fatura (aqui eu acho que deve se chamar do arquivo RET) $postfields2["gateway"] = $gateway; #Nome do gateway de pagamento, conforme consta no banco de dados $postfields2["amount"] = $vlinha["valor"]; // $postfields2["fees"] = ""; // $postfields2["noemail"] = "true"; $postfields2["date"] = formatadata($vlinha["vencimento"], 2); $ch2 = curl_init(); curl_setopt($ch2, CURLOPT_URL, $url); curl_setopt($ch2, CURLOPT_POST, 1); curl_setopt($ch2, CURLOPT_TIMEOUT, 100); curl_setopt($ch2, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch2, CURLOPT_POSTFIELDS, $postfields2); $data = curl_exec($ch2); curl_close($ch2); $data = explode(";",$data); foreach ($data AS $temp) { $temp = explode("=",$temp); $results[$temp[0]] = $temp[1]; } //echo $results["result"]; if ($results["result"]=="success") { echo "<font color=\"#008000\">A seguinte linha foi processada com sucesso:</font><br/> Linha: <b>".$vlinha['sequencial']."</b> - Fatura: <b>".$vlinha["n_documento"]."</b> - Vencimento: <b>".$vlinha["vencimento"]."</b>". " Valor: <b>R\$ ".number_format($vlinha["valor"], 2, '.', '')."</b> - ". " Valor no WHMCS: <b>R\$ ".number_format($dadosfatura->balance, 2, '.', '')."</b> "; } else { # An error occured echo "Ocorreu o seguinte erro ao processar a linha de sequencia ".$vlinha['sequencial']." : ".$results["message"]."<br/>"; } } //Se fatura já está paga, não executa e mostra mensagem: else{echo "<font color=\"#FF0000\">A seguinte linha NÃO foi processada:</font><br/> Linha: <b>".$vlinha['sequencial']."</b> - Fatura: <b>".$vlinha["n_documento"]."</b> - Vencimento: <b>".$vlinha["vencimento"]."</b>". " Valor: <b>R\$ ".number_format($vlinha["valor"], 2, '.', '')."</b> - ". " Valor no WHMCS: <b>R\$ ".number_format($dadosfatura->balance, 2, '.', '')."</b> "; } } else { //api que puxa os dados da fatura para posteriormente vermos se está paga ou não. include("Config.php"); $postfields = array(); $postfields["username"] = $username; $postfields["password"] = md5($password); $postfields["action"] = "getinvoice"; $postfields["invoiceid"] = $vlinha["n_documento"]; $postfields["responsetype"] = "json"; $query_string = ""; foreach ($postfields AS $k=>$v) $query_string .= "$k=".urlencode($v)."&"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 30); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $query_string); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); $jsondata = curl_exec($ch); if (curl_error($ch)) die("Connection Error: ".curl_errno($ch).' - '.curl_error($ch)); curl_close($ch); $dadosfatura = json_decode($jsondata); # Decode JSON String //fim api que puxa os dados da fatura para posteriormente vermos se está paga ou não. // Se fatura não está paga, executa... if ($dadosfatura->status == "Unpaid") { echo " Linha: <b>".$vlinha['sequencial']."</b> - Fatura: <b>".$vlinha["n_documento"]."</b> - Vencimento: <b>".$vlinha["vencimento"]."</b>". " Valor: <b>R\$ ".number_format($vlinha["valor"], 2, '.', '')."</b> - ". " Valor no WHMCS: <b>R\$ ".number_format($dadosfatura->balance, 2, '.', '')."</b> "; if ($dadosfatura->balance < $vlinha["valor"]) {echo " - <font color=\"#FF0000\">Atenção: Valor da fatura é menor que o valor pago! Conferir situação!</font>"; } echo "<br/>"; } else { echo " Linha: <b>".$vlinha['sequencial']."</b> - Fatura: <b>".$vlinha["n_documento"]."</b> - Vencimento: <b>".$vlinha["vencimento"]."</b>". " Valor: <b>R\$ ".number_format($vlinha["valor"], 2, '.', '')."</b> - ". " Valor no WHMCS: <b>R\$ ".number_format($dadosfatura->balance, 2, '.', '')."</b> ". "</b> - <font color=\"#FF0000\">FATURA JÁ PAGA OU CANCELADA</font><br/><br/>"; } } } } else echo "Tipo da linha n&atilde;o identificado<br/>\n"; } /**Outro exemplo de função handler, a ser associada ao evento * aoProcessarLinha de um objeto da classe RetornoBase. * Neste exemplo, é utilizado um laço foreach para percorrer * o vetor associativo $vlinha, mostrando os nomes das chaves * e os valores obtidos da linha processada. * @see linhaProcessada */ function linhaProcessada1($self, $numLn, $vlinha) { printf("%08d) ", $numLn); if($vlinha) { foreach($vlinha as $nome_indice => $valor) echo "$nome_indice: <b>$valor</b><br/>\n "; } else echo "Tipo da linha n&atilde;o identificado<br/>\n"; echo "<br/>\n"; } //--------------------------------------INÃCIO DA EXECUÇÃO DO CÓDIGO----------------------------------------------------- echo"<html> <head> <title>Importação do arquivo de retorno para o WHMCS - Por Alexandre Aleixo</title> </head> <body> "; //$fileName = "retorno_cnab240.ret"; $fileName = $_FILES['arquivo']['tmp_name']; $cnab240 = RetornoFactory::getRetorno($fileName, "linhaProcessada"); $cnab2402 = RetornoFactory::getRetorno($fileName, "linhaProcessada1"); $retorno = new RetornoBanco($cnab240); $retorno->processar(); if (!isset($_GET['aplicar'])) {echo "<br/><br/> Se os dados acima estão corretos, selecione o arquivo novamente e clique em \"Enviar dados\"<br/> <br/> Atenção: os dados acima foram tirados do arquivo: <font color=\"#FF0000\">".$_FILES['arquivo']['name']."</font><br/> (Assegure-se de selecionar abaixo o mesmo arquivo)<br/> <br/> <form action=\"processar.php?aplicar\" method=\"post\" enctype=\"multipart/form-data\"> <input name=\"arquivo\" type=\"file\"/> <input type=\"submit\" value=\"Enviar dados\"/> </form><br/>"; } //echo "<br/><br/>Descrição de todas as informações do retorno:<br/><br/>"; //$retorno2 = new RetornoBanco($cnab2402); //$retorno2->processar(); echo " <br><br> Projeto concluído por Alexandre Aleixo, com o auxílio de danielvisnet, diego123 e redirect no fórum Portal Do Host: <br><br> <a target=\"_blank\" href=\"http://portaldohost.com.br/forum/index.php?showtopic=9470&page=2#entry106980\"> http://portaldohost.com.br/forum/index.php?showtopic=9470&page=2#entry106980</a> <br><br> Respeite quem dedicou seu tempo para lhe disponibilizar esse sistema de graça! Não remova os créditos! </body> </html>"; ?> E substitua o RetornoCNAB240.php por esse: <?php require_once("RetornoBase.php"); /**Classe para leitura de arquivos de retorno de cobranças no padrão CNAB240.<br/> * Layout Padrão Febraban 240 posições V08.4 de 01/09/2009<br/> * http://www.febraban.org.br * @copyright GPLv2 * @package ArquivoRetornoTitulosBancarios * @author Manoel Campos da Silva Filho. http://manoelcampos.com/contato * @version 0.2 * @modified 01/04/2011 por Bento David Ribeiro Silva */ class RetornoCNAB240 extends RetornoBase { /**@property int HEADER_ARQUIVO Define o valor que identifica uma coluna do tipo HEADER DE ARQUIVO*/ const HEADER_ARQUIVO = 0; /**@property int HEADER_LOTE Define o valor que identifica uma coluna do tipo HEADER DE LOTE*/ const HEADER_LOTE = 1; /**@property int DETALHE Define o valor que identifica uma coluna do tipo DETALHE*/ const DETALHE = 3; const DETALHE_T = "T"; const DETALHE_U = "U"; /**@property int TRAILER_LOTE Define o valor que identifica uma coluna do tipo TRAILER DEs LOTE*/ const TRAILER_LOTE = 5; /**@property int TRAILER_ARQUIVO Define o valor que identifica uma coluna do tipo TRAILER DE ARQUIVO*/ const TRAILER_ARQUIVO = 9; public function __construct($nomeArquivo=NULL, $aoProcessarLinhaFunctionName=""){ parent::__construct($nomeArquivo, $aoProcessarLinhaFunctionName); } protected function processarHeaderArquivo($linha) { $vlinha = array(); $vlinha["banco"] = substr($linha, 1, 3); //NUMERICO //Código do Banco na Compensação $vlinha["lote"] = substr($linha, 4, 4); //num - default 0000 //Lote de Serviço $vlinha["registro"] = substr($linha, 8, 1); //num - default 0 //Tipo de Registro $vlinha["cnab1"] = substr($linha, 9, 9); //BRANCOS //Uso Exclusivo FEBRABAN / CNAB $vlinha["tipo_inscricao_empresa"] = substr($linha, 18, 1); //num - 1-CPF, 2-CGC //Tipo de Inscrição da Empresa $vlinha["num_inscricao_empresa"] = substr($linha, 19, 14); //numerico //Número de Inscrição da Empresa $vlinha["convenio"] = substr($linha, 33, 20); //alfanumerico //Código do Convênio no Banco $vlinha["agencia"] = substr($linha, 53, 5); //numerico //Agência Mantenedora da Conta $vlinha["dv_agencia"] = substr($linha, 58, 1); //alfanumerico //DV da Agência $vlinha["conta_corrente"] = substr($linha, 59, 12); //numerico //Número da Conta Corrente $vlinha["dv_conta"] = substr($linha, 71, 1); //alfanumerico //DV da Conta Corrent $vlinha["dv_ag_conta"] = substr($linha, 72, 1); //alfanumerico $vlinha["nome_empresa"] = substr($linha, 73, 30); //alfanumerico $vlinha["nome_banco"] = substr($linha, 103, 30); //alfanumerico $vlinha["uso_febraban_cnab2"] = substr($linha, 133, 10); //brancos //Uso Exclusivo FEBRABAN / CNAB $vlinha["cod_arq"] = substr($linha, 143, 1); //num - 1-REM E 2-RET ?? //Código do arquivo de remessa/retorno $vlinha["data_geracao_arq"] = substr($linha, 144, 8); //num - formato ddmmaaaa $vlinha["hora_geracao_arq"] = substr($linha, 152, 6); //num - formato hhmmss $vlinha["sequencia"] = substr($linha, 158, 6); //numerico //Número Sequencial do Arquivo $vlinha["versao_layout_arq"] = substr($linha, 164, 3); //num 084 //Num da Versão do Layout do Arquivo $vlinha["densidade"] = substr($linha, 167, 5); //numerico //Densidade de Gravação do Arquivo $vlinha["reservado_banco"] = substr($linha, 172, 20); //alfanumerico //Para Uso Reservado do Banco $vlinha["reservado_empresa"] = substr($linha, 192, 20); //alfanumerico //Para Uso Reservado da Empresa $vlinha["uso_febraban_cnab3"] = substr($linha, 212, 29); //brancos //Uso Exclusivo FEBRABAN / CNAB return $vlinha; } protected function processarHeaderLote($linha) { $vlinha = array(); $vlinha["banco"] = substr($linha, 1, 3); //Código do Banco na Compensação $vlinha["lote"] = substr($linha, 4, 4); //Lote de Serviço $vlinha["registro"] = substr($linha, 8, 1); //Tipo de Registro $vlinha["operacao"] = substr($linha, 9, 1); //Tipo de Operação $vlinha["servico"] = substr($linha, 10, 2); //Tipo de Serviço $vlinha["servico_CNAB"] = substr($linha, 12, 2); //Uso Exclusivo FEBRABAN/CNAB $vlinha["layout_lote"] = substr($linha, 14, 3); //Nº da Versão do Layout do Lote $vlinha["CNAB"] = substr($linha, 17, 1); //Uso Exclusivo FEBRABAN/CNAB $vlinha["inscricao_tipo"] = substr($linha, 18, 1); //Tipo de Inscrição da Empresa $vlinha["inscricao_numero"] = substr($linha, 19, 15); //Nº de Inscrição da Empresa $vlinha["convenio"] = substr($linha, 34, 20); //Código do Convênio no Banco $vlinha["agencia"] = substr($linha, 54, 5); //Agência Mantenedora da Conta $vlinha["dv_agencia"] = substr($linha, 59, 1); //Dígito Verificador da Conta $vlinha["conta"] = substr($linha, 60, 12); //Número da Conta Corrente $vlinha["dv_conta"] = substr($linha, 72, 1); //Dígito Verificador da Conta $vlinha["dv"] = substr($linha, 73, 1); //Dígito Verificador da Ag/Conta $vlinha["nome_empresa"] = substr($linha, 74, 30); //Nome da Empresa $vlinha["informacao1"] = substr($linha, 104, 40); //Mensagem 1 $vlinha["informacao2"] = substr($linha, 144, 40); //Mensagem 2 $vlinha["n_retorno"] = substr($linha, 184, 8); //Número Remessa/Retorno $vlinha["data_retorno"] = $this->formataData(substr($linha, 192, 8)); //Data de Gravação Remessa/Retorno $vlinha["data_credito"] = $this->formataData(substr($linha, 200, 8)); //Data do Crédito $vlinha["CNAB2"] = substr($linha, 208, 33); //Uso Exclusivo FEBRABAN/CNAB return $vlinha; } protected function processarDetalheT($linha) { $vlinha = array(); $vlinha["banco"] = substr($linha, 1, 3); //Código do Banco na Compensação $vlinha["lote"] = substr($linha, 4, 4); //Lote de Serviço $vlinha["registro"] = substr($linha, 8, 1); //Tipo de Registro $vlinha["sequencial"] = substr($linha, 9, 5); //Número Sequencial Registro no Lote $vlinha["segmento"] = substr($linha, 14, 1); //Código Segmento do Registro Detalhe $vlinha["servico_CNAB"] = substr($linha, 15, 1); //Uso Exclusivo FEBRABAN/CNAB $vlinha["cod_mov"] = substr($linha, 16, 2); //Código de Movimento Retorno $vlinha["agencia"] = substr($linha, 15, 5); //Agência Mantenedora da Conta $vlinha["dv_agencia"] = substr($linha, 23, 1); //Dígito Verificador da Agência $vlinha["conta"] = substr($linha, 24, 12); //Número da Conta Corrente $vlinha["dv_conta"] = substr($linha, 36, 1); //Dígito Verificador da Conta $vlinha["dv"] = substr($linha, 37, 1); //Dígito Verificador da Ag/Conta $vlinha["nosso_numero"] = substr($linha, 38, 20); //Identificação do Título $vlinha["carteira"] = substr($linha, 58, 1); //Código da Carteira $vlinha["n_documento"] = substr($linha, 53, 4); //Aqui eu tive que alterar porque não leu o arquivo de RET da caixa acho que quando as faturas tiverem 5 digitos deve se alterar para 53, 5 ou 52,5 @ diego123. $vlinha["vencimento"] = $this->formataData(substr($linha, 74, 8)); //Data do Vencimento do Título $vlinha["valor"] = $this->formataNumero(substr($linha, 82, 15)); //Valor Nominal do Título $vlinha["banco_receb"] = substr($linha, 97, 3); //Número do Banco $vlinha["ag_receb"] = substr($linha, 100, 5); //Agência Cobradora/Recebedora $vlinha["dv_receb"] = substr($linha, 105, 1); //Dígito Verificador da Agência $vlinha["uso_empresa"] = substr($linha, 106, 25); //Identificação do Título na Empresa $vlinha["moeda"] = substr($linha, 131, 2); //Código da Moeda $vlinha["sacado_tipo"] = substr($linha, 133, 1); //Tipo de Inscrição $vlinha["sacado_numero"] = substr($linha, 134, 15); //Número de Inscrição $vlinha["sacado_nome"] = substr($linha, 149, 40); //Nome $vlinha["n_contrato"] = substr($linha, 189, 10); //Nº do Contr. da Operação de Crédito $vlinha["valor_tarifa"] = $this->formataNumero(substr($linha, 199, 15)); //Valor da Tarifa / Custas $vlinha["motivo_ocorrencia"] = substr($linha, 214, 10); //Identificação para Rejeições, Tarifas, Custas, Liquidação e Baixas $vlinha["CNAB"] = substr($linha, 224, 17); //Uso Exclusivo FEBRABAN/CNAB return $vlinha; } protected function processarDetalheU($linha) { $vlinha = array(); $vlinha["banco"] = substr($linha, 1, 3); //Código do Banco na Compensação $vlinha["lote"] = substr($linha, 4, 4); //Lote de Serviço $vlinha["registro"] = substr($linha, 8, 1); //Tipo de Registro $vlinha["sequencial"] = substr($linha, 9, 5); //Nº Sequencial do Registro no Lote $vlinha["segmento"] = substr($linha, 14, 1); //Cód. Segmento do Registro Detalhe $vlinha["servico_CNAB"] = substr($linha, 15, 1); //Uso Exclusivo FEBRABAN/CNAB $vlinha["cod_mov"] = substr($linha, 16, 2); //Código de Movimento Retorno $vlinha["acrescimos"] = $this->formataNumero(substr($linha, 18, 15)); //Juros / Multa / Encargos $vlinha["valor_desconto"] = $this->formataNumero(substr($linha, 33, 15)); //Valor do Desconto Concedido $vlinha["valor_abatimento"] = $this->formataNumero(substr($linha, 48, 15)); //Valor do Abat. Concedido/Cancel. $vlinha["IOF"] = $this->formataNumero(substr($linha, 63, 15)); //Valor do IOF Recolhido $vlinha["valor_pago"] = $this->formataNumero(substr($linha, 78, 15)); //Valor Pago pelo Sacado $vlinha["valor_liquido"] = $this->formataNumero(substr($linha, 93, 15)); //Valor Líquido a ser Creditado $vlinha["despesas"] = $this->formataNumero(substr($linha, 108, 15)); //Valor de Outras Despesas $vlinha["creditos"] = $this->formataNumero(substr($linha, 123, 15)); //Valor de Outros Créditos $vlinha["data_ocorrencia"] = $this->formataData(substr($linha, 138, 8)); //Data da Ocorrência $vlinha["data_credito"] = $this->formataData(substr($linha, 146, 8)); //Data da Efetivação do Crédito $vlinha["cod_ocorrencia_sac"] = substr($linha, 154, 4); //Código da Ocorrência $vlinha["data_ocorrencia_sac"] = $this->formataData(substr($linha, 158, 8)); //Data da Ocorrência $vlinha["valor_ocorrencia_sac"] = $this->formataNumero(substr($linha, 166, 15)); //Valor da Ocorrência $vlinha["compl_ocorrencia_sac"] = substr($linha, 181, 30); //Complem. da Ocorrência $vlinha["cod_bco_corr"] = substr($linha, 211, 3); //Cód. Banco Correspondente Compens. $vlinha["n_bco_corr"] = substr($linha, 214, 20); //Nosso Nº Banco Correspondente $vlinha["CNAB"] = substr($linha, 234, 7); //Uso Exclusivo FEBRABAN/CNAB return $vlinha; } protected function processarTrailerLote($linha) { $vlinha = array(); $vlinha["banco"] = substr($linha, 1, 3); //numerico //Código do Banco na Compensação $vlinha["lote"] = substr($linha, 4, 4); //numerico //Lote de Serviço $vlinha["registro"] = substr($linha, 8, 1); //num - default 5 //Tipo de Registro $vlinha["cnab1"] = substr($linha, 9, 9); //alfa - default brancos Uso Exclusivo FEBRABAN/CNAB $vlinha["quant_regs"] = substr($linha, 18, 6); //numerico //Quantidade de Registros do Lote $vlinha["valor"] = substr($linha, 24, 16); //numerico, 2 casas decimais //Somatória dos Valores $vlinha["quant_moedas"] = substr($linha, 42, 13); //numerico, 5 casas decimais //Somatória de Quantidade de Moedas $vlinha["num_aviso_debito"] = substr($linha, 60, 6); //numerico //Número Aviso de Débito $vlinha["cnab2"] = substr($linha, 66, 165); //alfa, default brancos //Uso Exclusivo FEBRABAN/CNAB $vlinha["ocorrencias"] = substr($linha, 231, 10); //alfa //Códigos das Ocorrências para Retorno return $vlinha; } protected function processarTrailerArquivo($linha) { $vlinha = array(); $vlinha["banco"] = substr($linha, 1, 3); //numerico //Código do Banco na Compensação $vlinha["lote"] = substr($linha, 4, 4); // num - default 9999 //Lote de Serviço $vlinha["registro"] = substr($linha, 8, 1); //num - default 9 //Tipo de Registro $vlinha["cnab1"] = substr($linha, 9, 9); //alpha - default brancos //Uso Exclusivo FEBRABAN/CNAB $vlinha["quant_lotes"] = substr($linha, 18, 6); //num. //Quantidade de Lotes do Arquivo $vlinha["quant_regs"] = substr($linha, 24, 6); //num. //Quantidade de Registros do Arquivo $vlinha["quant_contas_conc"] = substr($linha, 30, 6); //num. //Qtde de Contas p/ Conc. (Lotes) $vlinha["cnab2"] = substr($linha, 36,205); //alpha - default brancos //Uso Exclusivo FEBRABAN/CNAB return $vlinha; } /**Processa uma linha do arquivo de retorno. * @param int $numLn Número da linha a ser processada * @param string $linha String contendo a linha a ser processada * @return array Retorna um vetor associativo contendo os valores da linha processada.*/ public function processarLinha($numLn, $linha) { //é adicionado um espaço vazio no início_linha para que //possamos trabalhar com índices iniciando em 1, no lugar de zero, //e assim, ter os valores de posição dos campos exatamente //como no manual CNAB240 $linha = " $linha"; $tipoLn = substr($linha, 8, 1); //echo "$tipoLn<br/>"; if(strcmp($tipoLn,RetornoCNAB240::HEADER_ARQUIVO)==0) $vlinha = $this->processarHeaderArquivo($linha); else if(strcmp($tipoLn, RetornoCNAB240::HEADER_LOTE)==0) $vlinha = $this->processarHeaderLote($linha); else if(strcmp($tipoLn, RetornoCNAB240::DETALHE)==0) { $tipoDetalhe = substr($linha, 14, 1); if(strcmp($tipoDetalhe, static::DETALHE_T)==0) $vlinha = $this->processarDetalheT($linha); else if(strcmp($tipoDetalhe, static::DETALHE_U)==0) $vlinha = $this->processarDetalheU($linha); } else if(strcmp($tipoLn, RetornoCNAB240::TRAILER_LOTE)==0) $vlinha = $this->processarTrailerLote($linha); else if(strcmp($tipoLn,RetornoCNAB240::TRAILER_ARQUIVO)==0) $vlinha = $this->processarTrailerArquivo($linha); else $vlinha = NULL; return $vlinha; } } ?> Não nos culpe se não funcionar!! heheh o Código não é aquela beleza, mas funciona. Compare esses arquivos antes de substituir e veja o que existe em um e outro pois alterei algumas coisas. Se conseguir melhorar algo não esqueça de por aqui pois você pegou esse script de graça então nada melhor que contribuir. os dados do retorno CAIXA que o script mostra são quase os mesmos que o Cobrança Caixa mostra então me dei por satisfeito. Vale lembrar que essa adaptação pra Caixa só foi possível porque o Alexandre Aleixo explicou tudo pra mim!! hehehe... Abs... Diego Fernando.
  11. Achei a bronca!! As variáveis da caixa são diferentes do bradesco... vou trabalhar aqui pra ver o que sai!!! abs
  12. Atualizei o php mas estou encontrando alguns erros no script... assim que funcionar para CEF posto aqui! abs
  13. Deu um erro Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM no arquivo processar.php linha 53 Resolvi assim: codigo antigo: if($vlinha["registro"] == $self::HEADER_ARQUIVO) codigo novo: if($vlinha["registro"] == $self.'::'.HEADER_ARQUIVO) Se fiz besteira me avisem!! kkk Acho que é porque a minha versão do php é Versão do PHP 5.2.17
  14. Caro Alexandre Aleixo Parabéns pelo trabalho! É muito fácil alguém dizer que tem o código e que vai disponibilizar e nada fazer... Essa novela se arrastava há muito tempo!!! Seu gesto é nobre e de homens nobres que conseguimos mudar uma sociedade. Infelizmente o pessoal aqui e em outros somente usam, mas pouco contribuem para melhorar algo. Agradeço imensamente pelo script e rezo pra que não tenha um que o venda por ai!!! Por isso deveríamos divulgá-lo de forma que quando alguém pesquisar no google ache esse script direto! É o mínimo que podemos fazer. Concordo com você em gênero, numero e grau quando fala de tantas coisas que já encontramos grátis por ai e ganhamos dinheiro com isso... Deus te abençoe sempre.
  15. Olá matt, Você poderia pelo menos dizer como foi a auttomatização, pois nosso amigo Alexandre Aleixo está com a mão na massa neste momento e qualquer indicação serial útil! Abs e obrigado.
  16. No meu caso é mais fácil puxar do banco, pois posso automatizar isso pelo windows (já postei aqui um tutorial pra fazer isso). O difícil mesmo será indicar pro sistema qual arquivo ler.. heheh Mas da maneira como você está fazendo vai ficar ótimo... Bom trabalho e se eu puder ajudar... Abs
  17. Não se esqueça de fazer o script ler o arquivo RET de uma pasta no servidor, pois eu já consegui automatizar o envio do RET via FTP. Aí fica 100% automático usando o cron job e o automatizador de tarefas do windows, . Futuramente é possível programar em java para puxar o RET. Isso quem me disse que é possível foi o pessoal da caixa e também alguem aqui no forum já fez pro bradesco... isso é bom porque elimina o nosso pc ligado fazendo isso.
  18. redirect, Consegui fazer o pagamento de uma fatura pelo API. Agora qual o filho de Deus que vai integrar o retorno PHP com o API!! Código: ////////////////////////////// <?php $url = "http://www.seusite.com.br/pastadowhmcs/includes/api.php"; # URL to WHMCS API file $username = "xxxxx"; # Usuário do admin $password = "xxxxx"; # Senha do admin $postfields["username"] = $username; $postfields["password"] = md5($password); $postfields["action"] = "addinvoicepayment"; #função que marca como pago a fatura $postfields["invoiceid"] = "1283"; #número da fatura (aqui eu acho que deve se chamar do arquivo RET) $postfields["gateway"] = "mailin"; #Esse é pra mandar o email de fatura paga, eu acho kkk $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 100); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields); $data = curl_exec($ch); curl_close($ch); $data = explode(";",$data); foreach ($data AS $temp) { $temp = explode("=",$temp); $results[$temp[0]] = $temp[1]; } if ($results["result"]=="success") { # Result was OK! } else { # An error occured echo "The following error occured: ".$results["message"]; } ?> ++++++++++++++++++++++++++++++++++++++++ Para usar o código basta criar um arquivo php em uma pasta do servidor e acessar pelo navegador (depois que configurar podemos esconder o arquivo no dir home para não ficar acessível dentro do /www no servidor.). Assim que você acessa no navegador o whmcs marca como pagas as faturas e dispara o email. Depois de tudo funcionando podemos criar uma tarefa cron diária para automatizar. Mas precisamos pegar o retorno antes do horário em que o whmcs dispara os avisos de fatura em atraso e suspensões. Normalmente a caixa disponibiliza o retorno cedo da manhã! Qualquer coisa mais que eu possa ajudar... estou aqui! Abs
  19. redirect, Em qual local na whmcs está o exemplo de módulo para retorno de pagamento?? obrigado.
  20. Para abrir o programa da caixa automaticamente todo dia a certa hora utilize o Agendador de Tarefas. 1 - Abra o agendador e vai no menu AÇÃO> Criar tarefa Básica 2 - Dê um nome a ela (e Descrição se quiser) 3 - Escolha quando deseja que essa tarefa seja executada (diariamente) 4 - Ao apertar avançar você terá que escolher a hora. 5 - Ao avançar selecione Iniciar um programa, depois selecione qual programa no seu computador. (No meu caso uso a Caixa Econ, Fed. e não preciso abrir o programa e colocar usuario e senha para baixar o retorno. Peguei esse macete no suporte deles.) Se o seu for da CAixa também navegue pelo caminho C:\CAIXA\mercador\startClientCobranca.bat (pode-se criar até mesmo um atalho para area de trabalho e puzar o .ret direto sem senha do Cob ou Cobranca Caixa.) 6 - Aperte Concluir e pronto. Todos os dias no horário marcado o agendador do windows abrirá o programa e o mesmo baixará o RET automaticamente. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Agora para mandar por ftp automaticamente a uma pasta no servidor você vai usar o programa Fling FTP Que varre uma pasta e assim que encontra um novo arquivo envia ao servidor ftp. Não vou colocar o tuto aqui porque ele é pago e o meu expirou! Abs
  21. bem gente, há um tempo perdi uns fios para tentar mexer nisso. Eu consegui fazer com que o windows crie uma tarefa para: 1 - Abrir o programa da caixa. 2 - Baixar para uma pasta os arquivos ret. 3 - Enviar para uma pasta no servidor via ftp. Agora o mais difícil! Alguem tem que programar o script para ler o arquivo direto da pasta no servidor. Depois integrar para dar baixa no whmcs. Dessa forma basta deixar um pc ligado na internet que a baixa ocorre automaticamente, 100%. Infelizmente da curiosidade é maior que o conhecimento em programação, e as vezes isso não adianta muito. Abs e à disposição!
×
×
  • Criar Novo...

Informação Importante

Concorda com os nossos termos?