Alguém teria um exemplo da assinatura do pedido de cancelamento da NF-e. Meu XML está assim:Resolvi graças a este post<?xml version="1.0" encoding="UTF-8" ?> <CancNFe versao="2.00" xmlns="http://www.portalfiscal.inf.br/nfe"> <infCanc Id="ID35100902767116000186550010000266291010733080" > <tpAmb>2</tpAmb> <xServ>CANCELAR</xServ> <chNFe>35100902767116000186550010000266291010733080</chNFe> <nProt>837479588686</nProt> <xJust>CLIENTE CANCELOU O SERVIÇO/COMPRA</xJust> </infCanc> </CancNFe>Não estou sabendo pegar o elemento que vai ser assinado, o manual diz que é o ID do infCanc, mas como?
Essa parte do código eu usei o mesmo que assino a nota.Agora essa parte está tudo errado:DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(true); Document doc = factory.newDocumentBuilder().parse(new ByteArrayInputStream(xmlCanc.getBytes("UTF8"))); XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM"); ArrayList transformList = new ArrayList(); TransformParameterSpec tps = null; Transform envelopedTransform = fac.newTransform(Transform.ENVELOPED, tps); Transform c14NTransform = fac.newTransform(NFe.C14N_TRANSFORM_METHOD, tps); transformList.add(envelopedTransform); transformList.add(c14NTransform); KeyStore ks = KeyStore.getInstance(NFe.TIPO_KEYSTORE_A3); // PKCS11 ks.load(null, Global.SENHA_CERTIFICADO_EMITENTE.toCharArray()); KeyStore.PrivateKeyEntry pkEntry = null; Enumeration aliasesEnum = ks.aliases(); PrivateKey privateKey = null; String alias = ""; while (aliasesEnum.hasMoreElements()) { alias = (String) aliasesEnum.nextElement(); if (ks.isKeyEntry(alias)) { break; } } KeyStore.PrivateKeyEntry keyEntry = (KeyStore.PrivateKeyEntry) ks.getEntry(alias, new KeyStore.PasswordProtection(Global.SENHA_CERTIFICADO_EMITENTE.toCharArray())); pkEntry = keyEntry; privateKey = pkEntry.getPrivateKey(); X509Certificate cert = (X509Certificate) pkEntry.getCertificate(); KeyInfoFactory kif = fac.getKeyInfoFactory(); List x509Content = new ArrayList(); x509Content.add(cert); X509Data xd = kif.newX509Data(x509Content); KeyInfo ki = kif.newKeyInfo(Collections.singletonList(xd)); ...... NodeList elements = doc.getElementsByTagName("CancNFe"); Element el = (Element) elements.item(0); String id = el.getAttribute("Id"); Reference ref = fac.newReference("#" + id, fac.newDigestMethod(DigestMethod.SHA1, null), transformList, null, null); // Cria a informacao da assinatura SignedInfo si = fac.newSignedInfo(fac.newCanonicalizationMethod(CanonicalizationMethod.INCLUSIVE, (C14NMethodParameterSpec) null), fac.newSignatureMethod(SignatureMethod.RSA_SHA1, null), Collections.singletonList(ref)); XMLSignature signature = fac.newXMLSignature(si, ki); Node node = doc.getDocumentElement().getElementsByTagName("CancNFe").item(0); DOMSignContext dsc = new DOMSignContext(privateKey, node); signature.sign(dsc);
[RESOLVIDO] Assinatura do pedido de cancelamento da NF-e
Criado 24 de setembro de 2010
Respostas 0
Participantes 1