Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Proyecto SIF/Veri*Factu/Ley Antifraude > Envío de registros y sus respuestas
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 02-07-2025
Quim Herrera Quim Herrera is offline
Miembro
 
Registrado: may 2004
Posts: 44
Poder: 0
Quim Herrera Va por buen camino
Cita:
Empezado por Galahad Ver Mensaje
Buenos días.
Hemos desarrollado una función de envio de registros del verifactu que funciona perfectamente cuando se utiliza desde una aplicación de escritorio.
La hemos trasladado a un servicio con el fin de que al final sea dicho servicio el que se encargue del envio de los xml de las declaraciones.
Si ejecuto dicho servicio con credenciales de un usuario del dominio local funciona,, pero si lo ejecuto por defecto con el usuario genérico del servicio 'localsystem' no funciona, el servicio devuelve un error soap:

Ex: ESOAPHTTPException: Received content of invalid Content-Type setting: text/html - SOAP expects "text/xml".

Supongo que seremos muchos los que utilizamos un servicio para hacer el envio del verifactu , me comentan que podría ser por no indicar un 'contenttype' específico,, pero no entiendo entonces porque si funciona sin problemas tanto desde una aplicación de escritorio como ejecutanto el servicio con un usuario del dominio . el usuario del servicio 'localsystem' en principio ya sabemos que no tiene acceso a la red local,, pero aqui... supuestamente se hace una llamada por soap a un servicio web...
no entiendo..
esta es la llamada genérica que hacemos..


Código Delphi [-]
 res := RespuestaRegFactuSistemaFacturacionType.Create;
      try
        SistemaFacturacion.RespuestaRegFactuSistemaFacturacion(Res) :=
               SistemaFacturacion.GetsfPortTypeVerifactu(false, Rio.URL , Rio ).RegFactuSistemaFacturacion( verifactu );
      except
        on e:exception do
        begin
           texto_error := 'Error SOAP: '+E.message;
         
           exit;
        end;
      end;

Hola,
A mi me pasaba lo mismo. Al final lo solucioné cargando el certificado en pfx y poniendo la contraseña por código y al enviar inicializar COM antes porque si no parece que httprio no funciona bien en el servicio:

Código Delphi [-]
uses Winapi.ActiveX;

   try
      CoInitialize(nil); // Inicialitza COM

      ...

        HTTPRIO1:=THTTPRIO.create(nil);

    .....

        res:=   RespuestaRegFactuSistemaFacturacionType.Create;
        res:=   GetsfPortTypeVerifactu( false, direccion_envio , HTTPRIO1 ).RegFactuSistemaFacturacion( veriFactu );        // enviarlo !

  finally
       CoUninitialize; //limpia COM
   end;

El código para la carga del certificado lo adapté del proyecto Demo con código Verifactu.dll para (delphi 7) que hay en el foro y me funciona bien en Delphi 10.2.3.

Saludos
Responder Con Cita
  #2  
Antiguo 02-07-2025
Galahad Galahad is offline
Miembro
 
Registrado: abr 2007
Posts: 266
Poder: 20
Galahad Va por buen camino
Cita:
Empezado por Quim Herrera Ver Mensaje
Hola,
A mi me pasaba lo mismo. Al final lo solucioné cargando el certificado en pfx y poniendo la contraseña por código y al enviar inicializar COM antes porque si no parece que httprio no funciona bien en el servicio:

Código Delphi [-]
uses Winapi.ActiveX;

   try
      CoInitialize(nil); // Inicialitza COM

      ...

        HTTPRIO1:=THTTPRIO.create(nil);

    .....

        res:=   RespuestaRegFactuSistemaFacturacionType.Create;
        res:=   GetsfPortTypeVerifactu( false, direccion_envio , HTTPRIO1 ).RegFactuSistemaFacturacion( veriFactu );        // enviarlo !

  finally
       CoUninitialize; //limpia COM
   end;

El código para la carga del certificado lo adapté del proyecto Demo con código Verifactu.dll para (delphi 7) que hay en el foro y me funciona bien en Delphi 10.2.3.

Saludos
vale, muchas gracias,, voy a revisar ese proyecto y adaptar esa función a ver si solucionamos el tema..
Responder Con Cita
  #3  
Antiguo 10-07-2025
Galahad Galahad is offline
Miembro
 
Registrado: abr 2007
Posts: 266
Poder: 20
Galahad Va por buen camino
Cita:
Empezado por Galahad Ver Mensaje
vale, muchas gracias,, voy a revisar ese proyecto y adaptar esa función a ver si solucionamos el tema..
Hola, perdonad que moleste de nuevo con esto, pero es que no lo consigo.
He intentado adaptar el ejemplo de carga del proyecto 'Demo Verifactu DLL', pero como tengo delphi 12 y ese proyecto esta pensado para delphi 7 no coinciden algunas clases y no consigo adaptarlo.

por ejemplo en el proyecto de delphi 7 el evento webnodebeforepost esta declarado así:
Código Delphi [-]
procedure TEventosWebNode.WebNodeBeforePost(const HTTPReqResp: THTTPReqResp;
  Data: Pointer);
var
  pStore: HCERTSTORE;
  pCert: PCERT_CONTEXT;
  DataBlob: CRYPT_BIT_BLOB;
  PFX: TBytes;
  pass,cert:string;
begin
  if sesion=-1 then // viene de un validador de nif
  begin
      pass:=nifValidatorPass;
      cert:=nifValidator;
  end
  else     // viene de un objeto verifactu
  begin
      pass:=sesiones[sesion].inicio.passwordCertificado;
      cert:=sesiones[sesion].inicio.nombreCertificado;
  end;


  if (pos('.PFX',uppercase(cert))=0) and
     (pos('.P12',uppercase(cert))=0) then exit;


  cargaCertificado(data, cert, pass);
end;

y yo, en delphi 12 yo la utilizo asi:

Código Delphi [-]
procedure TEventosWebNode.WebNodeBeforePost(const HTTPReqResp: THTTPReqResp;
  Client: THTTPClient );
  //Data: Pointer);
var
  pStore: HCERTSTORE;
  pCert: PCERT_CONTEXT;
  DataBlob: CRYPT_BIT_BLOB;
  PFX: TBytes;
  pass,cert:string;
  puntero: pointer;
begin
  pass    :=  inicio.passwordCertificado;
  cert    :=  inicio.nombreCertificado;

  puntero :=  HTTPReqResp.ClientCertificate;// GetHTTPReqResp;
  if (pos('.PFX',uppercase(cert))=0) and
     (pos('.P12',uppercase(cert))=0) then exit;

  cargaCertificado(puntero, cert, pass);
end;

luego , la función cargacertificado aplico este codigo:
Código Delphi [-]
procedure cargaCertificado( Data:Pointer ; cert,pass:string);
var
  pStore: HCERTSTORE;
  pCert, currentcert: PCERT_CONTEXT;
  //DataBlob: CRYPT_BIT_BLOB;
  DataBlob:  CRYPT_DATA_BLOB;
  PFX: TBytes;
  certname:string;
begin
  pStore := nil;
  pCert := nil;

  PFX := TFile.ReadAllBytes( cert );
  try
    DataBlob.cbData := Length(PFX);
    DataBlob.pbData := @PFX[0];

    // Almacen temporal con el contenido del PFX
    pStore := PFXImportCertStore(DataBlob, PWideChar(Pass), PKCS12_INCLUDE_EXTENDED_PROPERTIES or CRYPT_MACHINE_KEYSET );
    CheckError(pStore);

    // Buscar un certificado con clave privada
    // Solo debería haber uno
    pCert := CertFindCertificateInStore(pStore,
                                        X509_ASN_ENCODING,
                                        0,
                                        CERT_FIND_HAS_PRIVATE_KEY, //CERT_FIND_ANY,
                                        nil,
                                        nil);
    CheckError(pCert);

    // Pasarlo al servicio
    InternetSetOption(Data, INTERNET_OPTION_CLIENT_CERT_CONTEXT, pCert, SizeOf(CERT_CONTEXT));
    finally
    if Assigned(pCert) then
       CertFreeCertificateContext(pCert);

    if Assigned(pStore) then
      CertCloseStore(pStore, 0);
  end;

end;

Un saludo ...
Responder Con Cita
  #4  
Antiguo 10-07-2025
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 19.503
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Si me envías un privado con los cambios o con el fuente de la versión 12, podemos subirlo o ver cómo podemos publicarlo en el FTP, para otros usuarios.
El usuario [seccion_31] me envía un privado con un "weetransfer" o similar, si lo quieres hacer así o subirlo a otro sitio, también va bien.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #5  
Antiguo 10-07-2025
Galahad Galahad is offline
Miembro
 
Registrado: abr 2007
Posts: 266
Poder: 20
Galahad Va por buen camino
Cita:
Empezado por Neftali [Germán.Estévez] Ver Mensaje
Si me envías un privado con los cambios o con el fuente de la versión 12, podemos subirlo o ver cómo podemos publicarlo en el FTP, para otros usuarios.
El usuario [seccion_31] me envía un privado con un "weetransfer" o similar, si lo quieres hacer así o subirlo a otro sitio, también va bien.
oK, Gracias Netfali.
He cogido de ese código solamente las dos funciones que en principio me hacen falta para el servicio,,, no todo el proyecto.
Intentaré cuando tenga un rato documentarlas un poco y enviarla como me comentas.
Un saludo y gracias..
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Verifactu o por requerimiento (no-verifactu) ¿decisión del usuario? Maska10 Temas legales 2 07-12-2024 13:34:47
Depurar aplicacion en modo servicio jlrbotella API de Windows 7 17-07-2015 23:43:29
Problemas con Proftp modo pasivo hexxa Linux 0 06-06-2008 19:49:10
problemas al integrar una aplicación dentro de otra aranel Varios 1 23-10-2005 02:40:00


La franja horaria es GMT +2. Ahora son las 04:42:27.


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