BoletoNet/boletonet

Digito verificador inválido

Opened this issue · 11 comments

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

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

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

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

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

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

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?

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.

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)?

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

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')
          );

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
    }