Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Internet
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Colaboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-01-2025
Toñico Toñico is offline
Miembro
 
Registrado: ene 2005
Posts: 56
Poder: 22
Toñico Va por buen camino
LROE Bizcaia - Indy HTTP

Hola a todos.

Antes que nada pido disculpas si cometo algún error ya que es mi primer mensaje en este foro.

Necesito vuestra ayuda porque estoy bloqueado.

Estoy intentando enviar a Bizcaia un fichero LROE 240 y para ello estoy utilizando Delphi 10.3 Rio y los componentes Indy HTTP y TIdSSLIOHandlerSocketOpenSSL.

El fichero que estoy enviando es un gzip que contiene el xml según la documentación.

El código que estoy usando es el siguiente:

Código:
Código Delphi [-]
        AHttp                       := TIdHTTP.Create(nil);
        IdSSLIOHandlerSocketOpenSSL := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
        try
                try
                        IdSSLIOHandlerSocketOpenSSL.SSLOptions.SSLVersions := [sslvTLSv1_2];
                        IdSSLIOHandlerSocketOpenSSL.SSLOptions.CertFile    := FBaiConfiguration.restServer.certificateFile;
                        IdSSLIOHandlerSocketOpenSSL.SSLOptions.KeyFile     := FBaiConfiguration.restServer.certificateFile;
                        IdSSLIOHandlerSocketOpenSSL.OnGetPassword          := GetPasswordEvent;

                        AHttp.IOHandler              := IdSSLIOHandlerSocketOpenSSL;
                        AHttp.ConnectTimeout         := 5000;
                        AHttp.Request.CustomHeaders.Clear;
                        AHttp.Request.CustomHeaders.AddValue('Accept-Encoding',             'gzip');
                        AHttp.Request.CustomHeaders.AddValue('Content-Encoding',            'gzip');
                        AHttp.Request.CustomHeaders.AddValue('Content-Type',                'octet-stream');
                        AHttp.Request.CustomHeaders.AddValue('Content-Length',              IntToStr(RecoverFileSize(TPath.Combine(FWorkFilePath, Format('LROE_240_1_1_%s.gz',[documentData.document_sid])))));
                        AHttp.Request.CustomHeaders.AddValue('eus-bizkaia-n3-version',      '1.0');
                        AHttp.Request.CustomHeaders.AddValue('eus-bizkaia-n3-content-type', 'application/xml');
                        AHttp.Request.CustomHeaders.AddValue('eus-bizkaia-n3-data',         ComposeJSONBizcaiaData); // El Json está construido según la documentación

                        Try
                                requestBody  := TFileStream.Create(TPath.Combine(FWorkFilePath, Format('LROE_240_1_1_%s.gz',[documentData.document_sid])), fmOpenRead);
                                try
                                        try
                                                responseBody := AHttp.Post(FBaiConfiguration.restServer.urlInsertDocument, requestBody);

                                                if AHttp.ResponseCode = 200 then
                                                Begin
              // Si fuera bien, leería la respuesta
                                                        Result := True;
                                                End;
                                        except
                                                on e: EIdHTTPProtocolException do
                                                begin
                                                        Result := False;
                                                        errorMessage := 'Error: Uploading document failed. ' + IntToStr(AHttp.ResponseCode) + ' - ' + AHttp.response.ResponseText;
                                                end;
                                        end;
                                finally
                                        requestBody.Free;
                                end;
                        Except
                                on e: EIdHTTPProtocolException do
                                begin
                                        Result := False;
                                        errorMessage := 'Error: Uploading document failed. ' + IntToStr(AHttp.ResponseCode) + ' - ' + AHttp.response.ResponseText;
                                end;
                        End;

                except
                        on E: Exception do
                        begin
                                Result := False;
                                errorMessage := 'Error: Uploading document TicketBAI failed.';
                        end;
                end;
        finally
                FreeAndNil(AHttp);
                FreeAndNil(IdSSLIOHandlerSocketOpenSSL);
        end;

Me devuelve siempre error 400 - Bad request

Las cabeceras que le paso creo que están bien. Las vuelco a un fichero para ver que envío y muestra lo siguiente:

Accept-Encoding: gzip
Content-Encoding: gzip
Content-Type: octet-stream
Content-Length: 8532
eus-bizkaia-n3-version: 1.0
eus-bizkaia-n3-content-type: application/xml
eus-bizkaia-n3-data: {"con":"LROE","apa":"1.1","inte":{"nif":"A99800005","nrs":"SOFTWARE GARANTE TICKETBAI PRUEBA"},"drs":{"mode":"240","ejer":"2025"}}

Alguien me puede explicar donde está el problema o algún trozo de código que me pueda ayudar.

Muchas gracias a todos.
Responder Con Cita
  #2  
Antiguo 13-01-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.441
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
Cita:
Empezado por Toñico Ver Mensaje
Estoy intentando enviar a Bizcaia un fichero LROE 240 y para ello estoy utilizando Delphi 10.3 Rio y los componentes Indy HTTP y TIdSSLIOHandlerSocketOpenSSL.

Hola y bienvenido a los foros.
Antes de continuar con tu respuesta, te comentaría que hicieras la prueba con los componentes REST que vienen con Delphi "se serie". Digamos que son más modernos, más sencillos de usar y son los recomendados por Embarcadero (dría que en la versión que tienes ya están disponibles).

De todas formas, tienes bastantes códigos disponibles indexados en el mensaje #2 de este hilo.


Aquí tienes códigos usando los componentes REST:
https://www.clubdelphi.com/foros/sho...&postcount=406

Y aquí algunos con las Indy:
https://www.clubdelphi.com/foros/sho...&postcount=946
https://www.clubdelphi.com/foros/sho...postcount=2300
https://www.clubdelphi.com/foros/sho...postcount=1811
__________________
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
  #3  
Antiguo 13-01-2025
Avatar de YellowStone
YellowStone YellowStone is offline
Miembro
 
Registrado: feb 2007
Ubicación: Adeje
Posts: 169
Poder: 20
YellowStone Va por buen camino
Cita:
Empezado por Toñico Ver Mensaje
Hola a todos.

Antes que nada pido disculpas si cometo algún error ya que es mi primer mensaje en este foro.

Necesito vuestra ayuda porque estoy bloqueado.

Estoy intentando enviar a Bizcaia un fichero LROE 240 y para ello estoy utilizando Delphi 10.3 Rio y los componentes Indy HTTP y TIdSSLIOHandlerSocketOpenSSL.

El fichero que estoy enviando es un gzip que contiene el xml según la documentación.

Esta es mi forma de hacerlo con INDY pero en Delphi 2007, tampoco creo que varié mucho.

"cuerpo" es el cuerpo del envío, previamente convertido ya a GZIP.
"data" son los datos de la empresa a pasar en JSON.
"datosCertificado" no es más que un "record" con los datos que necesito del certificado.

Observa que no envío "content-length" en la cabecera, lo quité porque si lo mandaba, daba error.

Espero que te sirva para encontrar el problema.





Código:
function IndyPostBatuz(cuerpo: TMemoryStream; data: string; datosCertificado: TDatosCertificado): IXMLDocument;
var IdHTTP: TIdHTTP;
    LHandler: TIdSSLIOHandlerSocketOpenSSL;
    rGetCertificado: TGetCertificado;
    sRespuesta, slXML: TStringList;
    msRespuesta: TMemoryStream;
    sXML, sTipo, sCodigo, sMensaje: string;
begin
  rGetCertificado := TGetCertificado.Create;
  IdHTTP := TIdHTTP.Create(nil);
  result := TXMLDocument.Create(nil);
  try
    // Configuramos la cabecera específica para Bizkaia
    IdHTTP.Request.CustomHeaders.AddValue('Accept-Encoding', 'gzip');
    IdHTTP.Request.CustomHeaders.AddValue('Content-Encoding', 'gzip');
    //IdHTTP.Request.CustomHeaders.AddValue('Content-Length', IntToStr(cuerpo.Size)); // Finalmente, este dato no es necesario mandarlo, aparte de que si lo mandamos, da error
    IdHTTP.Request.CustomHeaders.AddValue('Content-Type', 'application/octet-stream');
    IdHTTP.Request.CustomHeaders.AddValue('eus-bizkaia-n3-version', '1.0');
    IdHTTP.Request.CustomHeaders.AddValue('eus-bizkaia-n3-content-type', 'application/xml');
    IdHTTP.Request.CustomHeaders.AddValue('eus-bizkaia-n3-data', data);
    LHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
    try
      LHandler.sslOptions.Method := sslvTLSv1_2;
      LHandler.sslOptions.SSLVersions := [sslvTLSv1_2];
      LHandler.SSLOptions.CertFile := rDatosCertificado.RutaCertificado; // Certificado de dispositivo a usar
      LHandler.SSLOptions.KeyFile := rDatosCertificado.RutaCertificado;  // Certificado de dispositivo a usar (el mismo que cerfile)
      LHandler.OnGetPassword := rGetCertificado.hServidorGetPassword;    // Cuando se solicite la clave, el evento se encarga de aportarla
      IdHTTP.IOHandler := LHandler;
      sRespuesta := TStringList.Create;    // La respuesta la recogemos en un stringlist;

      msRespuesta := TMemoryStream.Create; // Stream que va a recoger el contenido en gzip. Desgraciadamente, Indy no tiene un Post en el que tanto petición como respuesta puedan ser Stream.

      try
        sRespuesta.Append(IdHTTP.Post(xrTicketbai.URL, cuerpo, IndyTextEncoding_UTF8)); // Enviamos la petición y la recogemos en un StringList;
      except
        on E:Exception do
          begin
            ShowMessage(E.message);
          end;
      end;

      sTipo := idHTTP.Response.RawHeaders.Values['eus-bizkaia-n3-tipo-respuesta']; // Tipo de Respuesta. Si todo ha ido bien, es "Correcto"
      sCodigo := idHTTP.Response.RawHeaders.Values['eus-bizkaia-n3-codigo-respuesta']; // Si sTipo no es "Correcto" entonce viene el código de error
      sMensaje := idHTTP.Response.RawHeaders.Values['eus-bizkaia-n3-mensaje-respuesta']; // y el mensaje de error correspondiente
      sIdentificativoBatuz := idHTTP.Response.RawHeaders.Values['eus-bizkaia-n3-identificativo']; // Aquí recogemos el identificativo, que viene en la cabecera de la respuesta

      if sCodigo <> '' then
        begin
          ShowMessage('Tipo de respuesta: '+sTipo+#13#10+
                      'Codigo de respuesta: '+sCodigo+#13#10+
                      'Mensaje de respuesta: '+sMensaje);
        end;

      sRespuesta.SaveToStream(msRespuesta);  // Grabamos la respuesta en un Stream de memoria.

      if msRespuesta.Size > 0 then
        begin
          msRespuesta.Position := 0;   // Importante posicionarse en 0, para que se pueda descomprimir correctamente
          sXML := gZipToxmlModeloStream(msRespuesta);  // Descomprimimos el stream de la respuesta en un string

          try
            result.Active := False;
            result.XML.Clear;
            result.XML.Text := LimpiaRespuesta(sXML);  // Pasamos el string de la respuesta a un txmldocument
          finally
            FreeAndNil(msRespuesta);
          end;
        end;
    finally
      LHandler.Free;
    end;
  finally
    IdHTTP.Disconnect;
    IdHTTP.Free;
  end;
end;
Responder Con Cita
  #4  
Antiguo 13-01-2025
Toñico Toñico is offline
Miembro
 
Registrado: ene 2005
Posts: 56
Poder: 22
Toñico Va por buen camino
Muchísimas gracias YellowStone

Ahora si que me funciona. Me devuelve un error que puedo leer:

eus-bizkaia-n3-identificativo: 113248123
eus-bizkaia-n3-mensaje-respuesta: No se encuentra el certificado del dispositivo dentro del censo de certificados de dispositivo de la DFB. El número de serie del certificado de dispositivo utilizado es: 616ac435f1f8d99862d144d96f27ce32
eus-bizkaia-n3-codigo-respuesta: N3_0000016
eus-bizkaia-n3-numero-registro:
eus-bizkaia-n3-tipo-respuesta: Incorrecto

Estoy usando el certificado suministrado por ellos, así que les preguntaré.

Una vez mas, muchísimas gracias.
Responder Con Cita
Respuesta



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
SII -Nuevo sistema de la Agencia Tributaria española de envío de datos vía Webservice newtron Internet 3716 19-01-2026 20:01:34
Como utilizar la ayuda del nuevo Sistema Operativo gluglu Humor 3 24-09-2007 09:39:05
Aplicacion Agencia De Viajes ArdiIIa Varios 9 20-01-2007 16:49:53
El Vasco Aguirre Al González La Taberna 5 26-05-2006 09:22:28
Microsoft ha lanzado su nuevo sistema operativo DarkByte Humor 0 25-01-2004 09:21:14


La franja horaria es GMT +2. Ahora son las 00:53:29.


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