Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   SII -Nuevo sistema de la Agencia Tributaria española de envío de datos vía Webservice (https://www.clubdelphi.com/foros/showthread.php?t=91252)

jcaceres121 27-03-2017 18:13:18

Hola.
Aunque se que este club es de Delphi, estoy intentando crear una solución en Java para el problema. Tengo alguna experiencia con Java y ninguna con webservices.
He visto tu código .NET, que es quizá lo más parecido a Java que he encontrado por ahí, pero me surgen dudas.
Lamento no haber encontrado ningún foro de Java y por eso me veo obligado a preguntar aquí.
Os comento mi situación.
Tengo ya creado una objeto SuministroLRFacturasEmitidas (supongo que correctamente) que contiene una factura de ejemplo, y también tengo un objeto X509Certificate con un certificado obtenido a partir de un fichero .PFX.
Entiendo que sólo me quedaría invocar a los métodos necesarios para enviar el objeto y recibir la respuesta, pero no se como.
Si alguien pudiera ayudarme, estaría muy agradecido. levo muchas horas con esto y no avanzo.
Gracias

CMB 27-03-2017 20:24:23

Cita:

Empezado por jcaceres121 (Mensaje 514752)
Hola.
Aunque se que este club es de Delphi

Efectivamente, el foro es sólo de Delphi pero en este hilo están participando programadores de otros varios lenguajes. Bienvenidos, creo que nadie estorba. Pero no sólo existe esta división. También está el grupo que prefiere crear primero su propio XML y luego enviarlo por los varios medios que existen, y otro sector, que parece mayoritario, que manda la información creándola sobre la marcha mediante el uso de las funciones de los WSDL. Quizás por este motivo seguir el hilo sea algo complicado y en algunos momentos desorienta.

Pero lo importante es que todos hemos aprendido bastante.

Muchas gracias a los que habeis aportado ideas y código.

Saludos,

Fèlix Ruiz 28-03-2017 15:11:00

1 Archivos Adjunto(s)
Cita:

Empezado por Fèlix Ruiz (Mensaje 514726)
Hola.
Estoy desarrollando un módulo para el envío de facturas al SII. La primera fase fue que generase los ficheros XML tal como indica la AEAT en su documentación.
Ahora estoy con la fase de envío con la AEAT, pero llevo varios días intentando enviar una factura y no hay manera. A ver si me pueden ayudar...
...

Hola.

Vuelvo a subir mi caso de error, a ver si alguien me puede ayudar.
Tanto si uso mi XML y lo cargo con Deserialize, como si voy directamente por servicio WSDL, al enviar con SuministroLRFacturasEmitidas() me da el error:
"The content type text/html of the response message does not match the content type of the binding (text/xml; charset=utf-8). If using a custom encoder, be sure that the IsContentTypeSupported method is implemented properly. The first 1024 bytes of the response were:..."

No es problema del certificado, pero no se exactamente que puede dar el error.
Si subo el XML original que crea mi app al portal de pruebas de Hacienda, este lo lee sin problemas.
Para el Deserialize tuve que hacer una modificaciones al XML para que se cargara bien (quitar los tags de SOAP y añadir los namespaces).
Adjunto el código usado para el Serialize y el usado para el Deserialize. También adjunto los XML: el que crea mi app (pensando q se podría mandar tal cual), el que uso para el Serialize y el que he generado con Deserialize a partir de la llamada directa al WSDL. Lo vuelvo a adjuntar pq vi que no envié correctamente uno de los ficheros...

A ver si me pueden ayudar. Seguramente es una chorrada, pero no veo donde estoy fallando...
Mil gracias.

jmlazaro 28-03-2017 17:22:31

Para Feliz Ruiz
 
Cita:

Empezado por Fèlix Ruiz (Mensaje 514810)
Hola.

Vuelvo a subir mi caso de error, a ver si alguien me puede ayudar.
Tanto si uso mi XML y lo cargo con Deserialize, como si voy directamente por servicio WSDL, al enviar con SuministroLRFacturasEmitidas() me da el error:
"The content type text/html of the response message does not match the content type of the binding (text/xml; charset=utf-8). If using a custom encoder, be sure that the IsContentTypeSupported method is implemented properly. The first 1024 bytes of the response were:..."

No es problema del certificado, pero no se exactamente que puede dar el error.
Si subo el XML original que crea mi app al portal de pruebas de Hacienda, este lo lee sin problemas.
Para el Deserialize tuve que hacer una modificaciones al XML para que se cargara bien (quitar los tags de SOAP y añadir los namespaces).
Adjunto el código usado para el Serialize y el usado para el Deserialize. También adjunto los XML: el que crea mi app (pensando q se podría mandar tal cual), el que uso para el Serialize y el que he generado con Deserialize a partir de la llamada directa al WSDL. Lo vuelvo a adjuntar pq vi que no envié correctamente uno de los ficheros...

A ver si me pueden ayudar. Seguramente es una chorrada, pero no veo donde estoy fallando...
Mil gracias.

A mí me pasaba lo mismo,si lo haces con el WSDL, modifica el App.config:
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="siiBinding1">
<security mode="Transport">
<transport clientCredentialType="Certificate" />
</security>

</binding>

Espero que te funcione.

Un saludo a todos

PASPAS 28-03-2017 18:30:45

Consultas al SII
 
Hola todas, dar la enhorabuena a este foro.
Estoy implementando el SII creando el fichero directamente en XML. Hasta ahora veo que será la mejor opción. Por ahora no estoy teniendo problemas. Mi pregunta va sobre las consultas de los envios realizados. Alguién se está peleando con este apartado??
He enviado a la AEAT si van a proporcionar una parte para la consulta desde web. Me han respondido que si pero sin ninguna aclaración.
Alguién sabe si los tiros van por lo que existe actualmente: "Cotejo de documentos" >> https://www2.agenciatributaria.gob.e...is.VisualizaSc
Por tanto se introduce el CSV en el formulario y se obtiene el resultado del envío
o por otro lado
existirá un portal de acceso para ver listado de todos los envios realizados( tipo Maestro - Detalle).
Lo necesito por saber como de cara a los clientes tengo que indicar el procedimiento de consulta. Ya que quiero ver la posibilidad de mostrar la página web de la AEAT para mayor seguridad en el envío.

CMB 28-03-2017 20:41:45

Cita:

Empezado por PASPAS (Mensaje 514839)
Hola todas, dar la enhorabuena a este foro.
Estoy implementando el SII creando el fichero directamente en XML. Hasta ahora veo que será la mejor opción. Por ahora no estoy teniendo problemas. Mi pregunta va sobre las consultas de los envios realizados. Alguién se está peleando con este apartado??
He enviado a la AEAT si van a proporcionar una parte para la consulta desde web. Me han respondido que si pero sin ninguna aclaración.
Alguién sabe si los tiros van por lo que existe actualmente: "Cotejo de documentos" >> https://www2.agenciatributaria.gob.e...is.VisualizaSc
Por tanto se introduce el CSV en el formulario y se obtiene el resultado del envío
o por otro lado
existirá un portal de acceso para ver listado de todos los envios realizados( tipo Maestro - Detalle).
Lo necesito por saber como de cara a los clientes tengo que indicar el procedimiento de consulta. Ya que quiero ver la posibilidad de mostrar la página web de la AEAT para mayor seguridad en el envío.

Para consultas manuales ve a https://www7.aeat.es/PRE-Exteriores/...formacion.html

Después elige la opción "Cliente de web service para el entorno de pruebas"

Saludos,

keys 29-03-2017 09:33:50

Buenos días. Por lo que se la hacienda va a poner una pagina de consulta donde poder comprobar todo lo presentado y su estado. Como dice el CMB ya lo tienes en el entorno de pruebas. Otra opción es desarrollarlo cada uno ya que la hacienda proporciona un webservice con el que se pueden hacer consultas y retorna la información presentada.

Un Saludo.

keys 29-03-2017 09:40:47

Hola a Todos. Ahora voy yo con una duda o problema por si le ha pasado a alguien.

Estomos desarrollando en delphi y a al hora de presentar mostramos todos los certificados disponibles en el equipo. En el equipo teníamos tres certificados, los cuales nos salian a la hora de obtenerlos. Uno de ellos estaba caducado y lo eliminamos del sistema, es decir ahora solo hay dos. Pero a la hora de obtener en delphi cuantos certificados hay me siguen saliendo tres, los dos que me quedan y uno en blanco.

A alguien le ha pasado esto o sabe por que es. La lista de certificados la estamos obteniendo de la siguiente forma.

Código Delphi [-]
   

function ObtenerCertificados(aList:TStringList):integer;
var
  hStore: HCERTSTORE;
  PrevContext, CurContext: PCERT_CONTEXT;
  cbSize: DWORD;
  sNombre: String;
begin
  aList.Clear;
  Result := 0;
  hStore := CertOpenSystemStore(0, PChar('MY'));
  if hStore <> nil then begin
     PrevContext := nil;
     CurContext := CertEnumCertificatesInStore(hStore, PrevContext);
     while CurContext <> nil do begin
       sNombre := '';
       cbSize := CertGetNameString(CurContext, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0, nil, nil, 0);
       if cbSize > 0 then
       begin
          SetLength(sNombre, cbSize-1);
          CertGetNameString(CurContext, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0, nil, PChar(sNombre), cbSize);
          aList.Add(sNombre);
       end;
       PrevContext := CurContext;
       CurContext  := CertEnumCertificatesInStore(hStore, PrevContext);
     end;
  end;
  result:=aList.count;
end;

Un Saludo.

jacju 29-03-2017 09:56:13

Buenas a tod@s, lo primero felicitaros y agradeceros la creación de este tema, después de leerme todo y practicar algunos ejemplos
el resultado es que puedo enviar los ficheros que genero y los graba en la web pero al hacer la llamada:

result := GetsiiSOAP.SuministroLRFacturasEmitidas(ASuministroLRFacturasEmitidas);

me devuelve este error:

El sistema no puede encontrar el archivo especificado. - URL: https://www7.aeat.es/wlpl/SSII-FACT/ws/fe/SiiFactFEV1SOAP

Lo curioso es que en facturas recibidas también me da error, pero si que las graba en la web

Estoy desarrollando en Delphi este sistema y necesito un poco de ayuda, gracias

Un Saludo.

dtovar8a 29-03-2017 11:06:28

Fin prematuro del archivo
 
Buenos días,
En el caso de la construcción del XML he optado por su creación manual. En este sentido no tengo ningún problema, puedo subir manualmente el fichero desde el portal de AEAT con su certificado y pasa correctamente, puediendo ver la factura subida desde la consulta de facturas.

El problema viene cuando intento subir dicho archivo mediante C# o VB.

He utilizado diferentes mecanismos, y en ambos me encuentro varios problemas:
  1. Utilizando HttpWebRequest, aparece el error "Fin prematuro del archivo".
    Comenta @CMB que puede ser problema del fichero y que al abrir con un explorador me indicará la línea/columna del error, pero el fichero abre correctamente, de hecho, como he dicho antes, lo he subido sin problemas desde el portal.
    El código que utilizo es el que utiliza @angelhorse:
    Código:

        Public Sub sendXML(_subjectname As String, _filepath As String)
            subjectName = _subjectname
            filepath = _filepath

            Dim req As HttpWebRequest
            Dim url As String = "https://www7.aeat.es/wlpl/SSII-FACT/ws/fe/SiiFactFEV1SOAP"
            'inicializar propiedades request--------------------------------
            req = HttpWebRequest.Create(url)
            req.Headers.Add("SOAP:Action")
            req.ContentType = "text/xml;charset=""utf-8"""
            req.Accept = "text/xml"
            req.Method = "POST"

            Dim soapEnvelopeXml As XmlDocument = New XmlDocument()
            soapEnvelopeXml.Load(_filepath)

            cert = New X509Certificate2("c:\Temp\certificado.pfx", "12345")
            req.ClientCertificates.Add(cert)

            Dim rest As WebResponse = req.GetResponse()

            Dim reader As StreamReader = New StreamReader(rest.GetResponseStream())
            soapResult = reader.ReadToEnd()
        End Sub

    ¿Que está ocurriendo?
  2. Utilizando la clase siiService, creada a partir del WS y cambianado inheerits por: Microsoft.Web.Services3.WebServicesClientProtocol, como describe @batuzail.
    Los pasos que sigo son los siguientes:
    • Agrego a referencias de mi proyecto "Microsoft.Web.Services3"
    • Utilizo la siguiente instrucción para generar la clase siiService a partir del servicio web:
      Código:

      wsdl https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/fact/ws/SuministroFactEmitidas.wsdl /language=VB
      Una vez generada la clase, la edito y cambio
      Código:

      Partial Public Class siiService
          Inherits System.Web.Services.Protocols.SoapHttpClientProtocol

      por
      Código:

      Partial Public Class siiSuministroFactEmitidas
          Inherits Microsoft.Web.Services3.WebServicesClientProtocol

    • Importo a mi proyecto la clase recién generada
    • Agrego la referencia al servico web para tener acceso a los datasets y la llamo SuministroFactEmitidas
    • Añado los siguientes imports:
      Código:

      Imports System.IO
      Imports System.Security.Cryptography.X509Certificates
      Imports System.Xml.Serialization
      Imports Microsoft.Web.Services3
      Imports Microsoft.Web.Services3.Security
      Imports Microsoft.Web.Services3.Security.Tokens

    • Añado el siguiente código
      Código:

          Private Sub send()

              Try
                  cert = findCertificate()
                  Dim signatureToken As X509SecurityToken = New X509SecurityToken(cert)
                  Dim sig As New MessageSignature(signatureToken)

                  Dim webserviceProxy As New siiSuministroFactEmitidas
                  webserviceProxy.ClientCertificates.Add(cert)

                  Dim requestContext As SoapContext = webserviceProxy.RequestSoapContext
                  requestContext.Security.Tokens.Add(signatureToken)
                  requestContext.Security.Timestamp.TtlInSeconds = 60
                  requestContext.Security.Elements.Add(sig)

                  Dim suministroLRFacturasEmitidas As New SuministroLRFacturasEmitidas

                  Dim xmlSerializer As New XmlSerializer(suministroLRFacturasEmitidas.GetType, "https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/fact/ws/SuministroLR.xsd")

                  Using reader As New FileStream(filepath, FileMode.Open)
                      suministroLRFacturasEmitidas = CType(xmlSerializer.Deserialize(reader), SuministroLRFacturasEmitidas)
                  End Using

                  Dim resp As SuministroFactEmitidas.RespuestaLRFEmitidasType

                  webserviceProxy.SuministroLRFacturasEmitidas(suministroLRFacturasEmitidas)

              Catch ex As Exception
                  Console.WriteLine(ex.ToString())
              End Try

          End Sub

      No tengo ningún error de compilación, pero al ejecutarlo aparece un error en tiempo de ejecución en la siguiente línea:
      Código:

      Dim webserviceProxy As New siiSuministroFactEmitidas
      con el error "URI no válido: no se puede determinar el formato del URI."
¿Alguien podría darme algo de luz por alguna de las dos vías?

Gracias

keys 29-03-2017 11:13:11

Cita:

Empezado por jacju (Mensaje 514866)
Buenas a tod@s, lo primero felicitaros y agradeceros la creación de este tema, después de leerme todo y practicar algunos ejemplos
el resultado es que puedo enviar los ficheros que genero y los graba en la web pero al hacer la llamada:

result := GetsiiSOAP.SuministroLRFacturasEmitidas(ASuministroLRFacturasEmitidas);

me devuelve este error:

El sistema no puede encontrar el archivo especificado. - URL: https://www7.aeat.es/wlpl/SSII-FACT/...iiFactFEV1SOAP

Lo curioso es que en facturas recibidas también me da error, pero si que las graba en la web

Estoy desarrollando en Delphi este sistema y necesito un poco de ayuda, gracias

Un Saludo.

Mira que tengas bien definido esto.

defWSDL = 'https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/fact/ws/SuministroFactEmitidas.wsdl';
defURL = 'https://www7.aeat.es/wlpl/SSII-FACT/ws/fe/SiiFactFEV1SOAP';
defSvc = 'siiService';
defPrt = 'SuministroFactEmitidasPruebas';

PepCat 29-03-2017 11:16:18

Cita:

Empezado por keys (Mensaje 514865)
Hola a Todos. Ahora voy yo con una duda o problema por si le ha pasado a alguien.

Estomos desarrollando en delphi y a al hora de presentar mostramos todos los certificados disponibles en el equipo. En el equipo teníamos tres certificados, los cuales nos salian a la hora de obtenerlos. Uno de ellos estaba caducado y lo eliminamos del sistema, es decir ahora solo hay dos. Pero a la hora de obtener en delphi cuantos certificados hay me siguen saliendo tres, los dos que me quedan y uno en blanco.

A alguien le ha pasado esto o sabe por que es. La lista de certificados la estamos obteniendo de la siguiente forma.

Código Delphi [-]
   

function ObtenerCertificados(aList:TStringList):integer;
var
  hStore: HCERTSTORE;
  PrevContext, CurContext: PCERT_CONTEXT;
  cbSize: DWORD;
  sNombre: String;
begin
  aList.Clear;
  Result := 0;
  hStore := CertOpenSystemStore(0, PChar('MY'));
  if hStore <> nil then begin
     PrevContext := nil;
     CurContext := CertEnumCertificatesInStore(hStore, PrevContext);
     while CurContext <> nil do begin
       sNombre := '';
       cbSize := CertGetNameString(CurContext, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0, nil, nil, 0);
       if cbSize > 0 then
       begin
          SetLength(sNombre, cbSize-1);
          CertGetNameString(CurContext, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0, nil, PChar(sNombre), cbSize);
          aList.Add(sNombre);
       end;
       PrevContext := CurContext;
       CurContext  := CertEnumCertificatesInStore(hStore, PrevContext);
     end;
  end;
  result:=aList.count;
end;

Un Saludo.

Hola Keys,

Después de ver todos los problemas que se han comentado en este foro con el envió de más de 13 facturas con la librería de certificados que incluye Delphi he optado por utilizar la librería CAPICOM y abrir directamente el fichero con el certificado.

Código Delphi [-]

procedure SetCertificate(const FileName, Password: string; var Data: Pointer);
var
  Cert : ICertificate2;
  CertContext : ICertContext;
  PCertContext : PCCERT_CONTEXT;
begin
  try
    Cert := CoCertificate.Create;
  except
    on E: EOleSysError  do
      raise Exception.Create('CAPICOM.DLL is not registered')
  end;

  Cert.Load(FileName, Password, CAPICOM_KEY_STORAGE_EXPORTABLE, CAPICOM_LOCAL_MACHINE_KEY);
  CertContext := Cert as ICertContext;
  CertContext.Get_CertContext(Integer(PCertContext));
  if InternetSetOption(Data, INTERNET_OPTION_CLIENT_CERT_CONTEXT, PCertContext, Sizeof(CERT_CONTEXT)) = False then
    raise Exception.Create ( 'Error setting "' + FileName + '" certificate in web service' )
end;

procedure TfEmitidas.emitidasHTTPWebNode1BeforePost(const HTTPReqResp: THTTPReqResp; Data: Pointer);
begin
  SetCertificate('C:\Cetificados\FicheroConCertificado.p12', '1234', Data);
end;

keys 29-03-2017 11:21:43

Lo primero gracias. El problema de las 13 facturas ya esta solucionado hace tiempo, se solucionó con el uso correcto de las CAPICOM, el problema no lo tengo con los envios, los hago correctamente. El problema es que si en el ordenador hay varios certificados hay que indicar con cual de ellos hacer el envío y como ya he dicho la función que los devuelve por lo visto tambien incluye los eliminados.

Nasca 29-03-2017 11:28:40

Cita:

Empezado por keys (Mensaje 514874)
Lo primero gracias. El problema de las 13 facturas ya esta solucionado hace tiempo, se solucionó con el uso correcto de las CAPICOM, el problema no lo tengo con los envios, los hago correctamente. El problema es que si en el ordenador hay varios certificados hay que indicar con cual de ellos hacer el envío y como ya he dicho la función que los devuelve por lo visto tambien incluye los eliminados.

Entiendo que los certificados que usas con ese sistema son los del almacén del Sistema Operativo, los que usa Internet Explorer y Chrome.
Con lo cual la eliminación de, por ejemplo, Firefox no elimina el certificado.
Mira que no sea algo así.

keys 29-03-2017 11:30:33

Estoy accediendo a los certificados del sistema operativo. Si voy al panel de control ese certificado no sale. Pero si en la funcion de delphi que accede a ellos.

vboloradito 29-03-2017 11:41:24

Sii vs modulo 340
 
Hola:
Soy nuevo en el foro.
Tenemos que empezar con sii y todavia no sabemos en que lo vamos a hacer.
no se si llegamos tarde.
La pregunta es.
- ¿La información para el SII la estais encontrando en la que ya teneis para el modulo 340?.
- Habeis pensado en implementar alguna validación contra SII.
ejemplo. cuento cuanta facutaras tengo en mi sistema el dia 1/03/2017 (y me dice 3454 por 1.345 Euros)
lanzar consultar al SII para ver si realmente tengo 345 facturas por un total de 1.345 euros)
O simplemente os vais a fiar de que el SII os ha dicho que la factura esta correctamente enviada.

jacju 29-03-2017 12:04:49

Cita:

Empezado por keys (Mensaje 514871)
Mira que tengas bien definido esto.

defWSDL = 'https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/fact/ws/SuministroFactEmitidas.wsdl';
defURL = 'https://www7.aeat.es/wlpl/SSII-FACT/ws/fe/SiiFactFEV1SOAP';
defSvc = 'siiService';
defPrt = 'SuministroFactEmitidasPruebas';


Gracias por contestar, pero tengo definido todo esto asi como lo pones tu, te tengo que decir que si lo hago con Delphi 10.2 el error es distinto, me dice
que no esperaba una cabecera txt/HTML y el código es el mismo en un sistema que en otro.

Lo mas curioso es que se quedan grabadas las facturas en la web del aeat y si subo el fichero XML manualmente desde la web que genera el HTTprio me lo acepta.

Creo que al final lo conseguiremos.

keys 29-03-2017 12:10:14

yo las facturas las envio así.

GetsiiSOAP(true, '', FSIIImprimir.soapeador).SuministroLRFacturasEmitidas(ASuministroLRFacturasEmitidas);

FSIIImprimir.soapeador es un objeto THTTPRIO que tengo en un formulario y donde tengo los eventos correspondientes

dtovar8a 29-03-2017 12:13:31

siiSOAPCliente
 
Cita:

Empezado por dtovar8a (Mensaje 514869)
Buenos días,
En el caso de la construcción del XML he optado por su creación manual. En este sentido no tengo ningún problema, puedo subir manualmente el fichero desde el portal de AEAT con su certificado y pasa correctamente, puediendo ver la factura subida desde la consulta de facturas.

El problema viene cuando intento subir dicho archivo mediante C# o VB.

He utilizado diferentes mecanismos, y en ambos me encuentro varios problemas:
  1. Utilizando HttpWebRequest, aparece el error "Fin prematuro del archivo".
    Comenta @CMB que puede ser problema del fichero y que al abrir con un explorador me indicará la línea/columna del error, pero el fichero abre correctamente, de hecho, como he dicho antes, lo he subido sin problemas desde el portal.
    El código que utilizo es el que utiliza @angelhorse:
    Código:

        Public Sub sendXML(_subjectname As String, _filepath As String)
            subjectName = _subjectname
            filepath = _filepath

            Dim req As HttpWebRequest
            Dim url As String = "https://www7.aeat.es/wlpl/SSII-FACT/ws/fe/SiiFactFEV1SOAP"
            'inicializar propiedades request--------------------------------
            req = HttpWebRequest.Create(url)
            req.Headers.Add("SOAP:Action")
            req.ContentType = "text/xml;charset=""utf-8"""
            req.Accept = "text/xml"
            req.Method = "POST"

            Dim soapEnvelopeXml As XmlDocument = New XmlDocument()
            soapEnvelopeXml.Load(_filepath)

            cert = New X509Certificate2("c:\Temp\certificado.pfx", "12345")
            req.ClientCertificates.Add(cert)

            Dim rest As WebResponse = req.GetResponse()

            Dim reader As StreamReader = New StreamReader(rest.GetResponseStream())
            soapResult = reader.ReadToEnd()
        End Sub

    ¿Que está ocurriendo?
  2. Utilizando la clase siiService, creada a partir del WS y cambianado inheerits por: Microsoft.Web.Services3.WebServicesClientProtocol, como describe @batuzail.
    Los pasos que sigo son los siguientes:
    • Agrego a referencias de mi proyecto "Microsoft.Web.Services3"
    • Utilizo la siguiente instrucción para generar la clase siiService a partir del servicio web:
      Código:

      wsdl https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/fact/ws/SuministroFactEmitidas.wsdl /language=VB
      Una vez generada la clase, la edito y cambio
      Código:

      Partial Public Class siiService
          Inherits System.Web.Services.Protocols.SoapHttpClientProtocol

      por
      Código:

      Partial Public Class siiSuministroFactEmitidas
          Inherits Microsoft.Web.Services3.WebServicesClientProtocol

    • Importo a mi proyecto la clase recién generada
    • Agrego la referencia al servico web para tener acceso a los datasets y la llamo SuministroFactEmitidas
    • Añado los siguientes imports:
      Código:

      Imports System.IO
      Imports System.Security.Cryptography.X509Certificates
      Imports System.Xml.Serialization
      Imports Microsoft.Web.Services3
      Imports Microsoft.Web.Services3.Security
      Imports Microsoft.Web.Services3.Security.Tokens

    • Añado el siguiente código
      Código:

          Private Sub send()

              Try
                  cert = findCertificate()
                  Dim signatureToken As X509SecurityToken = New X509SecurityToken(cert)
                  Dim sig As New MessageSignature(signatureToken)

                  Dim webserviceProxy As New siiSuministroFactEmitidas
                  webserviceProxy.ClientCertificates.Add(cert)

                  Dim requestContext As SoapContext = webserviceProxy.RequestSoapContext
                  requestContext.Security.Tokens.Add(signatureToken)
                  requestContext.Security.Timestamp.TtlInSeconds = 60
                  requestContext.Security.Elements.Add(sig)

                  Dim suministroLRFacturasEmitidas As New SuministroLRFacturasEmitidas

                  Dim xmlSerializer As New XmlSerializer(suministroLRFacturasEmitidas.GetType, "https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/fact/ws/SuministroLR.xsd")

                  Using reader As New FileStream(filepath, FileMode.Open)
                      suministroLRFacturasEmitidas = CType(xmlSerializer.Deserialize(reader), SuministroLRFacturasEmitidas)
                  End Using

                  Dim resp As SuministroFactEmitidas.RespuestaLRFEmitidasType

                  webserviceProxy.SuministroLRFacturasEmitidas(suministroLRFacturasEmitidas)

              Catch ex As Exception
                  Console.WriteLine(ex.ToString())
              End Try

          End Sub

      No tengo ningún error de compilación, pero al ejecutarlo aparece un error en tiempo de ejecución en la siguiente línea:
      Código:

      Dim webserviceProxy As New siiSuministroFactEmitidas
      con el error "URI no válido: no se puede determinar el formato del URI."
¿Alguien podría darme algo de luz por alguna de las dos vías?

Gracias

También he probado a hacer el envío tal y como comenta @bartag:

Cita:

Empezado por bartag (Mensaje 514008)
Te pongo el código que utilizo. Básicamente lo que hace es tomar un archivo xml y lo envía. Debes por favor cumplimentar previamente los campos de dicho archivo pues en caso contrario te dará errores de validación.

Código:

        ' ----------------------------------------------------------------------------------------
        Dim store As Security.Cryptography.X509Certificates.X509Store =  New Security.Cryptography.X509Certificates.X509Store("My")
        store.Open(Security.Cryptography.X509Certificates.OpenFlags.ReadOnly)

        Dim CertificadoCorrecto As New System.Security.Cryptography.X509Certificates.X509Certificate2
       
        For Each x In store.Certificates
            ListCert = ListCert & vbNewLine
        Next
        'RichTextBox1.Text = ListCert

        CertificadoCorrecto = store.Certificates(CInt(TextBoxNumeroOrdenCertificado.Text)) '(5)

        ' Objeto que almacenara la respuesta de la funcion del Web Service
        Dim resp As New ServiceReference1.RespuestaLRFEmitidasType

        ' Ws
        Dim Ws As New ServiceReference1.siiSOAPClient

        Ws.ClientCredentials.ClientCertificate.Certificate = CertificadoCorrecto
        Ws.ClientCredentials.UseIdentityConfiguration = True

        ' Asignamos el certificado:
        Ws.ClientCredentials.ClientCertificate.Certificate = CertificadoCorrecto
        ' ----------------------------------------------------------------------------------------


        ' ----------------------------------------------------------------------------------------
        Dim _SuministroLRFacturasEmitidas As New SuministroLRFacturasEmitidas
        '--------------------------------------------------------------------------
       
        Try

            Dim x As New  XmlSerializer(_SuministroLRFacturasEmitidas.GetType,  "https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/fact/ws/SuministroLR.xsd") 

            ' A FileStream is needed to read the XML document.
            Dim filename As String = "facturaEmitidaMODEL.XML"


            Using reader As New FileStream(filename, FileMode.Open)
                _SuministroLRFacturasEmitidas = CType(x.Deserialize(reader), SuministroLRFacturasEmitidas)
            End Using

            ' SI QUEREMOS SOBREESCRIBIR EL XML ANTES DE ENVIAR:
            ' SOBREESCRIBIMOS DATS FORM ANTES SEND:
            _SuministroLRFacturasEmitidas.Cabecera.Titular.NombreRazon = Trim(TextBoxRazonSocialEmisor.Text)
            _SuministroLRFacturasEmitidas.Cabecera.Titular.NIF = Trim(TextBoxNIFEmisor.Text)

          '(...)

          '// se hace la llamada a la funcion suministrada por el WS
            resp = Ws.SuministroLRFacturasEmitidas(_SuministroLRFacturasEmitidas)

            Catch ex As Exception
            MsgBox(ex.Message)
            Respuesta2RichTextBox = ex.Message
        Finally
            'Me.Cursor = Cursors.Default
            'Threading.Thread.Sleep(5000)
            'ProgressBar1.Style = ProgressBarStyle.Continuous
            ''ProgressBar1.Value = ProgressBar1.Maximum
        End Try

Te adjunto también el archivo xml que debes cumplimentar donde indica '[A CUMPLIMENTAR]'.

Con esto, se toma la factura del archivo (fíjate que solamente tiene el nodo '<SuministroLRFacturasEmitidas>' y nada del encabezado SOAP para que no dé error al aplicar el Deserialize) y nos la convierte en un objeto serializado donde podemos acceder a los campos de la clase antes de enviar si lo deseamos; en caso contrario se envía y la propia llamada se encarga de insertar las cabeceras, los namespaces, etc.

Pero a pesar de no tener ningún error de compilación, me da un error de ejecución. Mi codigo es el siguiente:
Código:

Private Sub send()

        Try
            Dim webserviceProxy As New SuministroFactEmitidas.siiSOAPClient
            Dim resp As New SuministroFactEmitidas.RespuestaLRFEmitidasType
            Dim suministroLRFacturasEmitidas As New SuministroFactEmitidas.SuministroLRFacturasEmitidas

            cert = findCertificate()
            Dim signatureToken As X509SecurityToken = New X509SecurityToken(cert)
            Dim sig As New MessageSignature(signatureToken)

            webserviceProxy.ClientCredentials.ClientCertificate.Certificate = cert

            Dim xmlSerializer As New XmlSerializer(suministroLRFacturasEmitidas.GetType, "https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/fact/ws/SuministroLR.xsd")
            Dim reader As New FileStream(filepath, FileMode.Open)

            suministroLRFacturasEmitidas = CType(xmlSerializer.Deserialize(reader), SuministroFactEmitidas.SuministroLRFacturasEmitidas)
            resp = webserviceProxy.SuministroLRFacturasEmitidas(suministroLRFacturasEmitidas)



            'webserviceProxy.SuministroLRFacturasEmitidas(suministroLRFacturasEmitidas)

        Catch ex As Exception
            Console.WriteLine(ex.ToString())
        End Try

y el error que aparece es el siguiente:
No se encontró el elemento de extremo predeterminado que hace referencia al contrato 'SuministroFactEmitidas.siiSOAP' en la sección de configuración de cliente de ServiceModel. La razón puede ser que no se encontró ningún archivo de configuración para la aplicación o que no se encontró ningún elemento de extremo correspondiente a este contrato en el elemento de cliente.

¿podeis ayudarme?
Gracias

newtron 29-03-2017 12:20:58

Cita:

Empezado por vboloradito (Mensaje 514878)
Hola:
Soy nuevo en el foro.
Tenemos que empezar con sii y todavia no sabemos en que lo vamos a hacer.
no se si llegamos tarde.
La pregunta es.
- ¿La información para el SII la estais encontrando en la que ya teneis para el modulo 340?.
- Habeis pensado en implementar alguna validación contra SII.
ejemplo. cuento cuanta facutaras tengo en mi sistema el dia 1/03/2017 (y me dice 3454 por 1.345 Euros)
lanzar consultar al SII para ver si realmente tengo 345 facturas por un total de 1.345 euros)
O simplemente os vais a fiar de que el SII os ha dicho que la factura esta correctamente enviada.

El SII te da un resultado por cada uno de los documentos que envías indicando si se ha enviado correctamente, enviado con errores o no enviado. Para mi si el SII te ha dicho que un documento está enviado de forma correcta y te da un identificador ya me vale. Yo lo que hago es marcar el resultado en cada uno de los documentos y así controlo los que están pendientes de envío totalmente o enviado con errores para poder corregirlos y volverlos a enviar. Los ya enviados los ignoro "for ever".

Saludos


La franja horaria es GMT +2. Ahora son las 23:47:07.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi