none
Error en el envío de datos para el nuevo SII del IVA de la Agencia Tributaria

    Pregunta

  • Buenos días,

    Estamos implementando el nuevo sistema SII de la Agencia Tributaria española a través del web service que han proporcionado y tras pelear con la poca (y mala) información proporcionada, hemos podido realizar el proceso de rellenado.

    Sin embargo, a la hora de enviar el "paquete" de datos nos devuelve un "Error Tecnico", pero como la respuesta está limitada a 1024 caractéres, no podemos ver el resto del mensaje (es un XML, pero no he sido capaz de exportarlo a un string para ver el contenido completo)

    Tras serializar a un XML, añadir la cabecera SOAPENV a mano y probar a enviar a través del portal de pruebas de la AEAT, hemos podido conprobar que el XML es correcto, por lo que parece que el error al enviar desde el web service viene desde el certificado.

    Para enviar a través del portal usamos una huella digital importada al Internet Explorer desde un .pfx, pero para la conexión por Web Service lo hemos exportado como .cer (X.509) sin contraseña (no nos la solicita al generarlo), aunque hemos probado con y sin ella, con el mismo resultado.

    El codigo usado es el que hemos encontrado por aquí, así que seguramente os sonará:

     Dim oSiiService As New AEAT_ServicioSFE.siiSOAPClient
     Dim oProxyFactEmitidas As New AEAT_ServicioSFE.SuministroLRFacturasEmitidas
    
     With oProxyFactEmitidas
    
          .Cabecera = New AEAT_ServicioSFE.CabeceraSii
          ... DATOS CABECERA
    
          .Cabecera.TipoComunicacion = AEAT_ServicioSFE.ClaveTipoComunicacionType.A0
    
          .RegistroLRFacturasEmitidas = New AEAT_ServicioSFE.LRfacturasEmitidasType(SiiSFras.Rows.Count - 1) {}
    
          For i = 0 To SiiSFras.Rows.Count - 1
             .RegistroLRFacturasEmitidas(i) = New AEAT_ServicioSFE.LRfacturasEmitidasType
             .RegistroLRFacturasEmitidas(i).PeriodoImpositivo = New AEAT_ServicioSFE.RegistroSiiPeriodoImpositivo
             ... RESTO DE CAMPOS A RELLENAR
    
          Next
          End With
          If diMSG("¿Conectamos con la AEAT para cumplimentar el Proceso SII?", "CONEXION CON AEAT", "1") Then
             Dim certificate As New System.Security.Cryptography.X509Certificates.X509Certificate2("D:\X509.cer", "XXXX")
             Dim Store As New X509Store(StoreLocation.LocalMachine)
             Store.Open(OpenFlags.ReadOnly)
    
             certificate = Store.Certificates(0)
    
             Dim oRespuesta As New AEAT_ServicioSFE.RespuestaLRFEmitidasType
             oSiiService.ClientCredentials.ClientCertificate.Certificate = certificate '.ClientCertificates.Add(certificate)
    
             oRespuesta = oSiiService.SuministroLRFacturasEmitidas(oProxyFactEmitidas)
             'Dim strRespuesta As String = oRespuesta.RespuestaLinea.ToString
             'Dim a As String = strRespuesta(0).ToString
          Else
             Dim xmlSerial As New System.Xml.Serialization.XmlSerializer(oProxyFactEmitidas.GetType(), "")
             Dim SufijoFecha As String = String.Format("_{0:yyyyMMdd}_{1:HHmmssfff}", Now, Now)
             Dim nombreFichero As String = String.Format("FE{0}", SufijoFecha)
             Dim strWriter As New StreamWriter(String.Format(RUTA, nombreFichero))
             xmlSerial.Serialize(strWriter, oProxyFactEmitidas)
             strWriter.Close()
    
             diMSG("Generado el archivo exportable XLM")
          End If

    ¿Alguien tiene idea de que es lo que da el error al envíar? El proceso se detiene al rellenar 'oRespuest', dando el mensaje de "Error Ténico"

    Como veréis está la opción de envío directo (la que da el error) y la de generar el XML, por si acaso hacerlo manual, pero en este segundo supuesto no somos capaces de generar la línea del SOAPENV necesaria, por lo que hay que pegarla a mano en el XML si queremos probar a través del portal. ¿Alguien sabe como se crea la siguiente línea en el XML por código?:

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:siiLR="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/fact/ws/SuministroLR.xsd" xmlns:sii="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/fact/ws/SuministroInformacion.xsd">

    Gracias.

    Un saludo, Paco

    • Cambiado Enrique M. Montejo viernes, 5 de mayo de 2017 6:52 Pregunta relacionada con Web Services.
    miércoles, 3 de mayo de 2017 7:55

Respuestas

  • Buenos días,

    Al final hemos podido localizar el problema. Efectivamente, se trataba de la configuración del almacén de certificados. Hemos cambiado la función por otra que hemos encontrado y que consulta el almacén del sistema (en vez de buscar físicamente el certificado) y todo ha empezado a funcionar.

    Código antiguo:

             Dim certificate As New System.Security.Cryptography.X509Certificates.X509Certificate2("D:\X509.cer", "XXXX")
             Dim Store As New X509Store(StoreLocation.LocalMachine)
             Store.Open(OpenFlags.ReadOnly)

    Nuevo código:

                    Dim store As Security.Cryptography.X509Certificates.X509Store = New Security.Cryptography.X509Certificates.X509Store("My")
                    store.Open(Security.Cryptography.X509Certificates.OpenFlags.ReadOnly)
    				
                    Dim certificate As New System.Security.Cryptography.X509Certificates.X509Certificate2
    				
                    Dim blnHayCert As Boolean
    				
                    For i = 0 To store.Certificates.Count - 1
                        If InStr(store.Certificates.Item(i).Subject, LblNifEmp.Text) Then
                            certificate = store.Certificates(i)
                            blnHayCert = True
                            Exit For
                        End If
                    Next
                    If blnHayCert = False Then
                        MessageBox.Show("NO SE HA ENCONTRADO EL CERTIFICADO DE " & LblNombreEmp.Text, "ERROR DE CERTIFICADO", _
                                        MessageBoxButtons.OK, MessageBoxIcon.Stop)
                        Exit Sub
                    End If
    Un saludo.

    • Marcado como respuesta Joyce_AC jueves, 4 de mayo de 2017 15:14
    jueves, 4 de mayo de 2017 14:07

Todas las respuestas

  • Hola,

    el certificado con el cual firmas la peticion es correcto? Es un certificado válido admitido por la AEAT? 


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    miércoles, 3 de mayo de 2017 8:47
  • Entiendo que si puedo validar en el portal de pruebas un XML con ese certificado importado en el navegador será válido (se trata de la huella digital de la FNMT para la empresa que envía el documento).

    Tan solo nos hemos limitado a exportarlo desde internet explorer en formato .cer (X.509) y buscar la ruta para leerlo.

    Gracias.

    miércoles, 3 de mayo de 2017 10:06
  • La linea que indicas 

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"

    xmlns:siiLR="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/fact/ws/SuministroLR.xsd"

    xmlns:sii="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/fact/ws/SuministroInformacion.xsd">



    debería generarla automáticamente tu cliente proxy al realizar la llamada. Te recomiendo uses Fiddler para poder capturar las trazas de los mensajes que envias.

    Cuando se produce lo de Error Técnico, recibes un FaultException del servicio? Puedes capturar el StackTrace y el InnerException?  Según la documentación el mensaje debería ser algo así

    <env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
     <env:Body>
     <env:Fault>
     <faultcode>env:Client</faultcode>
     <faultstring>Codigo[1304].XML no válido o mal formado</faultstring>
     </env:Fault>
     </env:Body>
    </env:Envelope>


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos




    • Editado Sergio Parra miércoles, 3 de mayo de 2017 10:24
    • Propuesto como respuesta Joyce_AC miércoles, 3 de mayo de 2017 14:57
    • Votado como útil Joyce_AC lunes, 12 de junio de 2017 14:07
    miércoles, 3 de mayo de 2017 10:17
  • La pregunta del SOAPENV es para ver si alguien me ayuda a crear esas líneas manualmente a través de código, ya que tengo la opción de generar el XML para inyectarlo a través del portal.

    No tengo mucha experiencia con XML y se me escapa como se crean con la clase XML del .NET

    Por otro lado está el proceso a través del Servicio Web que da el error al enviar.

    He conseguido sacar el error a un texto y aparece más información:

    03/05/2017 18:36:57 [LERROR] El tipo de contenido text/html del mensaje de respuesta no coincide con el tipo de contenido del enlace (text/xml; charset=utf-8). Si usa un codificador personalizado, asegúrese de que el método IsContentTypeSupported se implemente correctamente. Los primeros 1024 bytes de la respuesta fueron: '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
    <html lang="es-ES">
    <head>
        <title>Agencia Tributaria - Se ha producido un error</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">       
    <link href="https://www.agenciatributaria.gob.es/static_files/common/css/xzhtcs04.css" rel="stylesheet" type="text/css">
    <script type="text/javascript"> 
    		function toggle()
    		{
    		    var o=document.getElementById("AEAT_errores_tecnicos");
    			o.style.display=(o.style.display=='' || o.style.display=='none')?'block':'none';
    		}
    	</script>
    </head>
    <body>
    <div id="body">	  
    	<div id="header">
    	<div id="AEAT_header">
    	  <div id="topIzquierda">
    	  	<div id="logoAEAT">
    	  		<ul>
    				<li><a target="_self" href="https://www.agenciatributaria.gob.es"><span class="logoGobierno"></span></a>
    				</li>
    				<li><a target="_self" href="http://www.agenciatributaria.es"><span class="logoAEAT"></span></a>
    				</li>
    			</ul>	    	
    		</div>	  
    	 '. --> 
    Server stack trace: 
       en System.ServiceModel.Channels.HttpChannelUtilities.ValidateRequestReplyResponse(HttpWebRequest request, HttpWebResponse response, HttpChannelFactory`1 factory, WebException responseException, ChannelBinding channelBinding)
       en System.ServiceModel.Channels.HttpChannelFactory`1.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)
       en System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeSpan timeout)
       en System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message message, TimeSpan timeout)
       en System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
       en System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
       en System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)
    
    Exception rethrown at [0]: 
       en System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
       en System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
       en XXX.AEAT_ServicioSFE.siiSOAP.SuministroLRFacturasEmitidas(SuministroLRFacturasEmitidasRequest request)
       en XXX.AEAT_ServicioSFE.siiSOAPClient.AEAT_ServicioSFE_siiSOAP_SuministroLRFacturasEmitidas(SuministroLRFacturasEmitidasRequest request) en X:\XXXX\XXXXX\Service References\AEAT_ServicioSFE\Reference.vb:línea 8596
       en XXX.AEAT_ServicioSFE.siiSOAPClient.SuministroLRFacturasEmitidas(SuministroLRFacturasEmitidas SuministroLRFacturasEmitidas1) en X:\XXXX\XXXXX\Service References\AEAT_ServicioSFE\Reference.vb:línea 8602
       en XXX.frmSII.EscribisXlmFraREP() en X:\XXXX\XXXXX\frmSII.vb:línea 451

    Este mensaje es la excepción que genera rellenar el objeto 'oRespuesta'

    Un saludo, Paco


    • Editado P.Lara miércoles, 3 de mayo de 2017 16:56
    miércoles, 3 de mayo de 2017 16:54
  • Buenos días,

    Al final hemos podido localizar el problema. Efectivamente, se trataba de la configuración del almacén de certificados. Hemos cambiado la función por otra que hemos encontrado y que consulta el almacén del sistema (en vez de buscar físicamente el certificado) y todo ha empezado a funcionar.

    Código antiguo:

             Dim certificate As New System.Security.Cryptography.X509Certificates.X509Certificate2("D:\X509.cer", "XXXX")
             Dim Store As New X509Store(StoreLocation.LocalMachine)
             Store.Open(OpenFlags.ReadOnly)

    Nuevo código:

                    Dim store As Security.Cryptography.X509Certificates.X509Store = New Security.Cryptography.X509Certificates.X509Store("My")
                    store.Open(Security.Cryptography.X509Certificates.OpenFlags.ReadOnly)
    				
                    Dim certificate As New System.Security.Cryptography.X509Certificates.X509Certificate2
    				
                    Dim blnHayCert As Boolean
    				
                    For i = 0 To store.Certificates.Count - 1
                        If InStr(store.Certificates.Item(i).Subject, LblNifEmp.Text) Then
                            certificate = store.Certificates(i)
                            blnHayCert = True
                            Exit For
                        End If
                    Next
                    If blnHayCert = False Then
                        MessageBox.Show("NO SE HA ENCONTRADO EL CERTIFICADO DE " & LblNombreEmp.Text, "ERROR DE CERTIFICADO", _
                                        MessageBoxButtons.OK, MessageBoxIcon.Stop)
                        Exit Sub
                    End If
    Un saludo.

    • Marcado como respuesta Joyce_AC jueves, 4 de mayo de 2017 15:14
    jueves, 4 de mayo de 2017 14:07
  • Hola P.Lara,

    Gracias por visitar los foros y compartir tu solución.

    Saludos

    Joyce

    __________________________________________________________________________________________
    Por favor, recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, hace que sea más fácil para los otros visitantes encontrar la solución  más tarde. Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft. Este contenido es proporcionado "tal  cual" y no implica ninguna responsabilidad de parte de Microsoft.

    jueves, 4 de mayo de 2017 15:15
  • Buenos días,

    Estamos implementando el nuevo sistema SII de la Agencia Tributaria española a través del web service que han proporcionado y tras pelear con la poca (y mala) información proporcionada, hemos podido realizar el proceso de rellenado.

    Sin embargo, a la hora de enviar el "paquete" de datos nos devuelve un "Error Tecnico", pero como la respuesta está limitada a 1024 caractéres, no podemos ver el resto del mensaje (es un XML, pero no he sido capaz de exportarlo a un string para ver el contenido completo)

    Tras serializar a un XML, añadir la cabecera SOAPENV a mano y probar a enviar a través del portal de pruebas de la AEAT, hemos podido conprobar que el XML es correcto, por lo que parece que el error al enviar desde el web service viene desde el certificado.

    Para enviar a través del portal usamos una huella digital importada al Internet Explorer desde un .pfx, pero para la conexión por Web Service lo hemos exportado como .cer (X.509) sin contraseña (no nos la solicita al generarlo), aunque hemos probado con y sin ella, con el mismo resultado.

    El codigo usado es el que hemos encontrado por aquí, así que seguramente os sonará:

     Dim oSiiService As New AEAT_ServicioSFE.siiSOAPClient
     Dim oProxyFactEmitidas As New AEAT_ServicioSFE.SuministroLRFacturasEmitidas
    
     With oProxyFactEmitidas
    
          .Cabecera = New AEAT_ServicioSFE.CabeceraSii
          ... DATOS CABECERA
    
          .Cabecera.TipoComunicacion = AEAT_ServicioSFE.ClaveTipoComunicacionType.A0
    
          .RegistroLRFacturasEmitidas = New AEAT_ServicioSFE.LRfacturasEmitidasType(SiiSFras.Rows.Count - 1) {}
    
          For i = 0 To SiiSFras.Rows.Count - 1
             .RegistroLRFacturasEmitidas(i) = New AEAT_ServicioSFE.LRfacturasEmitidasType
             .RegistroLRFacturasEmitidas(i).PeriodoImpositivo = New AEAT_ServicioSFE.RegistroSiiPeriodoImpositivo
             ... RESTO DE CAMPOS A RELLENAR
    
          Next
          End With
          If diMSG("¿Conectamos con la AEAT para cumplimentar el Proceso SII?", "CONEXION CON AEAT", "1") Then
             Dim certificate As New System.Security.Cryptography.X509Certificates.X509Certificate2("D:\X509.cer", "XXXX")
             Dim Store As New X509Store(StoreLocation.LocalMachine)
             Store.Open(OpenFlags.ReadOnly)
    
             certificate = Store.Certificates(0)
    
             Dim oRespuesta As New AEAT_ServicioSFE.RespuestaLRFEmitidasType
             oSiiService.ClientCredentials.ClientCertificate.Certificate = certificate '.ClientCertificates.Add(certificate)
    
             oRespuesta = oSiiService.SuministroLRFacturasEmitidas(oProxyFactEmitidas)
             'Dim strRespuesta As String = oRespuesta.RespuestaLinea.ToString
             'Dim a As String = strRespuesta(0).ToString
          Else
             Dim xmlSerial As New System.Xml.Serialization.XmlSerializer(oProxyFactEmitidas.GetType(), "")
             Dim SufijoFecha As String = String.Format("_{0:yyyyMMdd}_{1:HHmmssfff}", Now, Now)
             Dim nombreFichero As String = String.Format("FE{0}", SufijoFecha)
             Dim strWriter As New StreamWriter(String.Format(RUTA, nombreFichero))
             xmlSerial.Serialize(strWriter, oProxyFactEmitidas)
             strWriter.Close()
    
             diMSG("Generado el archivo exportable XLM")
          End If

    ¿Alguien tiene idea de que es lo que da el error al envíar? El proceso se detiene al rellenar 'oRespuest', dando el mensaje de "Error Ténico"

    Como veréis está la opción de envío directo (la que da el error) y la de generar el XML, por si acaso hacerlo manual, pero en este segundo supuesto no somos capaces de generar la línea del SOAPENV necesaria, por lo que hay que pegarla a mano en el XML si queremos probar a través del portal. ¿Alguien sabe como se crea la siguiente línea en el XML por código?:

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:siiLR="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/fact/ws/SuministroLR.xsd" xmlns:sii="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/fact/ws/SuministroInformacion.xsd">

    Gracias.

    Un saludo, Paco

    Buenos días Paco:

    ¿Que referencia web pones para poder definir AEAT_ServicioSFE.siiSOAPClient?

    Muchas gracias.

    Un saludo, Jordi.

    Dim oSiiService As New AEAT_ServicioSFE.siiSOAPClient
    viernes, 9 de junio de 2017 10:11
  • Buenos días Jordi,

    Las que proporciona la agencia tributaria en el apartado "7.ANEXO 1 Definición de servicios y esquemas" (pag. 175) del manual de la versión 0.7 de SII según el tipo de envío o consulta necesario. Aunque al final ha sido como referencia de servicio y no web, para poder acceder al certificado.

    http://www.agenciatributaria.es/static_files/AEAT/Contenidos_Comunes/La_Agencia_Tributaria/Modelos_y_formularios/Suministro_inmediato_informacion/FicherosSuministros/V_07/SII_Descripcion_ServicioWeb_v0.7_es_es.pdf



    • Editado P.Lara lunes, 12 de junio de 2017 11:37
    lunes, 12 de junio de 2017 11:34
  • Muchas gracias P.Lara, finalmente lo he programado sin grabar el archivo XML, si no accediendo al webservice desde el principio incoporando las referencias web de facturasEmitidas y facturasRecibidas.
    martes, 27 de junio de 2017 15:32
  • Yo estoy teniendo problemas para analizar el tratamiento del XML de respuesta del envío.

    Intento serializarlo para poder analizarlo y (por otra parte) grabarlo en una carpeta en forma de fichero pero me da error.

    ¿tenéis algun trozo de codigo que podáis compartir para ver la forma de hacer dicho tratamiento?

    (muchas gracias)

    jueves, 17 de enero de 2019 8:21