Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Digito verificador inválido #974

Open
natancd opened this issue Jun 14, 2023 · 11 comments
Open

Digito verificador inválido #974

natancd opened this issue Jun 14, 2023 · 11 comments

Comments

@natancd
Copy link

natancd commented Jun 14, 2023

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
Copy link
Contributor

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

@natancd
Copy link
Author

natancd commented Jun 23, 2023

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
Copy link
Contributor

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

@natancd
Copy link
Author

natancd commented Jun 26, 2023

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
Copy link
Contributor

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

@stupied4ever
Copy link

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
Copy link
Contributor

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
Copy link

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
Copy link
Contributor

@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
Copy link

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
Copy link
Author

natancd commented Dec 29, 2023

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
    }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants