PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 25 → Assinar xml Sefaz com certificado A1 ou A3 em Windev
Assinar xml Sefaz com certificado A1 ou A3 em Windev
Débuté par amarildo, 04 aoû. 2021 12:48 - Aucune réponse
Membre enregistré
535 messages
Popularité : +14 (14 votes)
Posté le 04 août 2021 - 12:48


https://windevdesenvolvimento.blogspot.com/2021/08/dicas-3377-windev-webdev-mobile_1.html

Procedure assinar_xml(recebe_xml,recebe_refUri,recebe_id,receber_certificado_local_arquivo,receber_senha)

//,recebe_dados_certificado
//Info(recebe_dados_certificado)

clX509certi is X509Certificate2(receber_certificado_local_arquivo,receber_senha)
//clX509certi is X509Certificate2(recebe_dados_certificado)

clDoc is System.Xml.XmlDocument;
clDoc.LoadXml(recebe_xml) // Ler um arquivo Xml
nQtdeRefUri is int= clDoc.GetElementsByTagName(recebe_refUri).Count //_refUri= (sRefUri IS STRING = "infNFe")
IF (nQtdeRefUri) =0 THEN
RESULT "erro assinar" //nao existe // does not exists // ne pas exister
ELSE
VrSignedXml is SignedXml(clDoc) //cria um objeto assinado
VrSignedXml.SigningKey = clX509certi.PrivateKey // adiciona a chave do certificado
Reference is Reference //= new Reference(); // Cria a referencia para assinatura
Reference.URI = "#" + recebe_id
Env is XmlDsigEnvelopedSignatureTransform // adiciona um XmlDsigEnvelopedSignatureTransform para a assinatura
Reference.AddTransform(Env)
c14 is XmlDsigC14NTransform
Reference.AddTransform(c14)
VrSignedXml.AddReference(Reference) // adiciona a referencia no xml assinado
VrkeyInfo is KeyInfo // Cria a chave
VrkeyInfo.AddClause(new KeyInfoX509Data(clX509certi)) // carrega o certificado em um keyinfox509 e adiciona ao keyinfo
VrSignedXml.KeyInfo = VrkeyInfo // adiciona o keyinfo ao xml assinado
VrSignedXml.ComputeSignature()
xmlDigitalSignature is System.Xml.XmlElement dynamic = VrSignedXml.GetXml() // busca a representacao XML da assinatura e salva no XML
clDoc.DocumentElement.AppendChild(clDoc.ImportNode(xmlDigitalSignature, True)) // adiciona a assinatura no documento

RESULT clDoc.get_InnerXml() //salva o documento assinado
END


Procedure assinar_xml_serial(recebe_xml,recebe_refUri,recebe_id,receber_serial_numero)
clCertificado is X509Store(StoreName.My, StoreLocation.CurrentUser) //Carrega Store do windows, utilizando o Usuario Logado
clCertificado.open(OpenFlags.ReadOnly)
clCertificado_carrega is X509Certificate2Collection(clCertificado.Certificates) // Carregar Certificados
clCertificado_colecao is X509Certificate2Collection(clCertificado_carrega.Find(X509FindType.FindBySerialNumber,receber_serial_numero,False)) //Busca certificado que tem o SerialNumber
clX509certi is X509Certificate2
FOR EACH clX509certi OF clCertificado_colecao // fazer um loop para pegar o certificado desejado
clDoc is System.Xml.XmlDocument;
clDoc.LoadXml(recebe_xml) // Ler um arquivo Xml
nQtdeRefUri is int= clDoc.GetElementsByTagName(recebe_refUri).Count //_refUri= (sRefUri IS STRING = "infNFe")
IF (nQtdeRefUri) =0 THEN
RESULT "erro assinar" //nao existe // does not exists // ne pas exister
ELSE
VrSignedXml is SignedXml(clDoc) //cria um objeto assinado
VrSignedXml.SigningKey = clX509certi.PrivateKey // adiciona a chave do certificado
Reference is Reference //= new Reference(); // Cria a referencia para assinatura
Reference.URI = "#" + recebe_id
Env is XmlDsigEnvelopedSignatureTransform // adiciona um XmlDsigEnvelopedSignatureTransform para a assinatura
Reference.AddTransform(Env)
c14 is XmlDsigC14NTransform
Reference.AddTransform(c14)
VrSignedXml.AddReference(Reference) // adiciona a referencia no xml assinado
VrkeyInfo is KeyInfo // Cria a chave
VrkeyInfo.AddClause(new KeyInfoX509Data(clX509certi)) // carrega o certificado em um keyinfox509 e adiciona ao keyinfo
VrSignedXml.KeyInfo = VrkeyInfo // adiciona o keyinfo ao xml assinado
VrSignedXml.ComputeSignature()
xmlDigitalSignature is System.Xml.XmlElement dynamic = VrSignedXml.GetXml() // busca a representacao XML da assinatura e salva no XML
clDoc.DocumentElement.AppendChild(clDoc.ImportNode(xmlDigitalSignature, True)) // adiciona a assinatura no documento
RESULT clDoc.get_InnerXml() //salva o documento assinado
END
END