BoletoNet / boletonet

Boleto.Net is a library developed for use in Brazil, given it has been programmed with Brazilian retail legislation and business rules for bank registered billing integration.
Apache License 2.0
481 stars 383 forks source link

Digito verificador inválido #974

Open natancd opened 1 year ago

natancd commented 1 year ago

Olá!

Estou usando a API em ASP.NET

Funciona perfeitamente: gero o boleto em PDF e eu faço a conversão bytes e em seguida base64. Até aqui tudo bem, porém fui simular um pagamento de um boleto gerado para o BB, mas o sistema do banco informa que o DV está inválido.

Não sei se ajuda, mas segue uma parte do meu código:

BoletoBancario boletoBancario = new BoletoBancario();
boletoBancario.CodigoBanco = 1;
boletoBancario.Boleto = boletoNet;
boletoBancario.Boleto.Valida();

boletoBancario.MontaHtmlEmbedded();
boletoBancario.Boleto.Valida();
byte[] pdfBytes = boletoBancario.MontaBytesPDF();
string base64String = Convert.ToBase64String(pdfBytes);

boletoNet tem o seguinte: image

Estou esquecendo algum detalhe? Informo, também, que esta é minha primeira vez usando o BoletoNet

carloscds commented 1 year ago

@natancd Isto normalmente é erro no codigo do convênio, confirme com o banco.

natancd commented 1 year ago

confirmei com o cliente e o boleto de fato foi gerado corretamente, tanto é que ele conseguiu pegar o PDF direto pelo site do BB

carloscds commented 1 year ago

@natancd O boleto foi gerado pelo BoletoNet ? Comop fez o registro ?

natancd commented 1 year ago

Na verdade o boleto foi gerado via RestSharp, utilizando os dados que o BB disponibiliza na API deles. Porém, não entendo até o momento o motivo deles não gerarem o boleto em PDF. Nas pequisas de como gerar PDF de boletos, achei o BoletoNet.

Com o retorno positivo da API do BB (ou seja, o boleto foi de fato gerado), eu tenho uma função que irá gerar o PDF desses dados utilizando BoletoNet.

Este é o único trecho do código onde utilizo esta biblioteca: image

Os dados estão hardcoded/com variáveis alteradas (pois é parte de um código de uma empresa), mas eles vem de variáveis utilizadas tanto para enviar à API do BB como alguns de retorno da API, como por exemplo o "Seu Número" e o "Nosso Número".

Tenho, ainda, acesso a esses dados, também salvo em banco de dados local (dados fictícios, retorno da API de homologação do BB): image

carloscds commented 1 year ago

@natancd Se você passar os mesmos dados, ele gera a mesma linha, aqui na empresa tambem usamos o BB e imprimimos pelo BoletoNet.

stupied4ever commented 11 months ago

Estou tendo "o mesmo problema", mas com o banco Itaú. Gerando o boleto com o boleto.net, recebo o digito verificador 6 (e não é reconhecido como um boleto válido), porem, quando gerado pelo Itaú o digito é 3 (e é reconhecido como válido nos aplicativos de banco).

@carloscds Fiquei na duvida o que seria o

codigo do convênio,

@natancd vc conseguiu identificar qual era o problema?

carloscds commented 11 months ago

Estou tendo "o mesmo problema", mas com o banco Itaú. Gerando o boleto com o boleto.net, recebo o digito verificador 6 (e não é reconhecido como um boleto válido), porem, quando gerado pelo Itaú o digito é 3 (e é reconhecido como válido nos aplicativos de banco).

@carloscds Fiquei na duvida o que seria o

codigo do convênio,

@natancd vc conseguiu identificar qual era o problema?

O convenio é tipo um cadastro da empresa no banco, ideal é verificar com o gerente da conta no banco.

stupied4ever commented 11 months ago

O convenio é tipo um cadastro da empresa no banco, ideal é verificar com o gerente da conta no banco.

Entendi, mas ainda não entendi como ele interfere na geração do boleto, qual parâmetro do Boleto.Net representa o convênio (se é que existe um)?

carloscds commented 11 months ago

@stupied4ever Ideal você dar uma olhada no manual da cobranca do banco, o convênio é usado na linha digitavel do boleto, em alguns bancos.

stupied4ever commented 11 months ago

Acho que encontrei. No meu caso o problema era a agencia do cedente sendo enviada sem zeros a esquerda. A mudança abaixo resolveu meu problema:

# Antes
var cedente = new Cedente(
                cnpj,
                {razaoSocial} CNPJ - {cnpj.FormataCnpj()}",
                agencia.ToString(),
                conta.PadLeft(5, '0')
            );

# Depois
var cedente = new Cedente(
              cnpj,
              {razaoSocial} CNPJ - {cnpj.FormataCnpj()}",
              agencia.ToString().PadLeft(4, '0'),
              conta.PadLeft(5, '0')
          );
natancd commented 11 months ago

Somente para complementar: o meu problema era a chamada da função Valida duas vezes e faltava validar as linhas digitáveis, acabei criando uma função para fazer isso.

Em resumo, meu código ficou basicamente assim:

BoletoBancario boletoBancario = new BoletoBancario();
boletoBancario.CodigoBanco = codigoBanco;
boletoBancario.Boleto = boletoNet;
boletoBancario.Boleto.Valida();
boletoBancario.Boleto.CodigoBarra.Codigo = codigoBarras;
string linhaDigitavelFormatada = ConverterLinhaDigitavel(codigoBanco, linhaDigitavel (campo de retorno do banco);
boletoBancario.Boleto.CodigoBarra.LinhaDigitavel = linhaDigitavelFormatada;

boletoBancario.MontaHtmlEmbedded();
byte[] pdfBytes = boletoBancario.MontaBytesPDF();
string base64String = Convert.ToBase64String(pdfBytes);

 public static string ConverterLinhaDigitavel(int bankNumber, string input)
        {
            string firstPart;
            string secondPart;
            string thirdPart;
            string fourthPart;
            string fifthPart;
            switch (bankNumber)
            {
                case 1:
                    firstPart = input.Substring(0, 5) + "." + input.Substring(5, 5);
                    secondPart = input.Substring(10, 5) + "." + input.Substring(15, 6);
                    thirdPart = input.Substring(21, 5) + "." + input.Substring(26, 9);
                    fourthPart = input.Substring(35, 1);
                    fifthPart = input.Substring(36);
                    break;
                default:
                    firstPart = input.Substring(0, 5) + "." + input.Substring(5, 5);
                    secondPart = input.Substring(10, 5) + "." + input.Substring(15, 6);
                    thirdPart = input.Substring(21, 5) + "." + input.Substring(26, 9);
                    fourthPart = input.Substring(35, 1);
                    fifthPart = input.Substring(36);
                    break;
            }

            return $"{firstPart} {secondPart} {thirdPart} {fourthPart} {fifthPart}";
        }
        #endregion
    }