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);
Estou esquecendo algum detalhe?
Informo, também, que esta é minha primeira vez usando o BoletoNet
confirmei com o cliente e o boleto de fato foi gerado corretamente, tanto é que ele conseguiu pegar o PDF direto pelo site do BB
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:
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):
@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
}