[RESOLVIDO] Ajuda NFS-e Paulista!

15 respostas
M

Fala galera, blz?

Alguém que já trabalhou com Nota Fiscal de SERVIÇOS Eletrônica de São Paulo poderia me dar um help com relação a geração do keystore?

O procedimento é o mesmo com o que é feito com a NF-e comum?

To usando um certificado A3 (token)… eu usei tutoriais relacionados a NF-e comum pra gerar o keystore mas não sei se serve pra NFS-e!

15 Respostas

G

dica: utiliza o keystore explorer da LAZGO software.

M

caramba, bão demais o negócio! Mas ainda to na dúvida se eu gero o keystore com os mesmos certificados da NF-e comum ou tem que colocar certificados diferentes! A documentação é horrível quanto a isso!

M

Pra falar a verdade eu não sei nem se o problema é no Keystore! Eu to conseguindo acessar o webservice da NFS-e paulista, mas to recebendo como retorno o erro: “Rejeição: Assinatura - Digest difere do calculado.”

Alguém já passou por isso?

M

Consegui resolver o problema! Ao gerar a assinatura, ao instanciar o Reference eu estava passando o id com o “#” no início. Removendo o “#” não deu mais o erro de “digest diferente do calculado.”!

Era assim:

Reference ref = fac.newReference("#"+id, fac.newDigestMethod(DigestMethod.SHA1, null), transformList, null, null);

Ficou assim:

Reference ref = fac.newReference(id, fac.newDigestMethod(DigestMethod.SHA1, null), transformList, null, null);

Vlw pela ajuda pessoal!

I

Amigos, estou implementando a NFS-e aqui na empresa que trabalho. Já baixei os manuais do site da prefeitura, mas não consego baixar o wsdl e os xsd’s (schemas).

Alguém tem para me enviar?

M

Cara, to anexando nesse post os schemas, o wsdl e como bônus as classes Java geradas a partir dos schemas com o JAXB. Daí fica fácil gerar os xmls de consulta e de retorno! Vamos ajudando um ao outro que é melhor pra todo mundo! abs!

I

Valew marcosdd…

Mas acho que o wsdl não está completo… o request e response estão simples… não estão tipificados…

Importei pelo eclipse e não consigo “navegar” por eles (da mesma forma quando abrimos o xsd TiposNFe_v01.xsd)

C

Valeu Marcos, alterei o modo de assinatura e funcionou agora ocorreu um erro 1100O CPF/CNPJ do usuário autorizado a enviar a mensagem XML não confere com o CPF/CNPJ usado na comunicação.

Que provavelmente é que não sou autorizado a fazer o envio para a prefeitura de São Paulo e também não estou utilizando uma nota para um prestador de São Paulo.

Já posso incluir uma outra duvida, no caso de um lote o qual tag do XML devo assinar?

Obrigado pela ajuda.
Cleyton.

T

cleytonrox, bom dia.

Tem como vc me dar uma força pra assinar o XML, sempre me retorna que difere do calculado, o método que estou usando para assinar é este…estou tentando assinar o documento todo para consulta de NFS-e.

Document doc = documentFactory(xml);
XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM");
ArrayList<Transform> transformList = signatureFactory(fac);

assinarNfse(fac, transformList, doc);

outputXML(doc);

private Document documentFactory(String xml) throws SAXException,  
                                                        IOException, 
                                                        ParserConfigurationException {  
                                                        
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setNamespaceAware(true);
        return factory.newDocumentBuilder().parse(new ByteArrayInputStream(xml.getBytes()));
}

private ArrayList<Transform> signatureFactory(XMLSignatureFactory signatureFactory) throws NoSuchAlgorithmException, 
                                                                                               InvalidAlgorithmParameterException {
            ArrayList<Transform> transformList = new ArrayList<Transform>();
            TransformParameterSpec tps = null;
            Transform envelopedTransform = signatureFactory.newTransform(Transform.ENVELOPED, tps);
            Transform c14NTransform = signatureFactory.newTransform("http://www.w3.org/TR/2001/REC-xml-c14n-20010315", tps);

            transformList.add(envelopedTransform);
            transformList.add(c14NTransform);
            return transformList;
}

private void assinarNfse(XMLSignatureFactory fac, ArrayList<Transform> transformList, Document doc) throws Exception {
        
        Reference ref = fac.newReference("", fac.newDigestMethod(DigestMethod.SHA1, null),
                                        transformList, 
                                        null, null);
         
        SignedInfo si = fac.newSignedInfo(fac.newCanonicalizationMethod(CanonicalizationMethod.INCLUSIVE,(C14NMethodParameterSpec) null), 
                                          fac.newSignatureMethod(SignatureMethod.RSA_SHA1, null),
                                          Collections.singletonList(ref));
                             
                             
        XMLSignature signature = fac.newXMLSignature(si, keyInfo);
        
        DOMSignContext dsc = new DOMSignContext(privateKey, doc.getDocumentElement());
        
        signature.sign(dsc);
           
}

private void outputXML(Document doc) throws Exception {  

            ByteArrayOutputStream os = new ByteArrayOutputStream();
            TransformerFactory tf = TransformerFactory.newInstance();
            Transformer trans = tf.newTransformer();
            trans.transform(new DOMSource(doc), new StreamResult(os));

            xml = os.toString();
}
C

Você está assinando somente a TAG “Cabecalho” da consulta?

é somente está que você deve assinar.

Tirando isto a sua rotina de assinatura parece estar correta.

Vou fazer alguns testes e assim que obtiver um resultado com sua rotina lhe respondo novamente.
Mais tenta fazer o teste com assinatura na tag Cabecalho e se possível colocar o xml assinado pra que possamos verificar.

T

Na verdade eu estou assinando o corpo do xml, abaixo segue o meu xml assiando…

Se eu tentar validá-lo contra o validador da receita, o retorno é assinatura inválida, segue o link da receita que estou utilizando para validar…

https://www.receita.fazenda.gov.br/Aplicacoes/SSL/ATBHE/assinadoc/ValidadorAssinaturas.app/valida.aspx

<?xml version = '1.0' encoding = 'UTF-8'?>
<ConsultarNfseEnvio xmlns="http://www.ginfes.com.br/servico_consultar_nfse_envio_v03.xsd" xmlns:tip="http://www.ginfes.com.br/tipos_v03.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><Prestador>  <tip:Cnpj>11111111111111</tip:Cnpj>  <tip:InscricaoMunicipal>111111</tip:InscricaoMunicipal></Prestador><NumeroNfse>11111</NumeroNfse><Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/><Reference URI=""><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/><DigestValue>M1oFwqPJuLcsDGSYhgUyKx8WCXE=</DigestValue></Reference></SignedInfo><SignatureValue>UWMJLFCxOoCW01XwRxB+QkT/pKmSeDBWJ/BYS706qg/TZSZY1lM9Cm3wDNZa1dCDwpDdl56gFQb8
W9e8Ojjoa3NNHRLbNuZYaU7eYLLT+WxH7SPgasXKiIjExbD90QiJKg5BmF4S6IKbUG7TpSkzfV0/
UPshh/wtfsYYSz+Cw3D6pus52C0QgiXjhK9IpXZhy3YnsoCoVQY8FQUkZLI2jkDbRBMULw1XquEP
yIoD4sUQtp57f/DZtB+GPh2tg01qImmZCReqUYT+Lvcg47HedM52rPIIqxxitscHaV5MHKGhBJg7
ObqHodg5ioxBFuJYdUZdzrz46c3prc8QTBqwLA==</SignatureValue><KeyInfo><X509Data><X509Certificate>MIIIETCCBfmgAwIBAgIQH+1+xi6smRIzHT91p75qSDANBgkqhkiG9w0BAQsFADB4MQswCQYDVQQG
EwJCUjETMBEGA1UEChMKSUNQLUJyYXNpbDE2MDQGA1UECxMtU2VjcmV0YXJpYSBkYSBSZWNlaXRh
IEZlZGVyYWwgZG8gQnJhc2lsIC0gUkZCMRwwGgYDVQQDExNBQyBDZXJ0aXNpZ24gUkZCIEc0MB4X
DTEyMDQxOTAwMDAwMFoXDTE1MDQxODIzNTk1OVowgdcxCzAJBgNVBAYTAkJSMRMwEQYDVQQKFApJ
Q1AtQnJhc2lsMTYwNAYDVQQLFC1TZWNyZXRhcmlhIGRhIFJlY2VpdGEgRmVkZXJhbCBkbyBCcmFz
aWwgLSBSRkIxFTATBgNVBAsUDFJGQiBlLUNQRiBBMzEUMBIGA1UECxQLKEVNIEJSQU5DTykxIjAg
BgNVBAsUGUF1dGVudGljYWRvIHBvciBBUiBGQUNFU1AxKjAoBgNVBAMTIVRJQUdPIEtJSEFSQSBE
QSBTSUxWQTozMzA2MjI5Njg3OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMnnXyO6
ODWNlo1/aZVwDnfruONiFG/+pvXjjCgY2Fjy/P3XYF0EhWJEqmUou1Fi9aXSs7nXWdmmTUGlPUVX
YAcItoaIXlK7jASrk8u91yrRzRmRm905XKV/qMGFbV6QA5aVSUhzr85TlF2Q21tST5M/rJ/J9X+w
Q2Tp1L1NhrLaZ8JrZxJSFLe46fBJt9C/SGXxkeaYjWL/tIBtawrwQBy/4bDj6DvimhM38tyNON3P
s8fxgJCqd8lmrrajzTqHxRYTw2Qltd/BKUZjUQx08WCVtrhSUQGpeTbaZ90VVMAaOLNtarEGvzPl
jsyjYEdS7CqRDe69BOwWV/wcTPvKYMECAwEAAaOCAzUwggMxMIGaBgNVHREEgZIwgY+gPQYFYEwB
AwGgNAQyMjMxMjE5ODUzMzA2MjI5Njg3OTExOTU3Njg2MjgwMDAwMDAwMDM0MTQ2OTI2U1NQU1Cg
FwYFYEwBAwagDgQMMDAwMDAwMDAwMDAwoB4GBWBMAQMFoBUEEzAwMDAwMDAwMDAwMDAwMDAwMDCB
FXRpYWdva2loYXJhQGdtYWlsLmNvbTAJBgNVHRMEAjAAMB8GA1UdIwQYMBaAFC6R6tZt5bJZgtw4
hSl2NBZWPNA+MA4GA1UdDwEB/wQEAwIF4DB/BgNVHSAEeDB2MHQGBmBMAQIDBjBqMGgGCCsGAQUF
BwIBFlxodHRwOi8vaWNwLWJyYXNpbC5jZXJ0aXNpZ24uY29tLmJyL3JlcG9zaXRvcmlvL2RwYy9B
Q19DZXJ0aXNpZ25fUkZCL0RQQ19BQ19DZXJ0aXNpZ25fUkZCLnBkZjCCARYGA1UdHwSCAQ0wggEJ
MFegVaBThlFodHRwOi8vaWNwLWJyYXNpbC5jZXJ0aXNpZ24uY29tLmJyL3JlcG9zaXRvcmlvL2xj
ci9BQ0NlcnRpc2lnblJGQkc0L0xhdGVzdENSTC5jcmwwVqBUoFKGUGh0dHA6Ly9pY3AtYnJhc2ls
Lm91dHJhbGNyLmNvbS5ici9yZXBvc2l0b3Jpby9sY3IvQUNDZXJ0aXNpZ25SRkJHNC9MYXRlc3RD
UkwuY3JsMFagVKBShlBodHRwOi8vcmVwb3NpdG9yaW8uaWNwYnJhc2lsLmdvdi5ici9sY3IvQ2Vy
dGlzaWduL0FDQ2VydGlzaWduUkZCRzQvTGF0ZXN0Q1JMLmNybDAdBgNVHSUEFjAUBggrBgEFBQcD
AgYIKwYBBQUHAwQwgZsGCCsGAQUFBwEBBIGOMIGLMF8GCCsGAQUFBzAChlNodHRwOi8vaWNwLWJy
YXNpbC5jZXJ0aXNpZ24uY29tLmJyL3JlcG9zaXRvcmlvL2NlcnRpZmljYWRvcy9BQ19DZXJ0aXNp
Z25fUkZCX0c0LnA3YzAoBggrBgEFBQcwAYYcaHR0cDovL29jc3AuY2VydGlzaWduLmNvbS5icjAN
BgkqhkiG9w0BAQsFAAOCAgEAr/zfHM4KHpx913FES+5rwcmc2QS0CPQjFq6tH1o/sLgle3Cq2uNL
7TRhdo4gCFdXaU/R+QX8kCfsXc97OWeZF3YR1KjJ09Zm6mei/cn/i91p3OwcRASjjEp2WZiNtfk6
XMBQCgL5JJG8lErcyrEqZ90hgLXQEW+C3QRtuUWJEHYEyxmiSCEpmakxd2v5pWZy60totJIKv4gX
072lnOOQhV5X7PHc3pvpHBZBz1+edxoIxsOLmJdAGRK9JbEP1ySyc7TNCsP5/7v5YF1UEs9JCojf
RlZye3W06SQPVXyiPVzY+upOk1G/TUPE4IMywIivwTu2v05toinPA7nYtPQ410V9l/QcAHK5zvTB
XNLZVerT3r335mZhYwNGXpM4dbt6boCSEB7Lq0n3jd/cGAa2oXlME1iYDlPl+/8tusarVRliTgPV
GWcYt7pAkgDhcfvhG9/PKA9CsVilBo0/vZ1sKW3GDxLP1Gcrq9j+yIcc19tmV+UgQ0u98SWkn6Ty
64klv4LJNedtUid7UbVViUI+gfyfJWfx+9/Xx9ZLU19w7YTAzZkvJXzrlGhfY9/1Xaj0tjjScY9P
tm9ZTJAH7ImxI/+omLfWWRnwMhB8eGaxF2wIOCeBOBahJ6upyjnATVXsBvWWETYumBwYST4zPdN9
p6pcpXy7cjIGwCnocZwexZY=</X509Certificate></X509Data></KeyInfo></Signature></ConsultarNfseEnvio>
D

Pessoal preciso de ajuda.

Estou tentando consumir o serviço só que da prefeitura do rio.

https://notacarioca.rio.gov.br/WSNacional/nfse.asmx

Eu fiz o seguinte, baixei o certificado instalado no browser, só que ele me gerou um .p7b, baixei a cadeia de certificado do ICP-Brasil e gerei o jks pelo keytools.

só que na hora de cosumir da erro

System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");
         Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());

         System.setProperty("javax.net.ssl.keyStoreType", "PKCS#7");
         System.setProperty("javax.net.ssl.keyStore", "C:\\Certificado\\lg.p7br");
         System.setProperty("javax.net.ssl.keyStorePassword", "098765"); --> essa senha é do jks gerado pelo keytools?

         System.setProperty("javax.net.ssl.trustStoreType", "JKS");
         System.setProperty("javax.net.ssl.trustStore", "C:\\Certificado\\nfse_lg.jks");
F

Alguém já conseguiu assinar a nota e validar o xml da assinatura, estou tentando e não consigo, como estou usando como modelo uma classe em java para assinar NFE não está funcionando para a NFS-E, já que nesta eu tenho o elemento Id=“NFe31080676472349000430550010000001041000000018” da tag infNFE…

S

Pessoal, eu estou implementando a NFS-e de São Paulo aqui na empresa e não sei o que tratar no XML antes de assinar:

if (tipoEnvio == Serie.TIPOENVIO_NFE){
			retorno = retorno.replace(":ns2", "").replace("ns2:", ""); // pra tirar o prefixo
			retorno = retorno.replaceAll(" xmlns=\"http://www.w3.org/2000/09/xmldsig#\"", ""); //para tirar esse namespace
		}else if (tipoEnvio == Serie.TIPOENVIO_NFSE_GINFESABRASF){
			retorno = retorno.replaceAll(" xmlns:DEL=\"http://www.w3.org/2000/09/xmldsig#\"", ""); //para tirar esse namespace
		}else if (tipoEnvio == Serie.TIPOENVIO_NFSE_NOTAPAULISTANA){
			// fazer para a nota paulistana
		}
		System.out.println(retorno);
		retorno = retorno.replaceAll("\t", "") 
		                 .replaceAll("\n", "")   
		                 .replaceAll("        ", "")   
		                 .replaceAll("    ", "")
		                 .replaceAll("\r", "");

		retorno = retorno.replaceAll( System.getProperty("line.separator"), "")

para a nfse ginfes e nfe tem, mas não sei o que eu tenho que tirar. Podem me ajudar?

S

Peguei o projeto no meio

Criado 6 de maio de 2011
Ultima resposta 6 de fev. de 2013
Respostas 15
Participantes 8