Академический Документы
Профессиональный Документы
Культура Документы
NET
Vamos criar um pequeno aplicativo de validação da Nf-e, executávelem uma chamada por parâmetro. Para
executar esse aplicativo, simplesmentevocê deverá clicar no botão Iniciar no Windows e selecionar a opção
Executarno menu, informando o seguinte comando:
C:\ValidarNfe.exe C:\NF-E\13090404672291000115550040000000270000000730-nfe.xml
System
System.Data
System.Deployment
System.Drawing
System.Security
System.Web.Services
System.Windows.Forms
System.Xml
Imports System.Collections.Generic
Imports System.Text
Imports System.Xml
Imports System.Xml.Schema
Imports System.IO
Imports System.Windows.Forms
Imports System.Security.Cryptography.Xml
Imports System.Security.Cryptography.X509Certificates
Me.Show()
If Command() <> "" Then
Valor = Command()
ValidaNfe(Valor)
Me.Focus()
Me.Show()
Me.WindowState = FormWindowState.Normal
End If
End Sub
Try
Nfe = arquivo2
Tamanho = Replace(Nfe, "C:\", "")
Tamanho = Replace(Tamanho, "F:\SisWin\NFE\BACKUP\200905\", "")
Tamanho = Replace(Tamanho, "F:\SisWin\NFE\BACKUP", "")
Tamanho = Replace(Tamanho, "F:\SisWin\NFE\AENVIAR", "")
Tamanho = Replace(Tamanho, "F:\SisWin\NFE\AENVIAR", "")
Tamanho = Replace(Tamanho, "\", "")
Tamanho = Replace(Tamanho, "\NF-E", "")
Tamanho = Replace(Tamanho, "NF-E", "")
Tamanho = Replace(Tamanho, "SisWin", "")
Tamanho = Replace(Tamanho, "SisWin", "")
'Salva o Arquivo
xDoc.Save(CaminhoArquivo)
'Selecionar certificado
SelecionarCertificado()
'Assinar o XML
Dim OAd As New AssinaturaDigitalClass()
Dim pDadosNfe As String
Dim vStringNfe As String
'Dim msgResultado As String
OAd.Assinar(CaminhoArquivo, "infNFe", oCertificado)
pDadosNfe = OAd.vXMLStringAssinado
vStringNfe = pDadosNfe.Substring(pDadosNfe.IndexOf("<NFe"), pDadosNfe.Length -
pDadosNfe.IndexOf("<NFe"))
'Validar o XML
Dim TxtXSD As String
Resultado = True
Dim settings As New XmlReaderSettings()
AddHandler settings.ValidationEventHandler, AddressOf Me.ValidationEventHandler
Try
settings.ValidationType = ValidationType.Schema
settings.Schemas.Add("http://www.portalfiscal.inf.br/nfe",xmlReader.Create(TxtXSD))
Using XmlValidatingReader As XmlReader = XmlReader.Create(CaminhoArquivo,
settings)
While XmlValidatingReader.Read()
End While
End Using
Catch ex As Exception
lstValida.Items.Add(ex.Message)
Exit Sub
End Try
lstValida.Items.Add("Status Validação -> " & IIf(Resultado = True, "Arquivo validado com
SUCESSO", "Validação FALHOU"))
Else
MsgBox("Informe o arquivo XML e o arquivo XSD.")
End If
Catch ex As Exception
End Try
End Sub
A função ValidaNfe chama outras duas funções em seu início: uma que seleciona o
certificado automaticamente e outra que assina o documento. O código da função
SelecionarCertificado() é que segue abaixo:
'Encontra o certificado digital pelo nome do mesmo, se precisar pergunta por isso
'Resolvido em 13/05/2009 às 15:05h
scollection = collection.Find(X509FindType.FindBySubjectDistinguishedName, xnome,
False)
Else
End If
End Function
-----------------
Voce deve informar em xnome o nome por extenso do Certificado que irá usar para
validar a XML a ser assinado. Para obter o nome por extenso do seu certificado você
pode usar a próprioa função acima habilitando a que pede a seleção de certicados de
uma lista e colocando o seguinte comando no Else da função acima:
xnome = oCertificado.Subject.ToString
Esse comando colocará o nome do certificado na variável xnome. Se você debugar, pode
pegar o nome extenso do certificado que deve usar para validar o XML e colocar dentro
da váriavel, como fiz no início do código:
SR = File.OpenText(pArqXMLAssinar)
vXMLString = SR.ReadToEnd()
SR.Close()
Try
_xnome = ""
_xnome = pCertificado.Subject.ToString()
collection = store.Certificates
collection1 = collection.Find(X509FindType.FindBySubjectDistinguishedName, _xnome,
False)
If (collection1.Count = 0) Then
vResultado = 2
vResultadoString = "Problemas no certificado digital"
Else
' certificado ok
'oX509Cert = scollection.Item(0)
_X509Cert = collection1.Item(0)
Dim x As String
x = _X509Cert.GetKeyAlgorithm().ToString()
If (qtdeRefUri = 0) Then
' a URI indicada não existe
vResultado = 4
vResultadoString = "A tag de assinatura " + pUri.Trim() + " não existe"
Else
' Existe mais de uma tag a ser assinada
If (qtdeRefUri > 1) Then
' existe mais de uma URI indicada
vResultado = 5
vResultadoString = "A tag de assinatura " + pUri.Trim() + " não é unica"
Else
Try
' Create a SignedXml object.
Dim signedXml As SignedXml
signedXml = New SignedXml(doc)
_Uri = doc.GetElementsByTagName(pUri).Item(0).Attributes
For Each _atributo In _Uri
If (_atributo.Name = "Id") Then
reference.Uri = "#" + _atributo.InnerText
End If
Next
Catch ex As Exception
vResultado = 6
vResultadoString = "Erro ao assinar o documento - " + ex.Message
End Try
End If
End If
Catch ex As Exception
vResultado = 3
vResultadoString = "XML mal formado - " + ex.Message
End Try
End If
Catch ex As Exception
vResultado = 1
vResultadoString = "Problema ao acessar o certificado digital" + ex.Message
End Try
End Sub
End Class
9) Dentro do botão que faz a validação é repassado o código do arquivo XSD que faz a
validação:
Resultado = False
lstValida.Items.Add(args.Message)
'MsgBox("Ocorreu um erro durante a validação....")
End If
If Not (args.Exception Is Nothing) Then ' Erro na validação do schema XSD
End If
End Sub
Essa função será chamada para retornar o erro que possa estar acontecendo com algum
ponto do arquivo XML.
Pronto!!
Imports System.Collections.Generic
Imports System.Text
Imports System.Xml
Imports System.Xml.Schema
Imports System.IO
Imports System.Windows.Forms
Imports System.Security.Cryptography.Xml
Imports System.Security.Cryptography.X509Certificates
Try
Nfe = arquivo2
Tamanho = Replace(Nfe, "C:\", "")
Tamanho = Replace(Tamanho, "F:\SisWin\NFE\BACKUP\200905\", "")
Tamanho = Replace(Tamanho, "F:\SisWin\NFE\BACKUP", "")
Tamanho = Replace(Tamanho, "F:\SisWin\NFE\AENVIAR", "")
Tamanho = Replace(Tamanho, "F:\SisWin\NFE\AENVIAR", "")
Tamanho = Replace(Tamanho, "\", "")
Tamanho = Replace(Tamanho, "\NF-E", "")
Tamanho = Replace(Tamanho, "NF-E", "")
Tamanho = Replace(Tamanho, "SisWin", "")
Tamanho = Replace(Tamanho, "SisWin", "")
'Salva o Arquivo
xDoc.Save(CaminhoArquivo)
'Selecionar certificado
SelecionarCertificado()
'Assinar o XML
Dim OAd As New AssinaturaDigitalClass()
Dim pDadosNfe As String
Dim vStringNfe As String
'Dim msgResultado As String
pDadosNfe = OAd.vXMLStringAssinado
vStringNfe = pDadosNfe.Substring(pDadosNfe.IndexOf("<NFe"), pDadosNfe.Length -
pDadosNfe.IndexOf("<NFe"))
'Validar o XML
Dim TxtXSD As String
Resultado = True
Dim settings As New XmlReaderSettings()
AddHandler settings.ValidationEventHandler, AddressOf Me.ValidationEventHandler
Try
settings.ValidationType = ValidationType.Schema
settings.Schemas.Add("http://www.portalfiscal.inf.br/nfe", XmlReader.Create(TxtXSD))
Using XmlValidatingReader As XmlReader = XmlReader.Create(CaminhoArquivo,
settings)
While XmlValidatingReader.Read()
End While
End Using
Catch ex As Exception
lstValida.Items.Add(ex.Message)
Exit Sub
End Try
lstValida.Items.Add("Status Validação -> " & IIf(Resultado = True, "Arquivo validado com
SUCESSO", "Validação FALHOU"))
Else
MsgBox("Informe o arquivo XML e o arquivo XSD.")
End If
Catch ex As Exception
End Try
End Sub
Function SelecionarCertificado() As Boolean
'Encontra o certificado digital pelo nome do mesmo, se precisar pergunta por isso
'Resolvido em 13/05/2009 às 15:05h
scollection = collection.Find(X509FindType.FindBySubjectDistinguishedName, xnome,
False)
If (scollection.Count = 0) Then
Else
End If
End Function
Resultado = False
lstValida.Items.Add(args.Message)
'MsgBox("Ocorreu um erro durante a validação....")
End If
End If
End Sub
Me.Show()
'Valor =
"F:\SisWin\NFE\BACKUP\200905\13090504672291000115550040000001520000002017-
nfe.XML"
'ValidaNfe(Valor)
If Command() <> "" Then
Valor = Command()
ValidaNfe(Valor)
Me.Focus()
Me.Show()
Me.WindowState = FormWindowState.Normal
End If
End Sub
SR = File.OpenText(pArqXMLAssinar)
vXMLString = SR.ReadToEnd()
SR.Close()
Try
_xnome = pCertificado.Subject.ToString()
collection = store.Certificates
collection1 = collection.Find(X509FindType.FindBySubjectDistinguishedName, _xnome,
False)
If (collection1.Count = 0) Then
vResultado = 2
vResultadoString = "Problemas no certificado digital"
Else
' certificado ok
'oX509Cert = scollection.Item(0)
_X509Cert = collection1.Item(0)
Dim x As String
x = _X509Cert.GetKeyAlgorithm().ToString()
If (qtdeRefUri = 0) Then
' a URI indicada não existe
vResultado = 4
vResultadoString = "A tag de assinatura " + pUri.Trim() + " não existe"
Else
' Existe mais de uma tag a ser assinada
If (qtdeRefUri > 1) Then
' existe mais de uma URI indicada
vResultado = 5
vResultadoString = "A tag de assinatura " + pUri.Trim() + " não é unica"
Else
Try
' Create a SignedXml object.
Dim signedXml As SignedXml
signedXml = New SignedXml(doc)
_Uri = doc.GetElementsByTagName(pUri).Item(0).Attributes
For Each _atributo In _Uri
If (_atributo.Name = "Id") Then
reference.Uri = "#" + _atributo.InnerText
End If
Next
Catch ex As Exception
vResultado = 6
vResultadoString = "Erro ao assinar o documento - " + ex.Message
End Try
End If
End If
Catch ex As Exception
vResultado = 3
vResultadoString = "XML mal formado - " + ex.Message
End Try
End If
Catch ex As Exception
vResultado = 1
vResultadoString = "Problema ao acessar o certificado digital" + ex.Message
End Try
End Sub
End Class