Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

HenriqueRadins

Enviando NFE para Webservice

Recommended Posts

Pra começar

 

Vc esta usando alguma dll de terceiros

Vc passou o xml pelo validador para saber se ele esta sem erros de schemq

 

Vc baixou o manual de integração no site da Receita Federal

 

Desculpe o interrigatorio...mas sao informações importantes para começar a te ajudar

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nao estou usando nenhuma dll

Validei a xml usando os schemas 2.0 da nfe.fazenda tudo certim

Nao achei nenhum manual da receita federal

 

So nao consigo enviar para webservice..... Se puder ajudar eu agradeço ja tem 2 Semanas q eu e mais um estamos quebrando a cabeça

 

Codigo que eu uso para validar o 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


Public Class Form1


    Private Resultado As Boolean = True
    Public oCertificado As New X509Certificate2
    Public vStrXmlRetorno As String
    Public vArqERRRetorno As String
    Public vPastaXMLErro As String
    Public vPastaXMLEnvio As String
    Public vArqXMLRetorno As String
    Public vPastaXMLRetorno As String
    Public vXmlNfeDadosMsg As String
    Public vAmbiente As Integer
    Public vUF As Integer


    Private Sub ValidaNfe(ByVal NfeAler As String)


        Try


            'Abrir agora o arquivo XML criado e inserir o Protocolo encontrado!!
            Dim arquivo2 As String = NfeAler
            Dim xDoc As New XmlDocument : xDoc.Load(arquivo2)
            Dim Tamanho As String
            Dim Nfe As String




            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", "")


            'Fazer uma cópia d arquivo XML para gerar a assinatura
            Dim CaminhoArquivo As String = "C:\NF-E\XML\" + Tamanho


            '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)


            If OAd.vResultado = 0 Then 'Assinado corretamente


                pDadosNfe = OAd.vXMLStringAssinado
                vStringNfe = pDadosNfe.Substring(pDadosNfe.IndexOf("<NFe"), pDadosNfe.Length - pDadosNfe.IndexOf("<NFe"))


            Else 'Ocorreu algum erro na assinatura
                MessageBox.Show(OAd.vResultadoString, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End If


            'Validar o XML
            Dim TxtXSD As String


            TxtXSD = "C:\Users\Henrique\Desktop\PL_006i\nfe_v2.00.xsd"


            If Not CaminhoArquivo = String.Empty And Not TxtXSD = String.Empty Then


                Resultado = True
                Dim settings As New XmlReaderSettings()
                AddHandler settings.ValidationEventHandler, AddressOf Me.ValidationEventHandler


                'Valida o arquivo XML com o seu Schema XSD
                lstValida.Items.Add("Validando o arquivo XML " & CaminhoArquivo & " com o arquivo de Schema : " & TxtXSD)


                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


            'se ocorrer uma exceção exibe a mensagem
            lstValida.Items.Add(ex.Message)


        End Try


    End Sub




    Function SelecionarCertificado() As Boolean


        Dim vRetorna As Boolean
        Dim oX509Cert As New X509Certificate2
        Dim store As New X509Store
        Dim collection As New X509Certificate2Collection
        Dim collection1 As New X509Certificate2Collection
        Dim collection2 As New X509Certificate2Collection
        Dim scollection As New X509Certificate2Collection
        Dim msgResultado As String
        Dim xnome As String


        xnome = "CN=COPLAST INDUSTRIA E COMERCIO DE RESIDUOS PLASTICO:04672291000115, OU=Autenticado por AR Fenacon, OU=RFB e-CNPJ A1, OU=Secretaria da Receita Federal do Brasil - RFB, L=Manaus, S=AM, O=ICP-Brasil, C=BR"


        oX509Cert = New X509Certificate2()
        store = New X509Store("MY", StoreLocation.CurrentUser)
        store.Open(OpenFlags.ReadOnly Or OpenFlags.OpenExistingOnly)
        collection = store.Certificates
        collection1 = collection.Find(X509FindType.FindByTimeValid, DateTime.Now, False)
        collection2 = collection.Find(X509FindType.FindByKeyUsage, X509KeyUsageFlags.DigitalSignature, False)


        '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)




        'Para selecionar o certificado de uma lista
        scollection = X509Certificate2UI.SelectFromCollection(collection2, "Certificado(s) Digital(is) disponível(is)", "Selecione o certificado digital para uso no aplicativo", X509SelectionFlag.SingleSelection)


        If (scollection.Count = 0) Then


            msgResultado = "Nenhum certificado digital foi selecionado ou o certificado selecionado está com problemas."
            MessageBox.Show(msgResultado, "Advertência", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            vRetorna = False


        Else


            oX509Cert = scollection.Item(0) 'Para selecionar o item em Vb.NET
            oCertificado = oX509Cert
            xnome = oCertificado.Subject.ToString
            vRetorna = True
            'msgResultado = "Certificado Selecionado."
            'MessageBox.Show(msgResultado, "Advertência", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            Return vRetorna


        End If


    End Function


    Public Sub ValidationEventHandler(ByVal sender As Object, ByVal args As ValidationEventArgs)




        Resultado = False


        'lstValida.Items.Add(vbTab + "Erro de Validação : " + args.Message)


        If args.Severity = XmlSeverityType.Warning Then


            MsgBox("Nenhum arquivo de Schema foi encontrado para efetuar a validação...")


        ElseIf args.Severity = XmlSeverityType.Error Then


            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


            'lstValida.Items.Add(args.Exception.SourceUri + "," & args.Exception.LinePosition & "," & args.Exception.LineNumber)
            'MsgBox(args.Exception.SourceUri + "," & args.Exception.LinePosition & "," & args.Exception.LineNumber)


        End If


    End Sub




    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        End
    End Sub


    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load


        Dim Valor As String


        Me.Show()
        Valor = "C:\NF-E\XML\32131227494152000144550010000002061001112367-nfe (1).xml"
        ValidaNfe(Valor)
        If Command() <> "" Then
            Valor = Command()
            ValidaNfe(Valor)


            Me.Focus()
            Me.Show()
            Me.WindowState = FormWindowState.Normal


        End If


    End Sub


    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Me.Show()
    End Sub
End Class
Public Class AssinaturaDigitalClass


    Public vResultado As Integer
    Public vResultadoString As String
    Public vXMLStringAssinado As String
    Public XmlDoc As XmlDocument


    Sub Assinar(ByVal pArqXMLAssinar As String, ByVal pUri As String, ByVal pCertificado As X509Certificate2)


        'Abrir o arquivo XML a ser assinado e ler o seu conteúdo
        Dim SR As StreamReader
        Dim vXMLString As String


        SR = File.OpenText(pArqXMLAssinar)
        vXMLString = SR.ReadToEnd()
        SR.Close()


        ' //Atualizar atributos de retorno com conteúdo padrão
        vResultado = 0
        vResultadoString = "Assinatura realizada com sucesso"


        Try


            'Verifica o certificado a ser utilizado na assinatura
            Dim _xnome As String
            Dim _X509Cert As X509Certificate2
            Dim store As X509Store
            Dim collection As X509Certificate2Collection
            Dim collection1 As X509Certificate2Collection


            _xnome = ""


            _xnome = pCertificado.Subject.ToString()


            _X509Cert = New X509Certificate2()
            store = New X509Store("MY", StoreLocation.CurrentUser)
            store.Open(OpenFlags.ReadOnly Or OpenFlags.OpenExistingOnly)


            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()


                ' Create a new XML document.
                Dim doc As New XmlDocument
                doc = New XmlDocument()


                'Format the document to ignore white spaces.
                doc.PreserveWhitespace = False


                ' Load the passed XML file using it’s name.
                Try
                    doc.LoadXml(vXMLString)


                    ' Verifica se a tag a ser assinada existe é única
                    Dim qtdeRefUri As Integer
                    qtdeRefUri = doc.GetElementsByTagName(pUri).Count


                    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)


                                ' Add the key to the SignedXml document
                                signedXml.SigningKey = _X509Cert.PrivateKey


                                ' Create a reference to be signed
                                Dim reference As New Reference
                                reference = New Reference()


                                '--------- RETIRAR COMENTÁRIOS DAS LINHAS ABAIXO
                                ' pega o uri que deve ser assinada
                                Dim _Uri As XmlAttributeCollection
                                Dim _atributo As XmlAttribute


                                _Uri = doc.GetElementsByTagName(pUri).Item(0).Attributes
                                For Each _atributo In _Uri
                                    If (_atributo.Name = "Id") Then
                                        reference.Uri = "#" + _atributo.InnerText


                                    End If
                                Next


                                ' Add an enveloped transformation to the reference.
                                Dim env As New XmlDsigEnvelopedSignatureTransform
                                env = New XmlDsigEnvelopedSignatureTransform()
                                reference.AddTransform(env)


                                Dim c14 As New XmlDsigC14NTransform
                                c14 = New XmlDsigC14NTransform()
                                reference.AddTransform(c14)


                                ' Add the reference to the SignedXml object.
                                signedXml.AddReference(reference)


                                ' Create a new KeyInfo object
                                Dim keyinfo As New KeyInfo
                                keyinfo = New KeyInfo()


                                ' Load the certificate into a KeyInfoX509Data object
                                ' and add it to the KeyInfo object.
                                keyinfo.AddClause(New KeyInfoX509Data(_X509Cert))


                                ' Add the KeyInfo object to the SignedXml object.
                                signedXml.KeyInfo = keyinfo
                                signedXml.ComputeSignature()


                                ' Get the XML representation of the signature and save
                                ' it to an XmlElement object.
                                Dim xmlDigitalSignature As XmlElement
                                xmlDigitalSignature = signedXml.GetXml()


                                ' Gravar o elemento no documento XML
                                doc.DocumentElement.AppendChild(doc.ImportNode(xmlDigitalSignature, True))
                                XmlDoc = New XmlDocument()
                                XmlDoc.PreserveWhitespace = False
                                XmlDoc = doc


                                ' Atualizar a string do XML já assinada
                                vXMLStringAssinado = XmlDoc.OuterXml


                                ' Gravar o XML no HD
                                ' abre um stream para escrita e cria um StreamWriter para implementar o stream
                                Dim fs As New FileStream(pArqXMLAssinar, FileMode.OpenOrCreate, FileAccess.Write)
                                Dim SW_2 As New StreamWriter(fs)
                                SW_2.Flush()
                                SW_2.BaseStream.Seek(0, SeekOrigin.Begin)
                                SW_2.Write(vXMLStringAssinado)
                                SW_2.Flush()
                                SW_2.Close()


                            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

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

OK

 

Vamos lá, a dois anos atrás também tive minhas duas semanas nessa situação...

 

Realmente me expressei mal, mas o manual ao qual me referi é o de integração que não ensina a conectar...

 

........................................................................

 

Vou postar a função da minha primeira versão do emissor de NFe (É para ter uma ideia)

 

Tenho até vergonha de postar isso mas foi feito no tempo limite da obrigatoriedade...kkkkk

 

Hoje está bem diferente

 

Se quizer pode add meu contato do Skype ou do Google Talk que a gente troca uma idéia...

  Function TransmiteLote() As ERespostaTransmissao

            Dim cons As New HNfeRecepcao.NfeRecepcao2
            Dim cab As New HNfeRecepcao.nfeCabecMsg
            Dim versao As String
            Dim ambiente As String
            Dim emp As CEmissor
            Dim docEnvio As New XmlDocument
            Dim docRet As New XmlDocument
            Dim xmlRet As XmlElement

            Try

                'Verifica se o lote existe
                If Me.Existe Then

                    If Nz(Item.statusEnvio, "000") = "000" Then

                        'Carregar a versão do aplicativo que está sendo utilizada
                        versao = Sys.Parametro("versao")

                        'Carregar os dados do emissor do lote
                        emp = New CEmissor(Me.Item.cnpj)

                        'Carregar os dados do emissor do lote
                        ambiente = Item.tpAmb

                        'Monta o cabeçalho da solicitação SOAP
                        cab.cUF = emp.Item.uf
                        cab.versaoDados = versao

                        'Define parâmetros da solicitação
                        cons.Timeout = 120000
                        cons.nfeCabecMsgValue = cab
                        cons.ClientCertificates.Add(_certificado.Certificado)
                        cons.Url = Sys.GetURLServico(emp.Item.uf, Sys.EServico.enviNFe, CInt(ambiente))

                        'Caso o arquivo de lote não exista ele cria
                        If Not Me.ArquivoLoteExiste Then Me.GeraArquivoLote()

                        'Carrega o arquivo de lote já assinado
                        docEnvio.Load(Me.ArquivoLote)

                        Try

                            'Enviando mensagem SOAP
                            xmlRet = cons.nfeRecepcaoLote2(docEnvio)

                            'Cria xmlDocument com o resultado da requisição do SOAP
                            docRet.LoadXml(xmlRet.OuterXml)

                            'Faz o tratamento da resposta dada pela SEFAZ
                            Me.TransmiteLoteResposta(docRet)

                            Return ERespostaTransmissao.Transmitido

                        Catch ex As Exception

                        End Try
                    Else

                        If Nz(Me.Item.statusLote, "000") = "000" Then
                            Return ERespostaTransmissao.Transmitido
                        Else
                            Return ERespostaTransmissao.PorEnviar
                        End If

                    End If

                Else


                End If

            Catch ex As Exception
                Throw ex
            End Try

        End Function

        Sub TransmiteLoteResposta(ByVal docResposta As XmlDocument)

            Try

                Sys.SalvarArquivo(docResposta.OuterXml, Sys.ETipoArquivo.ReciboLote)

                docResposta.LoadXml(docResposta.OuterXml.Replace("xmlns=""http://www.portalfiscal.inf.br/nfe""", ""))


                'Tratamento de XMLDocument para XElement
                Dim banco As New DCNFeCTeDataContext
                Dim xLog As XElement
                xLog = XElement.Load(New XmlNodeReader(docResposta))

                'Execução da rotina 
                banco.TrataRecibo(xLog, Me.ID)

                GeraArquivoRecibo()

            Catch ex As Exception
                Throw ex
            End Try

        End Sub

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desculpe-me não responder mas tive uns dias pegados no trabalho

 

Baixei o projeto

 

Dando uma olhada

 

Tenta trocar (na linha 118 mais ou menos)

            'CABEÇALHO USADA PARA ENVIO DE LOTE
            wsMsg = New Recepcao.NfeRecepcao2(S_Url.UrlNfeRecepcao)
           

 

Por Isso

 

            'CABEÇALHO USADA PARA ENVIO DE LOTE
            wsMsg = New Recepcao.NfeRecepcao2()
            wsMsg.Url = S_Url.UrlNfeRecepcao

 

No arquivo C_WebService.vb

 

 

Coloca um ponto break no trecho

 

 'RETORNO DA SEFAZ
            strRetorno = wsMsg.nfeRecepcaoLote2(xmldoc)

E vê o que cai nessa variável, visualiza como XML

 

Se der Lote Recebido com sucesso, é só fazer a troca nos outros webservices que estão iguais sair pra galera.

 

Abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.