Open leonardomsgoncalves opened 8 years ago
Boa tarde pessoal, Alguem tem o código post em c# para passar, estou utilizando um e esta dando erro. Não retorna informação.
void POST(string url, Byte[] jsonContent)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
//Byte[] byteArray = encoding.GetBytes(jsonContent);
Byte[] byteArray = jsonContent;
request.ContentLength = byteArray.Length;
request.ContentType = @"application/json";
using (Stream dataStream = request.GetRequestStream())
{
dataStream.Write(byteArray, 0, byteArray.Length);
}
long length = 0;
try
{
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
length = response.ContentLength;
}
}
catch (WebException ex)
{
// Log exception and throw as for GET example above
}
}
e ai galera! alguém teve problema no retorno com o código de erro "02 - Erro Genérico – sistema indisponível"??
alguém sabe dizer se o sistema esta indisponível? Só recebo o erro 02....
Bruno, esta sim. Mas tbm estou apanhando aqui...
Bruno, vc pode disponibilizar usa rotina de POST, se estiver em .net?
Está exatamente como eu estou usando, mas você vai precisar adaptar pouca coisa.
O envio, já com a mensagem assinada, eu estou fazendo assim:
private bool SolicitarRegistroOnline(byte[] JsonAssinado, out HttpResponseMessage response)
{
response = new HttpResponseMessage();
try
{
var httpClient = new HttpClient();
httpClient.Timeout = new TimeSpan(0, 3, 0);
HttpContent content = new StringContent(Convert.ToBase64String(JsonAssinado));
content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
response = httpClient.PostAsync(_strCaminhoWebService, content).Result;
}
catch (Exception ex)
{
MontarMensagemDeErro("Erro ao solicitar registro de boleto: " + ex.Message);
return false;
}
return true;
}
Com a resposta desse método eu separo o retorno numa classe (CARegistroBoletosBradescoWS) que só precisa das propriedades "cdErro" e "msgErro" para testar:
private bool CarregarObjetoDeRetorno(HttpResponseMessage response, out CARegistroBoletosBradescoWS objCARegistroBoletosBradescoWS)
{
objCARegistroBoletosBradescoWS = new CARegistroBoletosBradescoWS();
try
{
var xmlRetorno = XDocument.Parse(response.Content.ReadAsStringAsync().Result);
objCARegistroBoletosBradescoWS = JsonConvert.DeserializeObject<CARegistroBoletosBradescoWS>(xmlRetorno.Root.Value);
}
catch (Exception ex)
{
MontarMensagemDeErro("Erro ao acessar WS para registro de boleto (Bradesco). " + ex.Message);
return false;
}
if (objCARegistroBoletosBradescoWS.cdErro != "00")
{
MontarMensagemDeErro("Erro ao acessar WS para registro de boleto (Bradesco). Código do erro: " + objCARegistroBoletosBradescoWS.cdErro + ". Mensagem: " + objCARegistroBoletosBradescoWS.msgErro);
return false;
}
return true;
}
Bom dia pessoal, alguém que esteja fazendo em Java pra trocar uma ideia?
@brunoDionizio Beleza, estou utilizando seu código mas aqui esta dando StatusCode: 500, ReasonPhrase: 'Internal Server Error', Version: 1.1
Sera que pode ser o certificado que estou utilizando para assinar? Precisa ser um especifico? onde consigo?
Abrs
@agichihara Eu tive esse problema ao assinar, funcionou com o código que o Biux postou.
Se você rodar o comando response.Content.ReadAsStringAsync().Result
provavelmente vai retornar o código de erro 810. Pode ser a maneira que está assinando ou o certificado mesmo, mas eu não sei os passos para conseguir um.
@brunoDionizio estou usando um certificado que tinha aqui na maquina :) ou seja um qualquer...
Bom dia Pessoal
Aqui na empresa nos compramos o certificado ICP-BRASIL A1 e já iniciamos a homologação. Fizemos todo o processo conforme manual mas estamos recebendo o erro abaixo:
{"cdErro":"800", "msgErro":"Erro Certificado / Formatacao dos campos da mensagem invalida [0x00230001]
Alguém sabe me informar o que pode ser? Já entrei em contato com a 7comm mas eles demoram muito pra responder
@hgmauri Como você está montando o Json? Eu tive esse problema quando tentava montar manualmente, mas deu certo convertendo um objeto. Assim (com todas as propriedades do manual):
var objJson = new
{
nuCPFCNPJ = CNPJ.Substring(0, 8),
filialCPFCNPJ = CNPJ.Substring(8, 4),
ctrlCPFCNPJ = CNPJ.Substring(12, 2),
cdTipoAcesso = "2",
clubBanco = "2269651",
cdTipoContrato = "48",
nuSequenciaContrato = "0"
};
var strJson = JsonConvert.SerializeObject(objJson);
Acho que também dá esse erro se não respeitar o tamanho máximo dos campos.
Fala @brunoDionizio , beleza?
Então, eu estou respeitando de acordo com o manual.. por exemplo, estou enviando a mensagem abaixo com alguns campos preenchidos para o serviço de homologação e continua o mesmo erro:
{"nuCPFCNPJ":"27406222","filialCPFCNPJ":"0001","ctrlCPFCNPJ":"65","cdTipoAcesso":"2","clubBanco":"2269651","cdTipoContrato":"48","nuSequenciaContrato":null,"idProduto":"09","nuNegociacao":"351100000000057727","cdBanco":"237","eNuSequenciaContrato":null,"tpRegistro":"1","cdProduto":null,"nuTitulo":null,"nuCliente":null,"dtEmissaoTitulo":"06.09.2017","dtVencimentoTitulo":"16.09.2017","tpVencimento":"0","vlNominalTitulo":null,"cdEspecieTitulo":null,"tpProtestoAutomaticoNegativacao":null,"prazoProtestoAutomaticoNegativacao":null,"controleParticipante":null,"cdPagamentoParcial":null,"qtdePagamentoParcial":null,"percentualJuros":null,"vlJuros":null,"qtdeDiasJuros":null,"percentualMulta":null,"vlMulta":null,"qtdeDiasMulta":null,"percentualDesconto1":null,"vlDesconto1":null,"dataLimiteDesconto1":null,"percentualDesconto2":null,"vlDesconto2":null,"dataLimiteDesconto2":null,"percentualDesconto3":null,"vlDesconto3":null,"dataLimiteDesconto3":null,"prazoBonificacao":null,"percentualBonificacao":null,"vlBonificacao":null,"dtLimiteBonificacao":null,"vlAbatimento":null,"vlIOF":null,"nomePagador":null,"logradouroPagador":null,"nuLogradouroPagador":null,"complementoLogradouroPagador":null,"cepPagador":null,"complementoCepPagador":null,"bairroPagador":null,"municipioPagador":null,"ufPagador":null,"cdIndCpfcnpjPagador":null,"nuCpfcnpjPagador":null,"endEletronicoPagador":null,"nomeSacadorAvalista":null,"logradouroSacadorAvalista":null,"nuLogradouroSacadorAvalista":null,"complementoLogradouroSacadorAvalista":null,"cepSacadorAvalista":null,"complementoCepSacadorAvalista":null,"bairroSacadorAvalista":null,"municipioSacadorAvalista":null,"ufSacadorAvalista":null,"cdIndCpfcnpjSacadorAvalista":null,"nuCpfcnpjSacadorAvalista":null,"endEletronicoSacadorAvalista":null}
Antes de enviar eu pego o certificado instalado e assino
@hgmauri pela documentação, não pode valores null, tem q colocar " "(Alfanuméricos) ou "0" (numéricos).
Observações sobre o preenchimento dos campos:
- Todos os campos devem ser informados no layout, obrigatórios e não obrigatórios, os não obrigatórios devem vir com zeros se o tipo de campo é numérico ou espaços se o campo é alfanumérico;
- Nos campos que dizem respeito a multa, juros, bonificação ou desconto, deve ser preenchido ou valor ou percentual, nunca os dois campos mutualmente;
Isso mesmo, testei aqui com esse Json e depois trocando null por "0". No segundo caso a mensagem foi diferente.
@alissonwagner e @brunoDionizio eu vou pagar com chopp pra vcs! deu certo aqui e já consegui a comunicação.
Obrigado pessoal
@alissonwagner cara....estou com o mesmo problema do @brunoDionizio ...... Fiz a alteração aqui do Json mas não rolou...Consegue ajudar? Segue Json;
{ "nuCPFCNPJ":"12345678", "filialCPFCNPJ":"0001", "ctrlCPFCNPJ":"89", "cdTipoAcesso":"2", "clubBanco":"2269651", "cdTipoContrato":"48", "nuSequenciaContrato":"0", "idProduto":"09", "nuNegociacao":"111100000000001259", "cdBanco":"237", "eNuSequenciaContrato":"0", "tpRegistro":"1", "cdProduto":"0", "nuTitulo":"0", "nuCliente":"0200001224", "dtEmissaoTitulo":"06.09.2017", "dtVencimentoTitulo":"11.09.2017", "tpVencimento":"0", "vlNominalTitulo":"100", "cdEspecieTitulo":"32", "tpProtestoAutomaticoNegativacao":"0", "prazoProtestoAutomaticoNegativacao":"0", "controleParticipante":"", "cdPagamentoParcial":"", "qtdePagamentoParcial":"0", "percentualJuros":"0", "vlJuros":"0", "qtdeDiasJuros":"0", "percentualMulta":"0", "vlMulta":"0", "qtdeDiasMulta":"0", "percentualDesconto1":"0", "vlDesconto1":"0", "dataLimiteDesconto1":"", "percentualDesconto2":"0", "vlDesconto2":"0", "dataLimiteDesconto2":"", "percentualDesconto3":"0", "vlDesconto3":"0", "dataLimiteDesconto3":"", "prazoBonificacao":"0", "percentualBonificacao":"0", "vlBonificacao":"0", "dtLimiteBonificacao":"", "vlAbatimento":"0", "vlIOF":"0", "nomePagador":"NOME DO MEU CLIENTE", "logradouroPagador":"RUA BOCAINA DE MINAS", "nuLogradouroPagador":"259", "complementoLogradouroPagador":"", "cepPagador":"04939", "complementoCepPagador":"200", "bairroPagador":"JARDIM TUPI", "municipioPagador":"SAO PAULO", "ufPagador":"SP", "cdIndCpfcnpjPagador":"1", "nuCpfcnpjPagador":"00012345678910", "endEletronicoPagador":"", "nomeSacadorAvalista":"", "logradouroSacadorAvalista":"", "nuLogradouroSacadorAvalista":"", "complementoLogradouroSacadorAvalista":"", "cepSacadorAvalista":"0", "complementoCepSacadorAvalista":"0", "bairroSacadorAvalista":"", "municipioSacadorAvalista":"", "ufSacadorAvalista":"", "cdIndCpfcnpjSacadorAvalista":"", "nuCpfcnpjSacadorAvalista":"", "endEletronicoSacadorAvalista":"" }
@hgmauri você tem um exemplo do json que vc utilizou?
@dodouglas12 Coloca espaço em branco onde é String vazia " "
Estou penando num erro 500 aqui, alguém faz ideia?
Galera sobre o erro 02: no meu caso era por que estava enviando no campo "cdEspecieTitulo" o código 32, porém o código a ser utilizado para esta conta deveria ser a partir do 01 até 29. Neste caso foi orientação dada pela equipe que presta serviço ao banco e em relação a conta cadastrada no Bradesco Net. Mas fica dica pra galera.
@alissonwagner retorna erro 500 da API do banco?
@alissonwagner coloquei espaço em branco e continuo recebendo o erro 800.
@dodouglas12 experimenta remover os zeros a esquerda do cpf do pagador.
@BrunoZanholo isso, quando tento fazer o post me retorna um 500
@dodouglas12 a princípio o erro 800 é da formatação do Json, da uma conferida nos dados
@alissonwagner como esta o código que você esta fazendo o post? Coloca ai pra gente tentar ajudar... erro 500 é o chamado erro de implementação... tem certeza que esse erro dá no retorno da chamada ao WS ou da na sua app?
@BrunoZanholo Tentei usando o Spring RestTemplate pra java, o código é esse:
private void postWithRestTemplate(String asignedJson) {
String resultado = "";
Map<String, String> vars = new HashMap<String, String>();
vars.put("ContentType", "application/json");
try {
resultado = restTemplate.postForObject(
"https://cobranca.bradesconetempresa.b.br/ibpjregistrotitulows/registrotitulohomologacao", asignedJson, String.class, vars);
} catch (Exception e) {
LOG.error("Erro", e);
}
}
Na conf do RestTemplate vai isso pra enviar pelo TLS (tentei sem tbm, de algumas formas)
@Bean
RestTemplate restTemplate(RestTemplateBuilder builder) throws Exception {
/*
* Create an SSLContext that uses client.jks as the client certificate
* and the truststore.jks as the trust material (trusted CA certificates).
* In this sample, truststore.jks contains ca.pem which was used to sign
* both client.pfx and server.jks.
*/
SSLContext sslContext = SSLContextBuilder
.create()
.loadKeyMaterial(certificado, senha)
.build();
/*
* Create an HttpClient that uses the custom SSLContext
*/
HttpClient client = HttpClients.custom()
.setSSLContext(sslContext)
.build();
/*
* Create a RestTemplate that uses a request factory that references
* our custom HttpClient
*/
return builder
.requestFactory(new HttpComponentsClientHttpRequestFactory(client))
.build();
}
E tentei pelo java net url que é algo assim
URL url = new URL("https://cobranca.bradesconetempresa.b.br/ibpjregistrotitulows/registrotitulohomologacao");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json");
OutputStream os = conn.getOutputStream();
os.write(input.getBytes());
os.flush();
if (conn.getResponseCode() != HttpURLConnection.HTTP_CREATED) {
throw new RuntimeException("Failed : HTTP error code : "
+ conn.getResponseCode());
}
Nesse caso o response na connection vem 500, acredito que venha de lá.
Estou usando um certificado PKCS#12, mas segundo eles, não tem problema
@alissonwagner É que erro 500 é o código para "Internal Error", é coisa de API, sei lá. Mas o código de verdade (dos que tem no manual) vem em um Json dentro do XML de retorno. Não sei em Java, mas ao fazer isso em C# dá pra ver esse Json:
var xmlRetorno = XDocument.Parse(response.Content.ReadAsStringAsync().Result);
@BrunoZanholo ta embaçado esse erro 800 kkkkkkkkkkkkkkkkkk....já fiz, refiz, olhei denovo....kkkkkk
Estou mandando dessa forma: {"nuCPFCNPJ":"12345678","filialCPFCNPJ":"1","ctrlCPFCNPJ":"89","cdTipoAcesso":"2","clubBanco":"2269651","cdTipoContrato":"48","nuSequenciaContrato":"0","idProduto":"9","nuNegociacao":"111100000000001259","cdBanco":"237","eNuSequenciaContrato":"0","tpRegistro":"1","cdProduto":"0","nuTitulo":"0","nuCliente":"200001224","dtEmissaoTitulo":"06.09.2017","dtVencimentoTitulo":"11.09.2017","tpVencimento":"0","vlNominalTitulo":"100000","cdEspecieTitulo":"23","tpProtestoAutomaticoNegativacao":"0","prazoProtestoAutomaticoNegativacao":"0","controleParticipante":" ","cdPagamentoParcial":"N","qtdePagamentoParcial":"0","percentualJuros":"0","vlJuros":"0","qtdeDiasJuros":"0","percentualMulta":"0","vlMulta":"0","qtdeDiasMulta":"0","percentualDesconto1":"0","vlDesconto1":"0","dataLimiteDesconto1":" ","percentualDesconto2":"0","vlDesconto2":"0","dataLimiteDesconto2":" ","percentualDesconto3":"0","vlDesconto3":"0","dataLimiteDesconto3":" ","prazoBonificacao":"0","percentualBonificacao":"0","vlBonificacao":"0","dtLimiteBonificacao":" ","vlAbatimento":"0","vlIOF":"0","nomePagador":"Joao Chico Doidao","logradouroPagador":"RUA BOCAINA DE MINAS","nuLogradouroPagador":"890","complementoLogradouroPagador":"CASA","cepPagador":"04939","complementoCepPagador":"200","bairroPagador":"JARDIM TUPI","municipioPagador":"SAO PAULO","ufPagador":"SP","cdIndCpfcnpjPagador":"1","nuCpfcnpjPagador":"99428636649","endEletronicoPagador":" ","nomeSacadorAvalista":" ","logradouroSacadorAvalista":" ","nuLogradouroSacadorAvalista":" ","complementoLogradouroSacadorAvalista":" ","cepSacadorAvalista":"0","complementoCepSacadorAvalista":"0","bairroSacadorAvalista":" ","municipioSacadorAvalista":" ","ufSacadorAvalista":" ","cdIndCpfcnpjSacadorAvalista":" ","nuCpfcnpjSacadorAvalista":" ","endEletronicoSacadorAvalista":" "}
Quando eu assino esse json, ele fica assim: MIIeUwYJKoZIhvcNAQcCoIIeRDCCHkACAQExCzAJBgUrDgMCGgUAMIIHJwYJKoZIhvcNAQcBoIIHGASCBxR7Im51Q1BGQ05QSiI6IjQwODQyNzAiLCJmaWxpYWxDUEZDTlBKIjoiMSIsImN0cmxDUEZDTlBKIjoiODkiLCJjZFRpcG9BY2Vzc28iOiIyIiwiY2x1YkJhbmNvIjoiMjI2OTY1MSIsImNkVGlwb0NvbnRyYXRvIjoiNDgiLCJudVNlcXVlbmNpYUNvbnRyYXRvIjoiMCIsImlkUHJvZHV0byI6IjkiLCJudU5lZ29jaWFjYW8iOiIzMzk1MDAwMDAwMDAwMDEyNTkiLCJjZEJhbmNvIjoiMjM3IiwiZU51U2VxdWVuY2lhQ29udHJhdG8iOiIwIiwidHBSZWdpc3RybyI6IjEiLCJjZFByb2R1dG8iOiIwIiwibnVUaXR1bG8iOiIwIiwibnVDbGllbnRlIjoiMjAwMDAxMjI0IiwiZHRFbWlzc2FvVGl0dWxvIjoiMDYuMDkuMjAxNyIsImR0VmVuY2ltZW50b1RpdHVsbyI6IjExLjA5LjIwMTciLCJ0cFZlbmNpbWVudG8iOiIwIiwidmxOb21pbmFsVGl0dWxvIjoiMTAwMDAwIiwiY2RFc3BlY2llVGl0dWxvIjoiMjMiLCJ0cFByb3Rlc3RvQXV0b21hdGljb05lZ2F0aXZhY2FvIjoiMCIsInByYXpvUHJvdGVzdG9BdXRvbWF0aWNvTmVnYXRpdmFjYW8iOiIwIiwiY29udHJvbGVQYXJ0aWNpcGFudGUiOiIgIiwiY2RQYWdhbWVudG9QYXJjaWFsIjoiTiIsInF0ZGVQYWdhbWVudG9QYXJjaWFsIjoiMCIsInBlcmNlbnR1YWxKdXJvcyI6IjAiLCJ2bEp1cm9zIjoiMCIsInF0ZGVEaWFzSnVyb3MiOiIwIiwicGVyY2VudHVhbE11bHRhIjoiMCIsInZsTXVsdGEiOiIwIiwicXRkZURpYXNNdWx0YSI6IjAiLCJwZXJjZW50dWFsRGVzY29udG8xIjoiMCIsInZsRGVzY29udG8xIjoiMCIsImRhdGFMaW1pdGVEZXNjb250bzEiOiIgIiwicGVyY2VudHVhbERlc2NvbnRvMiI6IjAiLCJ2bERlc2NvbnRvMiI6IjAiLCJkYXRhTGltaXRlRGVzY29udG8yIjoiICIsInBlcmNlbnR1YWxEZXNjb250bzMiOiIwIiwidmxEZXNjb250bzMiOiIwIiwiZGF0YUxpbWl0ZURlc2NvbnRvMyI6IiAiLCJwcmF6b0JvbmlmaWNhY2FvIjoiMCIsInBlcmNlbnR1YWxCb25pZmljYWNhbyI6IjAiLCJ2bEJvbmlmaWNhY2FvIjoiMCIsImR0TGltaXRlQm9uaWZpY2FjYW8iOiIgIiwidmxBYmF0aW1lbnRvIjoiMCIsInZsSU9GIjoiMCIsIm5vbWVQYWdhZG9yIjoiRG91Z2xhcyBHb21lcyBGZXJyZWlyYSBkZSBNb3JhZXMiLCJsb2dyYWRvdXJvUGFnYWRvciI6IlJVQSBCT0NBSU5BIERFIE1JTkFTIiwibnVMb2dyYWRvdXJvUGFnYWRvciI6Ijg5MCIsImNvbXBsZW1lbnRvTG9ncmFkb3Vyb1BhZ2Fkb3IiOiJDQVNBIiwiY2VwUGFnYWRvciI6IjA0OTM5IiwiY29tcGxlbWVudG9DZXBQYWdhZG9yIjoiMjAwIiwiYmFpcnJvUGFnYWRvciI6IkpBUkRJTSBUVVBJIiwibXVuaWNpcGlvUGFnYWRvciI6IlNBTyBQQVVMTyIsInVmUGFnYWRvciI6IlNQIiwiY2RJbmRDcGZjbnBqUGFnYWRvciI6IjEiLCJudUNwZmNucGpQYWdhZG9yIjoiMzkyMDc2MDU4MTMiLCJlbmRFbGV0cm9uaWNvUGFnYWRvciI6IiAiLCJub21lU2FjYWRvckF2YWxpc3RhIjoiICIsImxvZ3JhZG91cm9TYWNhZG9yQXZhbGlzdGEiOiIgIiwibnVMb2dyYWRvdXJvU2FjYWRvckF2YWxpc3RhIjoiICIsImNvbXBsZW1lbnRvTG9ncmFkb3Vyb1NhY2Fkb3JBdmFsaXN0YSI6IiAiLCJjZXBTYWNhZG9yQXZhbGlzdGEiOiIwIiwiY29tcGxlbWVudG9DZXBTYWNhZG9yQXZhbGlzdGEiOiIwIiwiYmFpcnJvU2FjYWRvckF2YWxpc3RhIjoiICIsIm11bmljaXBpb1NhY2Fkb3JBdmFsaXN0YSI6IiAiLCJ1ZlNhY2Fkb3JBdmFsaXN0YSI6IiAiLCJjZEluZENwZmNucGpTYWNhZG9yQXZhbGlzdGEiOiIgIiwibnVDcGZjbnBqU2FjYWRvckF2YWxpc3RhIjoiICIsImVuZEVsZXRyb25pY29TYWNhZG9yQXZhbGlzdGEiOiIgIn2gghVZMIIGYDCCBEigAwIBAgIBCDANBgkqhkiG9w0BAQ0FADCBlzELMAkGA1UEBhMCQlIxEzARBgNVBAoTCklDUC1CcmFzaWwxPTA7BgNVBAsTNEluc3RpdHV0byBOYWNpb25hbCBkZSBUZWNub2xvZ2lhIGRhIEluZm9ybWFjYW8gLSBJVEkxNDAyBgNVBAMTK0F1dG9yaWRhZGUgQ2VydGlmaWNhZG9yYSBSYWl6IEJyYXNpbGVpcmEgdjIwHhcNMTExMDIxMTIxNjI5WhcNMjExMDIxMTIxNjI5WjCBkDELMAkGA1UEBhMCQlIxEzARBgNVBAoTCklDUC1CcmFzaWwxNDAyBgNVBAsTK0F1dG9yaWRhZGUgQ2VydGlmaWNhZG9yYSBSYWl6IEJyYXNpbGVpcmEgdjIxNjA0BgNVBAMTLUFDIFNlY3JldGFyaWEgZGEgUmVjZWl0YSBGZWRlcmFsIGRvIEJyYXNpbCB2MzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMFyHLTC/E6bRxhdNYhePQ9um1dASSkb6+2i8Ss0kfSEAm3KfmWDUxLpHaAKP2xR2NT8ju1Kpq6Mns1tZmso3VzcacHS3X5nagP/I+jwJIV+GftJEp+iiPv1EkiF8hMksXk3vOaHPOA/TNpmmU/nyEB5jNSwEwwych2RTb0IvNr3bV62oJecNNJIu+ws7Z4Rs9Wot0F13lCrVm0KRLHj2llcgu67ArTsFlkDhKNZbS3ohFucGIlVlkIg/B0E2MjARjos21QJHaYcRmr2w9rF1uZkylUtbn4wYWsj5kt9BCthcjgKKl2oVZB9agIS0AgUcfaoia8tsl7F63l/aa2kQ9UcQewBbORR4TZPGJSKbItKylP8/EN86u3rPI7nsmJn6HuMVl53hhLKNupP7mtrUZHC3w2FBvD3/JNiKJaP08GFjLH6vEiaR2m9YhizvJUXnDL9yFbkRHU+1lDssdnVDRSNVQX1tK0IpeRAMTHz60e1yJq+SrGNypEOSlFdeD05xFzIjUbpKQe4Obml9wvBHF9FT2evGxknWOFxda0frZzl0UOK70++BSfe6BZ9UwHKXhyjOazPoXEzRK7w6fHYlGjY5XkQ6Y9qNCt6lu80zy6vAxQ/f1Y3w9b+ArawqyTVtb9AtcJsAxhtBf/9njiE1dSTYve5D5S94zNiIWtpDxzbAgMBAAGjgbswgbgwHQYDVR0OBBYEFHXLupDRzkynkvBxsMu+uHszBrIoMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMBQGA1UdIAQNMAswCQYFYEwBAQgwADA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vYWNyYWl6LmljcGJyYXNpbC5nb3YuYnIvTENSYWNyYWl6djIuY3JsMB8GA1UdIwQYMBaAFAw5IDq3AR/L1yh9QaDH+kqtMiS+MA0GCSqGSIb3DQEBDQUAA4ICAQCJiamFONQFDtlBuOkqfglnGYufeillnVGeH6TWp7yPEuH9Hfdq/1oN38aJmpvoWnno3GY5U/wKPokFAIizK2kASwvWSpu9hRD1kS5Fp4Qlqt1Zsm6bUOlcAD9wZylp7s1lebSj7XiO6epF4OSdeBtKl9OImeF8dhyqPnWbj2IrjxEzyrZ+U+Lb4bFcBI6Lp6r1NHyun+TWD3jbCkBRpJLQt7uO+5asMZYEO+L+fuexEb2Bb8difS4ujPpdMlctg4wm6NHTcB008C+cMkwDpeBvaWpMOZLvDvENDhQW4HBNHNDMdVoIsvvoxSVabrNxp02CATP0y9RubIgkmX40H+R8OXy8Cq3oipSm1t4v/Ihs4aCtoDLZue3Q12RgqHNaKcuwTNoK5BH5AfEYRE2LYxQ/JVrlf1hJAu0fUe2nhv42+i35AJVWpRrEmBk6GLejpJ/QAF1fRmdb0b1+lSLXgOfw3AzFW+e+8BdwCF/06FPOvapilPMa+bsL7aabinBZ7a4Kc97cMHEW5gkQL0IL6yxYnzALHajvZrrLxwvpzW/os3P2ztINB12cYAkDKf5nmo2ymDHY34IUfi1hPA8EEPkhozhi5Or/W6qRABsHiSxrSEeSKLy4V34hkShPjDtl2Ob/aU1/8A5g5BSGPBpfm/TQJc7g7MrF67lRDoAhDikamDCCBtcwggS/oAMCAQICAQ0wDQYJKoZIhvcNAQENBQAwgZAxCzAJBgNVBAYTAkJSMRMwEQYDVQQKEwpJQ1AtQnJhc2lsMTQwMgYDVQQLEytBdXRvcmlkYWRlIENlcnRpZmljYWRvcmEgUmFpeiBCcmFzaWxlaXJhIHYyMTYwNAYDVQQDEy1BQyBTZWNyZXRhcmlhIGRhIFJlY2VpdGEgRmVkZXJhbCBkbyBCcmFzaWwgdjMwHhcNMTIwNzIzMTgxNDA2WhcNMjAwNzIzMTgxNDA2WjBxMQswCQYDVQQGEwJCUjETMBEGA1UEChMKSUNQLUJyYXNpbDE2MDQGA1UECxMtU2VjcmV0YXJpYSBkYSBSZWNlaXRhIEZlZGVyYWwgZG8gQnJhc2lsIC0gUkZCMRUwEwYDVQQDEwxBQyBWQUxJRCBSRkIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDqQM1kIn1zqPJt1CoPlekhlFNzqmNxc1B8ICWzmOjDqibBrfZqRMYxyNKYnYVLz7vWiFsBXxmaXf4lGDCFtkMPykFNYXO86Fu1PpP5cPH3UGbHO6kcG94dz+1DOgQCksee+fSe2Imh7UOUy6p2pWw+n3oncdI/kYv6EEwPi02DTlbZNGMxFYX3l4ZDmSKJM+JMZIVfPSdGkmz2aWUt1qk+Mn7oPGpDRj6LqO6OlXSLTzHjLUQqvBpecCfe2eY9Kb6hqGTRvoilmpkUx3R3diOPgCKeee2GDoSTvuMQgiHxfoced9J0TAUVvTt9ncWjhJCXLgNH0FwUZmNtCOdDIsdDF2SnLwbA81pZD6OANiVRbBI/LdDdUEcAqo4AZ7RwNIwYZp5HDNRZ7RlfK3zN6ZnHFvQNAQ4ip0gPv7TmCDTzbBzeFmqfW1wU5AucR7HcEQm/0L8HeYiXxa2upsGDkqcFI6dIb/Uk35ixDEeQmQfh/X7oXCG1neR2UfXQBxv5cywcg4yrJsr+lturvXoTbXroBPzHcI3NaRp0+SJAoEmImnZakgF0b6lIOLZzlG/ekYY9eri2ZI4u+BJt+okgb5o3JZAmvrKwQp1wx/SBMdS6a/nM8D4sO0yZNAXoMha5QPBWjKMswiwxiPnyjXwrwvDYsT15jO4X0OKb2576eCf56QIDAQABo4IBWDCCAVQwgacGA1UdIASBnzCBnDBMBgZgTAECASUwQjBABggrBgEFBQcCARY0aHR0cDovL3d3dy5yZWNlaXRhLmZhemVuZGEuZ292LmJyL2FjcmZiL2RwY2FjcmZiLnBkZjBMBgZgTAECAyQwQjBABggrBgEFBQcCARY0aHR0cDovL3d3dy5yZWNlaXRhLmZhemVuZGEuZ292LmJyL2FjcmZiL2RwY2FjcmZiLnBkZjBEBgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vd3d3LnJlY2VpdGEuZmF6ZW5kYS5nb3YuYnIvYWNyZmIvYWNyZmJ2My5jcmwwHwYDVR0jBBgwFoAUdcu6kNHOTKeS8HGwy764ezMGsigwHQYDVR0OBBYEFEe5CFnYQvaS/Pd8FXwmgEpFkX6fMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDQUAA4ICAQBmeP2uSl2zfzXA579W4FFOm23lN3utkbfDsEyCRkxFpJvRrmgEe+NmWxwUWlo1cO5YQfILYzkyTQHM/ZamtncjkSUHHMszXzKFZS2Zcvyyxy07VD1YWqkigEwOVz4ZK9uBGNRAqq0mbAdGVtOhJOaQz/yy9j/9/v5/TAU2VS82FNbHqA4XaIKWO8+X04o8qvpaZ95V7H+Aw2XpYNkT5brfthjeduukcQ1v4xbdL/RLWeWxmkCVr86OBpS4jgaNKNLeRYIA+XPW9jfER+1z36keDb28upr+T0gUMvxiqDxQAWjObuAMhh/zwgaHMcwkXcX5eS/fib9jE97iqAWW8QEZdWuET+s4yqja1IFc5jr9aTNqw5WMUJjlAFWHJ7UQZw+HhXgH4otflbjy257i/QMAJ6d2tUU9Tx778xq+z3o1cdefKg4JUsjhkrzvqIkv+KnOLBbyrWDDYtWTF0J4gPy/4Z/rm03KZHAxkiADb77q/hPmqvQlXV+mnWfGoCpGnK0oe813JE1sYvMiaNqUJhXMJkskkgsSO+ioEI5EPObs6aMLFPyXJIahtchp7eo6T3DkO8elN+zzCr4LXUIPwpONtS7s5+a0Okf7kWgmReNXbX58sPe5Ufxn6KXeZB4nqBw7klufjvXErbFQ4GNRPiw4nRIQUfbLLG305kbEBGZUhDCCCBYwggX+oAMCAQICCHcMDggSaPqNMA0GCSqGSIb3DQEBCwUAMHExCzAJBgNVBAYTAkJSMRMwEQYDVQQKEwpJQ1AtQnJhc2lsMTYwNAYDVQQLEy1TZWNyZXRhcmlhIGRhIFJlY2VpdGEgRmVkZXJhbCBkbyBCcmFzaWwgLSBSRkIxFTATBgNVBAMTDEFDIFZBTElEIFJGQjAeFw0xNzA5MDYxNDIzMDBaFw0xODA5MDYxNDIzMDBaMIHqMQswCQYDVQQGEwJCUjELMAkGA1UECBMCU1AxDzANBgNVBAcTBk9TQVNDTzETMBEGA1UEChMKSUNQLUJyYXNpbDE2MDQGA1UECxMtU2VjcmV0YXJpYSBkYSBSZWNlaXRhIEZlZGVyYWwgZG8gQnJhc2lsIC0gUkZCMRYwFAYDVQQLEw1SRkIgZS1DTlBKIEExMRcwFQYDVQQLEw5BUiBBIERJR0lGT1JURTE/MD0GA1UEAxM2VEVJWEVJUkEgRSBUQVJHSU5PIEFEVk9HQURPUyBBU1NPQ0lBRE9TOjA0MDg0MjcwMDAwMTg5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr5xHrV/WO9uROGD7KqcbhADUOEO72ioliLBT3cDjaTRh3l9ve0zJiIBsdKyP5DYcI3GpMIngdRdUrXgFm/bsOZtOm1lDnkW1aT+6OYXarVhP8KwH85xfi7byNYcHmt0X2KtNRQ5mB0nfmuR36+hX9kP2J8feVxIrMediDrcujxrZEtbAWIuq7Tkoe0Ok/mu1R1MLTY5VGqOFRP4b6yGheuBpvaRVC2x6PX5qMOKbayiDTc344JPPv4dR7GHG8CDUFz1UJeDMsMp4byHAxQ+cCP+XFVZRHRSlQhls6Y7Sz7B/eZcILYSuLMQ1ePwX4LUbLWFO2d7/hWMhS9+zvL77TwIDAQABo4IDNjCCAzIwgZoGCCsGAQUFBwEBBIGNMIGKMFUGCCsGAQUFBzAChklodHRwOi8vaWNwLWJyYXNpbC52YWxpZGNlcnRpZmljYWRvcmEuY29tLmJyL2FjLXZhbGlkcmZiL2FjLXZhbGlkcmZidjIucDdiMDEGCCsGAQUFBzABhiVodHRwOi8vb2NzcC52YWxpZGNlcnRpZmljYWRvcmEuY29tLmJyMAkGA1UdEwQCMAAwHwYDVR0jBBgwFoAUR7kIWdhC9pL893wVfCaASkWRfp8wbgYDVR0gBGcwZTBjBgZgTAECASUwWTBXBggrBgEFBQcCARZLaHR0cDovL2ljcC1icmFzaWwudmFsaWRjZXJ0aWZpY2Fkb3JhLmNvbS5ici9hYy12YWxpZHJmYi9kcGMtYWMtdmFsaWRyZmIucGRmMIIBAQYDVR0fBIH5MIH2MFOgUaBPhk1odHRwOi8vaWNwLWJyYXNpbC52YWxpZGNlcnRpZmljYWRvcmEuY29tLmJyL2FjLXZhbGlkcmZiL2xjci1hYy12YWxpZHJmYnYyLmNybDBUoFKgUIZOaHR0cDovL2ljcC1icmFzaWwyLnZhbGlkY2VydGlmaWNhZG9yYS5jb20uYnIvYWMtdmFsaWRyZmIvbGNyLWFjLXZhbGlkcmZidjIuY3JsMEmgR6BFhkNodHRwOi8vcmVwb3NpdG9yaW8uaWNwYnJhc2lsLmdvdi5ici9sY3IvVkFMSUQvbGNyLWFjLXZhbGlkcmZidjIuY3JsMA4GA1UdDwEB/wQEAwIF4DAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwQwgcIGA1UdEQSBujCBt4EhYWxleGFuZHJlLnNpcXVlaXJhQGludGVydmFsb3IuY29toDgGBWBMAQMEoC8ELTMwMDkxOTU2ODE4MDUyMzM4MTUwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMKAkBgVgTAEDAqAbBBlOT1JCRVJUTyBUQVJHSU5PIERBIFNJTFZBoBkGBWBMAQMDoBAEDjA0MDg0MjcwMDAwMTg5oBcGBWBMAQMHoA4EDDAwMDAwMDAwMDAwMDANBgkqhkiG9w0BAQsFAAOCAgEAcm5ZjhRZB1JJrfF6WIHvYi39w+77Drvk/arqis2a3f9xz+AK6FiMuudfEDRYzGYbqlxD209P1Q2aPHD5wVvRM1GB1cj//TB7lIur8LlkP0eZFulDMsyyQUdwYlUwoojcaegTiay2Qg93XPrfa5A6uDIhK5gkSuY8rYqV0m6znSM9ejE7M7snmkFIPuscqhlG4+DRZJshmz2xS9L3/jYMWfpovveNRCDj5bwPf5pm01ixpyjbrb8jl9jzkgDu8X3NwzhVQwjKLbn6pI1aJkcKULDMFjgY0tEgr4gFJUA0qdtA+kOTqNdXItq6CKWSG1vCMMhmDo8aNlX0iEDHgUqxJybtdqFAbQ3H8DeM7I1PtTXe2CeYVNwGKQLxrPSp8UPe9pt4HrekvoU4EX0XdyH1kZSx0qvI7p7vF0PSRHpXcTumxtsD/8Nw9UtLDGvzFXX99wtLUi4cuGt0goyzyGD894HBErDoMzxeR1FwH7GVNcLuyM41w+nGIHmAHyOxcj9jHbUVz5dkomEe3VH/onk4Cbfr5BTMNyItnqptGnLznSb/2CKxOivNcs321tSoHTsKIodcFCaQDGiUcwHenvWdP6w39TiV69TCilwqEQjkOc+8cjvMosDwumv6iCjdLZ3SmkukuinTUWCfq/68hQNPT3m6LwRtVbRiXf/9FuEfmDAxggGkMIIBoAIBATB9MHExCzAJBgNVBAYTAkJSMRMwEQYDVQQKEwpJQ1AtQnJhc2lsMTYwNAYDVQQLEy1TZWNyZXRhcmlhIGRhIFJlY2VpdGEgRmVkZXJhbCBkbyBCcmFzaWwgLSBSRkIxFTATBgNVBAMTDEFDIFZBTElEIFJGQgIIdwwOCBJo+o0wCQYFKw4DAhoFADANBgkqhkiG9w0BAQEFAASCAQCjyaotl1R14TTBzSkiQG9EG9yg/yPp798Ui+ilsEKgKwUL1zRJRlU+QOwhFBGeP1FwPIdMjwQBb5Bf9qQkEatKESwhITK9pQgDJpXwbdB1p95G+xSyC2VqwswV8hW1glWMEdf/j17UArXGyUYT/mQdRCkprKnC+dR++Q93FruthkOAr7dxdA0Qdlvvfbhsc/Aj7go9HYcSc46OJEAut/ousiazbIff7eJe5K9VP6or7X7bOg0eAs8wVlYS3X2R3DpU3lxJi84NcZy9Smi3fZEyUU/pV7gngKw8eXbLimAJllW/oSrxAZ6h4o9flv1c0cPb/BR8Y9/u+ATuJxv50usg
@alissonwagner ai c quebra eu.. achei que tava fazendo em c#... hehe
então cara... será que pode assinar com outro algoritmo? duvido hemmm... acho q pode ser isso provocando o erro 500 do lado do banco...
@dodouglas12 eu sofri pra kct aqui pra descobrir qual campo eu estava formatando errado... mas esse erro 800 é de formatação de campos.. eu tiraria o espaço em branco que foi sugerido pelo outro colega... uma coisa é "vazio" outra é "espaço em branco".
@brunoDionizio, tem como enviar as classes ou o projeto rodando? Estou tendo algumas dificuldades para entender os métodos que foram escritos na issue.
Obrigado desde já
@BrunoZanholo eles acabaram de me mandar um código de exemplo, funcionou, parece q é isso mesmo, tem q ser pkcs7 mesmo.
Segue o algoritmo deles, pode ser útil pra alguém de java como eu :p
import java.io.FileInputStream;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.Security;
import java.security.cert.Certificate;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import org.bouncycastle.cert.jcajce.JcaCertStore;
import org.bouncycastle.cms.CMSProcessableByteArray;
import org.bouncycastle.cms.CMSSignedData;
import org.bouncycastle.cms.CMSSignedDataGenerator;
import org.bouncycastle.cms.CMSTypedData;
import org.bouncycastle.cms.jcajce.JcaSignerInfoGeneratorBuilder;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.operator.ContentSigner;
import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder;
import org.bouncycastle.operator.jcajce.JcaDigestCalculatorProviderBuilder;
import org.bouncycastle.util.Store;
import org.bouncycastle.util.encoders.Base64;
public final class PKCS7Signer {
private static final String PATH_TO_KEYSTORE = "/opt/certificado.pfx";
private static final String KEYSTORE_PASSWORD = "senha!!!";
private static final String SIGNATUREALGO = "Sha256WithRSA";
private static final String URI_REGISTRO = "https://cobranca.bradesconetempresa.b.br/ibpjregistrotitulows/registrotitulohomologacao";
public static void main(String[] args) throws Exception {
PKCS7Signer signer = new PKCS7Signer();
KeyStore keyStore = signer.loadKeyStore();
CMSSignedDataGenerator signatureGenerator = signer.setUpProvider(keyStore);
// Json de teste...
String json = "{\"nuCPFCNPJ\": \"123456789\",\"filialCPFCNPJ\": \"0001\",\"ctrlCPFCNPJ\": \"39\",\"cdTipoAcesso\": \"2\",\"clubBanco\": \"0\",\"cdTipoContrato\": \"0\",\"nuSequenciaContrato\": \"0\",\"idProduto\": \"09\",\"nuNegociacao\": \"123400000001234567\",\"cdBanco\": \"237\",\"eNuSequenciaContrato\": \"0\",\"tpRegistro\": \"1\",\"cdProduto\": \"0\",\"nuTitulo\": \"0\",\"nuCliente\": \"123456\",\"dtEmissaoTitulo\": \"25.05.2017\",\"dtVencimentoTitulo\": \"20.06.2017\",\"tpVencimento\": \"0\",\"vlNominalTitulo\": \"100\",\"cdEspecieTitulo\": \"04\",\"tpProtestoAutomaticoNegativacao\": \"0\",\"prazoProtestoAutomaticoNegativacao\": \"0\",\"controleParticipante\": \"\",\"cdPagamentoParcial\": \"\",\"qtdePagamentoParcial\": \"0\",\"percentualJuros\": \"0\",\"vlJuros\": \"0\",\"qtdeDiasJuros\": \"0\",\"percentualMulta\": \"0\",\"vlMulta\": \"0\",\"qtdeDiasMulta\": \"0\",\"percentualDesconto1\": \"0\",\"vlDesconto1\": \"0\",\"dataLimiteDesconto1\": \"\",\"percentualDesconto2\": \"0\",\"vlDesconto2\": \"0\",\"dataLimiteDesconto2\": \"\",\"percentualDesconto3\": \"0\",\"vlDesconto3\": \"0\",\"dataLimiteDesconto3\": \"\",\"prazoBonificacao\": \"0\",\"percentualBonificacao\": \"0\",\"vlBonificacao\": \"0\",\"dtLimiteBonificacao\": \"\",\"vlAbatimento\": \"0\",\"vlIOF\": \"0\",\"nomePagador\": \"Cliente Teste\",\"logradouroPagador\": \"rua Teste\",\"nuLogradouroPagador\": \"90\",\"complementoLogradouroPagador\": \"\",\"cepPagador\": \"12345\",\"complementoCepPagador\": \"500\",\"bairroPagador\": \"bairro Teste\",\"municipioPagador\": \"Teste\",\"ufPagador\": \"SP\",\"cdIndCpfcnpjPagador\": \"1\",\"nuCpfcnpjPagador\": \"12345648901234\",\"endEletronicoPagador\": \"\",\"nomeSacadorAvalista\": \"\",\"logradouroSacadorAvalista\": \"\",\"nuLogradouroSacadorAvalista\": \"0\",\"complementoLogradouroSacadorAvalista\": \"\",\"cepSacadorAvalista\": \"0\",\"complementoCepSacadorAvalista\": \"0\",\"bairroSacadorAvalista\": \"\",\"municipioSacadorAvalista\": \"\",\"ufSacadorAvalista\": \"\",\"cdIndCpfcnpjSacadorAvalista\": \"0\",\"nuCpfcnpjSacadorAvalista\": \"0\",\"endEletronicoSacadorAvalista\": \"\"}";
byte[] signedBytes = signer.signPkcs7(json.getBytes("UTF-8"), signatureGenerator);
System.out.println("Signed Encoded Bytes: " + new String(Base64.encode(signedBytes)));
carregaCertificacaoAutenticacaoA1();
HttpEntity entity = new StringEntity(new String(Base64.encode(signedBytes)), Charset.forName("UTF-8"));
HttpPost post = new HttpPost(URI_REGISTRO);
post.setEntity(entity);
HttpClientBuilder builder = HttpClientBuilder.create();
HttpResponse response = builder.build().execute(post);
System.out.println(response.getStatusLine());
System.out.println(EntityUtils.toString(response.getEntity(), "UTF-8"));
}
private KeyStore loadKeyStore() throws Exception {
KeyStore keystore = KeyStore.getInstance("JKS");
InputStream is = new FileInputStream(PATH_TO_KEYSTORE);
keystore.load(is, KEYSTORE_PASSWORD.toCharArray());
return keystore;
}
private CMSSignedDataGenerator setUpProvider(final KeyStore keystore) throws Exception {
Security.addProvider(new BouncyCastleProvider());
Enumeration<String> aliases = keystore.aliases();
String aliaz = "";
while (aliases.hasMoreElements()) {
aliaz = aliases.nextElement();
if (keystore.isKeyEntry(aliaz)) {
break;
}
}
Certificate[] certchain = (Certificate[]) keystore.getCertificateChain(aliaz);
final List<Certificate> certlist = new ArrayList<Certificate>();
for (int i = 0, length = certchain == null ? 0 : certchain.length; i < length; i++) {
certlist.add(certchain[i]);
}
Store certstore = new JcaCertStore(certlist);
Certificate cert = keystore.getCertificate(aliaz);
ContentSigner signer = new JcaContentSignerBuilder(SIGNATUREALGO).setProvider("BC").
build((PrivateKey) (keystore.getKey(aliaz, KEYSTORE_PASSWORD.toCharArray())));
CMSSignedDataGenerator generator = new CMSSignedDataGenerator();
generator.addSignerInfoGenerator(new JcaSignerInfoGeneratorBuilder(new JcaDigestCalculatorProviderBuilder().setProvider("BC").
build()).build(signer, (X509Certificate) cert));
generator.addCertificates(certstore);
return generator;
}
private byte[] signPkcs7(final byte[] content, final CMSSignedDataGenerator generator) throws Exception {
CMSTypedData cmsdata = new CMSProcessableByteArray(content);
CMSSignedData signeddata = generator.generate(cmsdata, true);
return signeddata.getEncoded();
}
public static void carregaCertificacaoAutenticacaoA1() throws Exception {
System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");
Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
System.clearProperty("javax.net.ssl.trustStore");
System.clearProperty("javax.net.ssl.trustStorePassword");
System.setProperty("javax.net.ssl.trustStoreType", "JKS");
System.setProperty("javax.net.ssl.trustStore", "/opt/jssecacerts");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
}
}
O erro -2 de contrato não encontrado, poder ser gerado por quais motivos? Algum além do número do contrato estar vazio?
Aeeeee car!@#%$# kkkkkkkkkkkkkkkkkkkkkk..... Galera, liguei lá no banco e consegui a documentação atualizada (versão 1.7). Eu estava com a 1.4...lá eles tem um exemplo mais "bonito" de json.
Para quem precisar, eu fiz em vb.net
@rafaelwilsondantas esse dai é porque você esta usando os dados do CNPJ / conta cadastrados no Bradesco net errados ou não foi feito o primeiro acesso na plataforma Bradesco NET.
@alissonwagner boa! Vai ajudar os caras do java.
@rafaelwilsondantas segue a doc 1.7 Manual Registro de Boleto Bancário On-line_v 1 7.pdf
@dodouglas12 poderia disponibilizar em vb.net?
opa.....vou disponibilizar....aguenta ai
Galera, vou disponibilizar a minha solução em C# também.. até o presente momento está funcionando tudo certo mas estou na fase de comunicação com a 7comm pra entender algumas validações do lado deles, fora isso está tudo ok
Está ai.....eu uso algumas coisas que coloquei no App.config...
Imports System.Security.Cryptography.X509Certificates Imports System.Text Imports System.Security.Cryptography.Pkcs Imports System.Net.Http
Public Class ConnectorBradescoResponse
'Executa a API do Bradesco
Public Shared Function Execute(ByVal tpResponse As Type,
ByVal sServiceURI As String,
Optional ByVal oObject As Object = Nothing,
Optional ByRef sJson As String = "",
Optional ByRef nStatusCode As Integer = 200) As Model.BradescoResponseRegistry
Dim oResponse As New Model.BradescoResponseRegistry
Try
'Variaveis para request
Dim htResponse As New HttpResponseMessage
Dim htClient As New HttpClient
Dim oContent As HttpContent
Dim xml As XDocument
'Variaveis de Mensagem
Dim oFormatRequest As String
Dim byRequest As Byte()
Dim byAssignRequest As Byte()
'Variaveis de Certificado
Dim cCertificate As X509Certificate2
Dim ciContente As ContentInfo
Dim scMessageAssign As SignedCms
Dim csCertificateAssign As CmsSigner
'==========================================================================================================================================
'==========================================================================================================================================
'==========================================================================================================================================
'Valida se e possivel contruir o objeto
If IsNothing(sServiceURI) Then
Throw New Exception("Unable to detect Service URI")
End If
'==========================================================================================================================================
'==========================================================================================================================================
'==========================================================================================================================================
'Monta a mensagem e JSON e pera o byte array da mesma
oFormatRequest = Newtonsoft.Json.JsonConvert.SerializeObject(oObject.oObject)
byRequest = Encoding.Default.GetBytes(oFormatRequest)
'==========================================================================================================================================
'==========================================================================================================================================
'==========================================================================================================================================
'Recupera o Certificado de acordo com o CNPJ enviado
cCertificate = GetCertificate(oObject.sCpfCnpj)
'Assina a Requisição
ciContente = New ContentInfo(byRequest)
scMessageAssign = New SignedCms(ciContente, False)
csCertificateAssign = New CmsSigner(cCertificate)
scMessageAssign.ComputeSignature(csCertificateAssign)
'Gera o Byte Array da requisição assinada
byAssignRequest = scMessageAssign.Encode()
'==========================================================================================================================================
'==========================================================================================================================================
'==========================================================================================================================================
'Configuracao do timeout
htClient.Timeout = New TimeSpan(0, 3, 0)
'Configura o request
oContent = New StringContent(Convert.ToBase64String(byAssignRequest))
oContent.Headers.ContentType = New Headers.MediaTypeHeaderValue("application/json")
'Executa o request
htResponse = htClient.PostAsync(sServiceURI, oContent).Result
'Pega o retorno do XML
xml = XDocument.Parse(htResponse.Content.ReadAsStringAsync().Result)
'==========================================================================================================================================
'==========================================================================================================================================
'==========================================================================================================================================
'Monta a Classe esperada
oResponse = Newtonsoft.Json.JsonConvert.DeserializeObject(xml.Root.Value, tpResponse)
'Se ocorreu erro, retorna o mesmo
If oResponse IsNot Nothing Then
Throw New ApplicationException("Erro na conversão para classe")
End If
'Recupera o Status Code da requisicao
nStatusCode = CInt(htResponse.StatusCode)
'Monta o JSON de referencia
sJson = "StatusCode: " & htResponse.StatusCode & vbNewLine
sJson += xml.Root.Value
'Retorno da classe
Return oResponse
Catch
Throw
End Try
End Function
Private Shared Function GetCertificate(ByVal sCpfCnpj As String) As X509Certificate
'Variaveis
Dim cCertificates As X509Certificate2
Dim oStoreName As StoreName
Dim oStoreLocation As StoreLocation
Dim oStoreCertificates As X509Store
Dim sCertificateName As String = String.Empty
'Recupera o Nome do Certificado
sCertificateName = System.Configuration.ConfigurationManager.AppSettings(sCpfCnpj)
'Define Local dos Certificados
oStoreName = Configurations.Default.StoreName
oStoreLocation = Configurations.Default.StoreLocation
oStoreCertificates = New X509Store(oStoreName, oStoreLocation)
'Abre o diretório
oStoreCertificates.Open(OpenFlags.ReadOnly)
Try
'Validação de Callback
Try
Net.ServicePointManager.ServerCertificateValidationCallback =
New Net.Security.RemoteCertificateValidationCallback(
Function(sender2 As Object, certificate As X509Certificate,
chain As X509Chain, sslPolicyErrors As Net.Security.SslPolicyErrors) As Boolean
Select Case sslPolicyErrors
Case Net.Security.SslPolicyErrors.None
Return True
Case Else
Return True
End Select
End Function)
Catch
End Try
'==========================================================================================================================================
'==========================================================================================================================================
'==========================================================================================================================================
'Procura o certificado do Bradesco
For Each cCertificates In oStoreCertificates.Certificates
If cCertificates.SubjectName.Name.ToString.Split(",")(0).Replace("CN=", "") = sCertificateName Then
Return cCertificates
End If
Next
Catch
Throw
Finally
'Fecha o diretório
oStoreCertificates.Close()
End Try
End Function
End Class
Blz pessoal, alguem poderia me passar o link com uma assinatura já efetuada pra eu testar no soapui ou postman, para validar por favor, aos que fizeram na homologação em qualquer linguagem.
por favor me informar o exemplo de um json preenchido antes de enviar e depois ele mesmo assinado pra eu testar no link.
eu consigo retornar algo somente pelo navegador?
https://cobranca.bradesconetempresa.b.br/ibpjregistrotitulows/registrohomologacao + jsonassinado
Olá. alguém sabe algo que possa estar gerando o {"cdErro":"2", "msgErro":"Erro" ?
@rafaelwilsondantas qual especie de documento você está mandando???
@dodouglas12 estou realizando teste, então já tentei mandar com 16 e com 25 e nos dois deu erro
@rafaelwilsondantas Qual tipo de serviço você presta? No meu caso quando deu esse erro era porque eu estava mandando 32 e não 04 (DUPLICATA DE PRESTACAO DE SERVICO) que é o meu caso.
@dodouglas12 é para faculdade, já coloquei todos os valores, ( sim eu testei os 33 valores) e todos dão o mesmo erro. Os dados do contrato estão certos, pois quando eu modificado ele dá erro de consistência.
@rafaelwilsondantas como está o seu json?
PS.: Fiz uma pequena modificação no deserialize...Retirei caracteres especiais das tags....código mais limpo (na minha opinião) rs
@rafaelwilsondantas no código de exemplo Java que eu postei tem um Json válido. Não tem como fazer pelo navegador por ser um POST (não de forma direta pelo menos) com o postman acho que tu consegue, mas com o código que eu postei que ele me mandaram, é só executar no java que funciona.
@hgmauri Poderia compartilhar sua implementação? Estou com o mesmo problema em Java.
Pessoal,
vocês estão conseguindo assinar com JDK 8? Eu recebo "Invalid Keystore format". Consigo assinar apenas com OpenJDK 9.
Referente a transmissão, recebo o seguinte erro:
java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
Alguém poderia me dar uma luz?
Segue minha implementação:
` public final class PKCS7Signer {
private static final String PATH_TO_KEYSTORE = "certificado/certificado.pfx";
private static final String KEYSTORE_PASSWORD = "12345678";
private static final String SIGNATUREALGO = "Sha256WithRSA";
private static final String URI_REGISTRO = "https://cobranca.bradesconetempresa.b.br/ibpjregistrotitulows/registrotitulohomologacao";
public static void main(String[] args) throws Exception {
PKCS7Signer signer = new PKCS7Signer();
KeyStore keyStore = signer.loadKeyStore();
CMSSignedDataGenerator signatureGenerator = signer.setUpProvider(keyStore);
// Json de teste...
String json = "{\"nuCPFCNPJ\": \"123456789\",\"filialCPFCNPJ\": \"0001\",\"ctrlCPFCNPJ\": \"39\",\"cdTipoAcesso\": \"2\",\"clubBanco\": \"0\",\"cdTipoContrato\": \"0\",\"nuSequenciaContrato\": \"0\",\"idProduto\": \"09\",\"nuNegociacao\": \"123400000001234567\",\"cdBanco\": \"237\",\"eNuSequenciaContrato\": \"0\",\"tpRegistro\": \"1\",\"cdProduto\": \"0\",\"nuTitulo\": \"0\",\"nuCliente\": \"123456\",\"dtEmissaoTitulo\": \"25.05.2017\",\"dtVencimentoTitulo\": \"20.06.2017\",\"tpVencimento\": \"0\",\"vlNominalTitulo\": \"100\",\"cdEspecieTitulo\": \"04\",\"tpProtestoAutomaticoNegativacao\": \"0\",\"prazoProtestoAutomaticoNegativacao\": \"0\",\"controleParticipante\": \"\",\"cdPagamentoParcial\": \"\",\"qtdePagamentoParcial\": \"0\",\"percentualJuros\": \"0\",\"vlJuros\": \"0\",\"qtdeDiasJuros\": \"0\",\"percentualMulta\": \"0\",\"vlMulta\": \"0\",\"qtdeDiasMulta\": \"0\",\"percentualDesconto1\": \"0\",\"vlDesconto1\": \"0\",\"dataLimiteDesconto1\": \"\",\"percentualDesconto2\": \"0\",\"vlDesconto2\": \"0\",\"dataLimiteDesconto2\": \"\",\"percentualDesconto3\": \"0\",\"vlDesconto3\": \"0\",\"dataLimiteDesconto3\": \"\",\"prazoBonificacao\": \"0\",\"percentualBonificacao\": \"0\",\"vlBonificacao\": \"0\",\"dtLimiteBonificacao\": \"\",\"vlAbatimento\": \"0\",\"vlIOF\": \"0\",\"nomePagador\": \"Cliente Teste\",\"logradouroPagador\": \"rua Teste\",\"nuLogradouroPagador\": \"90\",\"complementoLogradouroPagador\": \"\",\"cepPagador\": \"12345\",\"complementoCepPagador\": \"500\",\"bairroPagador\": \"bairro Teste\",\"municipioPagador\": \"Teste\",\"ufPagador\": \"SP\",\"cdIndCpfcnpjPagador\": \"1\",\"nuCpfcnpjPagador\": \"12345648901234\",\"endEletronicoPagador\": \"\",\"nomeSacadorAvalista\": \"\",\"logradouroSacadorAvalista\": \"\",\"nuLogradouroSacadorAvalista\": \"0\",\"complementoLogradouroSacadorAvalista\": \"\",\"cepSacadorAvalista\": \"0\",\"complementoCepSacadorAvalista\": \"0\",\"bairroSacadorAvalista\": \"\",\"municipioSacadorAvalista\": \"\",\"ufSacadorAvalista\": \"\",\"cdIndCpfcnpjSacadorAvalista\": \"0\",\"nuCpfcnpjSacadorAvalista\": \"0\",\"endEletronicoSacadorAvalista\": \"\"}";
byte[] signedBytes = signer.signPkcs7(json.getBytes("UTF-8"), signatureGenerator);
System.out.println("Signed Encoded Bytes: " + new String(Base64.encode(signedBytes)));
carregaCertificacaoAutenticacaoA1();
HttpEntity entity = new StringEntity(new String(Base64.encode(signedBytes)), Charset.forName("UTF-8"));
HttpPost post = new HttpPost(URI_REGISTRO);
post.setEntity(entity);
HttpClientBuilder builder = HttpClientBuilder.create();
HttpResponse response = builder.build().execute(post);
System.out.println(response.getStatusLine());
System.out.println(EntityUtils.toString(response.getEntity(), "UTF-8"));
}
private KeyStore loadKeyStore() throws Exception {
KeyStore keystore = KeyStore.getInstance("JKS");
InputStream is = new FileInputStream(PATH_TO_KEYSTORE);
keystore.load(is, KEYSTORE_PASSWORD.toCharArray());
return keystore;
}
private CMSSignedDataGenerator setUpProvider(final KeyStore keystore) throws Exception {
Security.addProvider(new BouncyCastleProvider());
Enumeration<String> aliases = keystore.aliases();
String aliaz = "";
while (aliases.hasMoreElements()) {
aliaz = aliases.nextElement();
if (keystore.isKeyEntry(aliaz)) {
break;
}
}
Certificate[] certchain = (Certificate[]) keystore.getCertificateChain(aliaz);
final List<Certificate> certlist = new ArrayList<Certificate>();
for (int i = 0, length = certchain == null ? 0 : certchain.length; i < length; i++) {
certlist.add(certchain[i]);
}
Store certstore = new JcaCertStore(certlist);
Certificate cert = keystore.getCertificate(aliaz);
ContentSigner signer = new JcaContentSignerBuilder(SIGNATUREALGO).setProvider("BC").
build((PrivateKey) (keystore.getKey(aliaz, KEYSTORE_PASSWORD.toCharArray())));
CMSSignedDataGenerator generator = new CMSSignedDataGenerator();
generator.addSignerInfoGenerator(new JcaSignerInfoGeneratorBuilder(new JcaDigestCalculatorProviderBuilder().setProvider("BC").
build()).build(signer, (X509Certificate) cert));
generator.addCertificates(certstore);
return generator;
}
private byte[] signPkcs7(final byte[] content, final CMSSignedDataGenerator generator) throws Exception {
CMSTypedData cmsdata = new CMSProcessableByteArray(content);
CMSSignedData signeddata = generator.generate(cmsdata, true);
return signeddata.getEncoded();
}
public static void carregaCertificacaoAutenticacaoA1() throws Exception {
System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");
Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
System.clearProperty("javax.net.ssl.trustStore");
System.clearProperty("javax.net.ssl.trustStorePassword");
System.setProperty("javax.net.ssl.trustStoreType", "JKS");
System.setProperty("javax.net.ssl.trustStore", "/opt/jssecacerts");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
}
} `
Obrigado.
Bom dia @willalberton, essa implementação eu mandei quarta-feira, recebi ela da empresa responsável pela API do bradesco, ela funciona perfeitamente.
O detalhe é que tu precisa de um certificado válido (em PATH_TO_KEYSTORE
) e do registro do certificado do bradesco nos teus certificados confiáveis (método carregaCertificacaoAutenticacaoA1
).
@hgmauri bom dia! Poderia disponibilizar em C# Abrs
Recebi o manual do Bradesco, será através de web service mas o serviço ainda não esta disponível.