Como controlar mensalidades e acesso a aplicação? – php

Pergunta:


Estou desenvolvendo um sistema que deve bloquear o acesso de quem não efetuar o pagamento do boleto da mensalidade.

Dei uma olhada no projeto BoletoPHP para geração de boletos e me atende parcialmente. Consigo gerar os boletos, mas não sei quando e se foram pagos.

O que preciso é de um feedback em nível de sistema sobre o pagamento do boleto, algo como a API do PagSeguro faz, para que o bloqueio da conta seja automático.

Por ora não posso usar APIs como PagSeguro, MercadoPago etc.

Autor da pergunta Lucas Marçal Dos Santos

J. Bruni

Controle de pagamentos via boleto

  1. Gerar o boleto de cobrança
  2. Gravar dados da cobrança em banco de dados (assinante, vencimento, valor, etc)
  3. Obter o arquivo-retorno do banco (todo dia útil)
  4. Processar o arquivo-retorno (aqui você fica sabendo os detalhes dos pagamentos)
  5. Atualizar o banco de dados com as informações obtidas (marcar cobranças pagas, etc)
  6. Verificar os pagamentos em atraso (ainda não pago após data de vencimento) e efetuar o bloqueio

Gerando o boleto

Sempre do lado do cliente, estive envolvido com geração de boletos usando PHP desde 2007, tendo utilizado os serviços do Banco do Brasil, Bradesco e Caixa Econômica Federal, nas modalidades sem registro e registrada.

No ano passado, fiz um Bundle de geração de boletos para o Symfony 2 que faz o mesmo serviço que o BoletoPHP: a partir dos dados de cobrança informados, gera o boleto correspondente. Porém, esta é só uma parte do sistema.

As informações que seguem são válidas para os bancos mencionados acima, dentro da experiência que tive. Creio que os demais sigam o mesmo modelo.

Obtendo o arquivo-retorno

Para controlar as mensalidades, ou seja, saber quais boletos foram pagos, você precisa obter o arquivo-retorno que é gerado todo dia útil pelo banco, e contém as informações sobre os boletos processados naquele dia.

Como você obtém o arquivo-retorno do banco?

Ou através de Internet Banking, ou de algum software proprietário a ser instalado por um técnico do banco. Infelizmente, não há uma API ou outra maneira mais simples e passível de ser automatizada por parte do cliente. A rotina de obter o arquivo-retorno do banco, e em seguida enviar o mesmo para o seu sistema processá-lo, é uma tarefa manual.

A resposta exata sobre a forma de obtenção desses arquivos será dada pelo próprio banco, seja quando for feita a contratação da carteira de cobrança, ou em qualquer outro momento.

Gerando e enviando o arquivo-remessa

Nos contratos de carteira registrada, é necessário também gerar e enviar para o banco o chamado arquivo-remessa, para que os boletos gerados pelo seu sistema sejam registrados no sistema do banco. Os envios são feitos de maneira similar (Internet Banking ou software proprietário). Na Caixa Econômica há um processo de homologação para validar a formatação dos seus arquivos-remessa. Depois de uma fase de testes, é ativada a fase de “produção”, quando os arquivos-remessa enviados passam a ser efetivamente registrados.

Também no ano passado, no mesmo sistema em Symfony 2, implementei uma classe para gerar arquivos-remessa a partir dos dados de cobrança e dos boletos gerados pelo sistema – porém esse código não está em domínio público.

Padrão CNAB

Tanto os arquivos enviados para o banco (arquivo-remessa, apenas para a carteira registrada) quanto os arquivos recebidos do banco (arquivo-retorno diário) seguem uma formatação padrão.

O padrão CNAB (Centro Nacional de Automação Bancária) tem algumas variações – CNAB 240, CNAB 400, etc. Nos sites do Banco do Brasil e da Caixa Econômica Federal estão disponibilizados os documentos técnicos que detalham o padrão utilizado para essa comunicação entre o banco e o cliente.

Cada banco deve manter uma documentação semelhante, a qual é necessária para implementar qualquer solução que precise gerar ou processar arquivos “retorno” e/ou “remessa”.

Processando o arquivo-retorno

Como existem variações entre cada banco, não existe uma solução pronta para todos. É preciso estar com a documentação técnica, e fazer a implementação de acordo. Assim como temos “vários tipos de boletos” no BoletoPHP… temos vários “tipos de arquivo-retorno” e vários “tipos de arquivo-remessa”.

Eu já fiz implementações de processamento de arquivo-retorno, em PHP, para os três bancos mencionados, dos quais os meus clientes eram clientes. Esta é outra parte do sistema cujo código não está em domínio público.

Não é difícil, mas é trabalhoso – há muitos detalhes, muitos campos… não é nada agradável.

Em suma

O que você vai precisar é:

  1. Diálogo com o banco a fim de obter acesso aos arquivos-retorno

  2. Rotina de obter o arquivo e enviar para o seu sistema

  3. Implementação de script que processe os arquivos-retorno recebidos pelo sistema

Eu sempre trabalhei em empresas do segmento financeiro, que prestam serviços e desenvolvem sistemas para bancos. Porém, não tenho muita experiência com os sistemas de boletagem pois não trabalhei diretamente com eles.

Entretanto, já tendo trabalhado em sistemas cliente, isto é, que geram os boletos e recebem o retorno, posso dizer que as instituições financeiras utilizam padrões para envio e recebimento de informações sobre boletos. O mais comum onde trabalhei é o CNAB.

Mas o seu problema não é o formato em si, mas como a instituição vai (ou não) disponibilizar essa informação para seus clientes através de um web service.

Veja bem, os sistemas com que trabalho são executados internamente no banco, então nós lemos o Retorno do CNAB através de uma procedure, uma tabela ou um arquivo TXT num diretório configurado pelo banco.

Mas, para disponibilizar essa informação para terceiros, cada banco vai criar uma solução própria, a exemplo dos internet bankings que existem por aí.

Minha sugestão é que você vá até a agência para falar com seu gerente e questione sobre esse serviço. Provavelmente ele vai encaminhar essa dúvida para alguém de TI do banco, que poderá informar o formato dos dados e o modo que é disponibilizado.

Talvez esse serviço seja oneroso, já que o banco precisa se preocupar com segurança, disponibilidade e não quer qualquer um acessando serviços diretamente.

Algo que eu vejo em muitas lojas virtuais menores é uma funcionalidade onde o próprio usuário faz o controle dos boletos pagos, já que ele pode acessar o internet banking da empresa. Alguns bancos (Banco do Brasil, por exemplo) possuem exportações dos dados de extrato do internet banking em formatos CSV e XLS, então seria possível facilitar um pouco e permitir que o usuário faça upload desses arquivos para seu sistema e ele identifique se há boletos pagos no extrato.

Para fazer esse controle é necessário que você faça a consulta do status dos boletos (se foi pago ou não, com atraso, etc…) no sistema do banco, essa consulta é feita via troca de arquivos de texto com o banco através do padrão CNAB, porém cada banco tem suas próprias extensões para o padrão CNAB o que acaba obrigando você a ter um modelo diferente de envio e recepção para cada banco. A especificação desses modelos pode ser achada na internet ou no site de cada banco.

É importante notar que cada vez que você faz uma consulta o banco te cobra uma taxa, por isso limite a quantidade de consultas.

Fonte

Related Posts:

Qual a diferença entre AppCompatActivity e Activity? – android android-activity
Pergunta: Qual a diferença da AppCompatActivity para Activity ? A partir de qual versão a AppCompatActivity foi adicionada ao Android? Autor da pergunta Luhhh A diferença reside ...
Como abreviar palavras em PHP? – php string
Pergunta: Possuo informações comuns como nome de pessoas e endereços, e preciso que elas contenham no máximo 30 caracteres sem cortar palavras. Exemplo: 'Avenida Natalino João Brescansin' ...
Qual é a finalidade de um parêntese vazio numa declaração Lambda? – c# expressões-lambda característica-linguagem
Pergunta: Criei um exemplo de uma declaração Lambda sem argumentos, entretanto, estou com duvidas referente a omissão do parêntese vazio () na declaração. Veja o exemplo: class ...
Boas práticas para URI em API RESTful – api rest restful
Pergunta: Estou com dúvida em relação às URIs de alguns recursos da api que estou desenvolvendo. Tenho os recursos projetos e atividades com relação 1-N, ...
Dúvidas sobre a integração do MySQL com Java – java mysql netbeans
Pergunta: Estou criando um sistema no NetBeans, utilizando a linguagem Java e o banco de dados MySQL. Escrevi o seguinte código para realizar a conexão ...
Qual é a finalidade da pasta Model do framework Inphinit? – php inphinit
Pergunta: No Inphinit micro-framework existe a pasta Model que fica dentro da pasta application, e nela é onde ficam as classes, mas eu estou muito ...
Uso do ‘@’ em variáveis – javascript typescript coffeescript
Pergunta: Vejo em algumas linguagens que compilam para javascript, como TypeScript e CoffeeScript, o uso do @ em variáveis, como também, casos em que o ...
Qual tamanho máximo um arquivo JSON pode ter? – json arquivo
Pergunta: Vou dar um exemplo para conseguir explicar minha duvida: Preciso recuperar informação de imagens vindas de uma API, esse banco de imagens me retorna JSON's ...
O que é Teste de Regressão? – terminologia engenharia-de-software testes
Pergunta: Na matéria de Teste de Software o professor abordou um termo chamado Teste de Regressão, isto dentro da disciplina de teste de software. Sendo ...
O que é um construtor da linguagem? – php característica-linguagem
Pergunta: Em PHP, já li e ouvi várias vezes a respeito dos Construtores da Linguagem. Os casos que sempre ouvi falar deles foi em casos ...
Função intrínseca para converter numérico para string – cobol
Pergunta: Estou a tentar saber se existe alguma função intrínseca do COBOL para converter um data numérico para string sem precisar usar a cláusula REDEFINES: ( ...
Porque usar implements? – java android
Pergunta: Qual a diferença entre usar btn.setOnClickListener(new OnClickListener() { e public class MainActivity extends Activity implements OnClickListener{ Estive fazendo um curso de Android e meu professor falou que ...
O que é XHTML e quando deve ser usado? – html xml xhtml
Pergunta: O que eu sei é que o XHTML precisa ser XML válido. Isso implica, por exemplo, que todas as tags precisam ser fechadas. Por ...
Uma placa aceleradora de vídeo pode melhorar o desempenho não-gráfico? [fechada] – desempenho
Pergunta: Para desenvolver em Ruby on Rails, eu utilizo aqui uma máquina virtual do VirtualBox com Ubuntu Server 14.04 sem interface gráfica instalada. Recentemente descobri uma ...
Concat() VS Union() – c# .net
Pergunta: Qual a diferença entre Concat() e Union() ? Quando usar Concat() e quando usar Union() ? Somente pode ser usado em list ? ...

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *