Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   TICKET BAI (TicketBAI); Nuevo sistema de la Agencia Tributaria del Pais Vasco (https://www.clubdelphi.com/foros/showthread.php?t=94264)

elcharlie 05-11-2020 09:26:20

Cita:

Empezado por juramisa (Mensaje 538967)
¿Serías tan amable de mandarme ese procedimiento en la versión Rio?. Viéndolo, parece que es un problema al cargar la lista de los certificados presentes en el ordenador.
¿Tal vez hay una orden previa para la carga de los certificados y que yo no la esté realizando?
Gracias.

Te lo envío, pero sigo creyendo que éste no es el problema, el problema lo tienes en otra parte.

Código Delphi [-]
procedure TWinHTTPClient.DoGetClientCertificates(const ARequest: THTTPRequest;
  const ACertificateList: TList);
var
  LRequest: TWinHTTPRequest;
  LStore: HCERTSTORE;
  LIssuerList: PSecPkgContext_IssuerListInfoEx;
  LClientCert: PCCERT_CONTEXT;
  LSearchCriteria: CERT_CHAIN_FIND_BY_ISSUER_PARA;
  LIssuerListSize: DWORD;
  LPrevChainContext, LClientCertChain: PCCERT_CHAIN_CONTEXT;

  procedure AddToCertificateList(const AClientCert: PCCERT_CONTEXT);
  var
    LCertificate: TCertificate;
  begin
    CertDuplicateCertificateContext(AClientCert); // Need to be released (CertFreeCertificateContext)
    CryptCertToTCertificate(AClientCert, LCertificate);
    FCertificateList.Add(LCertificate);
    FWinCertList.Add(AClientCert);
  end;
begin
  inherited;

  if FWinCertList.Count = 0 then
  begin
    LRequest := TWinHTTPRequest(ARequest);

    LIssuerList := nil;
    LIssuerListSize := SizeOf(LIssuerList);
    LStore := TWinHttpLib.GetCertStore;

    if WinHttpQueryOption(LRequest.FWRequest, WINHTTP_OPTION_CLIENT_CERT_ISSUER_LIST, LIssuerList, LIssuerListSize) and (LIssuerList <> nil) then
    begin
      FillChar(LSearchCriteria, SizeOf(LSearchCriteria), 0);
      LSearchCriteria.cbSize := SizeOf(LSearchCriteria);
      LSearchCriteria.cIssuer := LIssuerList.cIssuers;
      LSearchCriteria.rgIssuer := LIssuerList.aIssuers;

      if LStore <> nil then
      begin
        LPrevChainContext := nil;
        while True do
        begin
          LClientCertChain := CertFindChainInStore(LStore, X509_ASN_ENCODING,
            CERT_CHAIN_FIND_BY_ISSUER_CACHE_ONLY_URL_FLAG or CERT_CHAIN_FIND_BY_ISSUER_CACHE_ONLY_FLAG,
            CERT_CHAIN_FIND_BY_ISSUER, @LSearchCriteria, LPrevChainContext);

          if LClientCertChain <> nil then
          begin
            LPrevChainContext := LClientCertChain;
            LClientCert := LClientCertChain.rgpChain^.rgpElement^.pCertContext;
            AddToCertificateList(LClientCert);
          end else
            Break;
        end;
      end;
      GlobalFree(HGLOBAL(LIssuerList));
    end else
    begin
      if LStore <> nil then
      begin
        LClientCert := nil;
        while True do
        begin
          LClientCert := CertFindCertificateInStore(LStore,
            X509_ASN_ENCODING or PKCS_7_ASN_ENCODING,
            0, CERT_FIND_ANY, nil, LClientCert);
          if LClientCert <> nil then
            AddToCertificateList(LClientCert)
          else
            Break;
        end;
      end;
    end;
  end;
  ACertificateList.Clear;
  ACertificateList.AddRange(FCertificateList);
end;

juramisa 05-11-2020 09:31:29

Hola

Por el error si pasa

Código Delphi [-]
procedure TfrmEnve140CTB.NetHTTPClient1RequestError(const Sender: TObject;
  const AError: string);
begin
  ShowMessage(Aerror);
end;

por el evento
Código Delphi [-]
procedure TfrmEnve140CTB.NetHTTPClient1NeedClientCertificate(const Sender: TObject; const ARequest: TURLRequest; const ACertificateList: TCertificateList; var AnIndex: Integer);
var
  i: Integer;
begin
  AnIndex := 0;
no llega, ambos tienen una parada. Da el error comentado anteriormente y termina.
gracias

keys 05-11-2020 09:39:57

¿ y que Contiene Aerror?.

juramisa 05-11-2020 09:45:08

Hola

He visto esta nota en 'http://docwiki.embarcadero.com/RADStudio/Sydney/en/Using_an_HTTP_Client'

Nota: Si el método HTTP de la primera solicitud a un servidor que requiere un certificado del lado del cliente no es HEAD o GET (por ejemplo, POST), el código de estado de la respuesta del servidor es 413. Siempre envíe una solicitud HEAD o GET primero. Usar una solicitud HEAD suele ser una mejor opción, ya que se transfieren menos datos.

y lo he probado a realizar lo siguiente
Código Delphi [-]
      NetHTTPRequest1.MethodString := 'HEAD';
      NetHTTPClient1.Head(la_url_pruebas, nil).ContentStream;
pero da lo mismo.

juramisa 05-11-2020 09:46:32

keys

Aerror = Access violation at address 00B19045 in module 'BATUZ.exe'. Read of address 00000004

keys 05-11-2020 10:56:12

Yo creo que el problema es de delphi seattle.

Si el error da en ese punto es que tu programa no a podido negociar la conexión con el servidor de hacienda, es decir el protocolo que estan utilizando es diferente. Nosotros cuando empezamos las pruebas nos ocurria algo parecido al hacer los envíos y tampoco llegaba al evento OnNeedClientCertificate, pero si nos mostraba el error, que era distinto. Trabajabamos con el delphi Tokio 10.2.0, es decir la primera que sacaron.

Mirando por internet encontramos lo siguiente https://edn.embarcadero.com/print/44770 es decir que la versión que teniamos no estaba preparada para TLS 1.2 que es lo que recomienda hacienda. Tambien puedes seguir el siguiente enlace https://blog.marcocantu.com/blog/201...ents-1022.html que tambien habla de ello. Actualizamos a delphi 10.2.2 y funciono todo correcto.

Yo lo que te recomiendo es que mires si lo puedes probar en un delphi mas actualizado.

Por otra parte hacienda ha publicado esto.

"Se recomienda hacer uso de protocolos de comunicación seguros con el servicio de entradas, con versiones TLS 1.2 o superiores."

Aunque ahora mismo tienen habilitado el 1.0 y el 1.1, pero me comentaron que puede que luego solo dejen el 1.2 o superior. Para indicarle al componente TNEtHttpClient que trabaje con la verisión del protocolo que nosotros queremos es
Código Delphi [-]
Componente.SecureProtocols := [THTTPSecureProtocol.TLS12];

Esta propiedad solo esta disponible a partir de la version 10.2.2(Tokio) de delphi.

Un Saludo.

juramisa 05-11-2020 11:48:15

Buenos días

keys, está claro que es la versión. Por lo que deduzco, y dime si me equivoco, que si lo intento con otros componentes de la misma versión de Delphi, me ocurriría lo mismo.
Voy a echar un vistazo a TsbxHTTPClient, de 'SecureBlackbox 2020'. De todas formas si alguien trabaja con otros componentes, y que le funcione la comunicación, por favor, hacérmelo saber, para ir por ese camino.

Muchas gracias de nuevo.

keys 05-11-2020 11:56:03

Si no puedes cambiar la versión de delphi prueba con otros componentes de terceros. No se si con alguno de los otros de delphi funcionará. Los de secureblackbox yo los utilizo para otras cosas, no para enviar y funcionan bien. Si tienes la version 2020 me imagino que estaran adaptados a todos los protocolos.

Un Saludo y suerte.

juramisa 08-11-2020 13:15:01

Entorno pruebas TicketBai
 
Buenos días

Perdonar mi torpeza. Estoy intentando realizar pruebas de envío LROE, en esta ocasión con Delphi 10.4 Sydney, (Trial) con el siguiente código:

Código Delphi [-]
    // Fichero a enviar 'D:\...\Modelos 140-240\temp\CTB-0001-2020-11-08 12-41-50-ALENVIO.xml.gz'
    if FileExists(DMBatu.CDSEnvc.FieldByName('EN050').AsString + '.gz') then 
    begin
      NetHTTPClient1.SecureProtocols := [THTTPSecureProtocol.TLS12];
      // Cargo la cabecera de la petición

      NetHTTPRequest1.CustomHeaders['Accept-Encoding'] := el_accept_Encoding;   // 'gzip'
      NetHTTPRequest1.CustomHeaders['Content-Encoding'] := el_Content_Encoding; // 'gzip'
      NetHTTPRequest1.CustomHeaders['Content-Length'] := IntToStr(tamanoFichero(DMBatu.CDSEnvc.FieldByName('EN050').AsString + '.gz'));
      NetHTTPRequest1.CustomHeaders['Content-Type'] := el_Content_Type;   // 'application/octet-stream'
      NetHTTPRequest1.CustomHeaders['eus-bizkaia-n3-version'] := el_eus_bizkaia_n3_version;  // '1.0'
      NetHTTPRequest1.CustomHeaders['eus-bizkaia-n3-content-type'] := el_eus_bizkaia_n3_content_type;  // 'application/xml'
      el_eus_bizkaia_n3_data := f_cabecera_LROE(el_concepto, el_subcapitulo, DMBatu.CDSPres.FieldByName('PR020').AsString, DMBatu.CDSPres.FieldByName('PR040').AsString,
                                                                         DMBatu.CDSPres.FieldByName('PR090').AsString, DMBatu.CDSPres.FieldByName('PR100').AsString, DMBatu.CDSPres.FieldByName('PR080').AsString, 
                                                                         IntToStr(ejercicio_presentacion.Value));
      //   '{"con": "LROE", "apa": "1.1", "inte": {"nif": "14XXXXXXA","nrs": "MXXXXXX","ap1": "SXXXXXX","ap2": "JXXXXXXXX"},"drs": {"mode": "140","ejer": "2020"}}'
      NetHTTPRequest1.CustomHeaders['eus-bizkaia-n3-data'] := el_eus_bizkaia_n3_data;

     S := TStringList.Create;
     M := TMemoryStream.Create;

      NetHTTPRequest1.MethodString := 'POST';
      case rg_Entorno.ItemIndex of
        0: begin
            NetHTTPRequest1.Post(la_url_pruebas, // https://pruesarrerak.bizkaia.eus/N3B4000M/aurkezpena
                                 DMBatu.CDSEnvc.FieldByName('EN050').AsString + '.gz',  // Fichero a enviar 'D:\...\Modelos 140-240\temp\CTB-0001-2020-11-08 12-41-50-ALENVIO.xml.gz'
                                 M);
            M.Position := 0;
            S.LoadFromStream(M);
            Memo1.Lines.AddStrings(S);
           end;
        .............
      end;

Pues bien, el certificado me lo pide, como es de ciudadano, me solicita la clave, se la doy y tras un breve tiempo, me da el siguiente error:
'Error sending data: (12030) La conexión con el servidor finalizó anormalmente'


Si alguien que utilice este método, puede corregirme, qué estoy haciendo mal, agradecido.

Muchas gracias a todos

keys 09-11-2020 09:15:29

Yo creo que el problema esta en como envías el fichero. Te pongo como lo hago yo

Código Delphi [-]
var
 json : string;
 RequestBody: TFileStream;
 AResponse: IHTTPResponse;
begin
 RequestBody := TFileStream.Create(FicheroComprimido, fmOpenRead);

 EnvioBizkaia.SecureProtocols := [THTTPSecureProtocol.TLS12];
 EnvioBizkaia.CustomHeaders['Accept-Encoding'] := 'gzip';
 EnvioBizkaia.CustomHeaders['Content-Encoding'] := 'gzip';
 EnvioBizkaia.CustomHeaders['Content-Type'] := 'application/octet-stream';

 EnvioBizkaia.CustomHeaders['eus-bizkaia-n3-version'] := '1.0';
 EnvioBizkaia.CustomHeaders['eus-bizkaia-n3-content-type'] := 'application/xml';

//Formamos los parametros json de entrada
 json := '{"con": "LROE","apa": "1.1","inte": {"nif": "'+ Factura.DatosAsesoria.CIF +'",';

 if PersonaFisica  then
    json := json + '"nrs": "' + NombreP + '","ap1": "' + Apellido1P + '","ap2": "'+ Apellido2P +'"},'
 else
    json := json + '"nrs": "' + Nombre + '","ap1": "","ap2": ""},';

 json := json + '"drs":{"mode": "' + Modelo + '","ejer": "2020"}}';

 EnvioBizkaia.CustomHeaders['eus-bizkaia-n3-data'] := json;
 AResponse := EnvioBizkaia.Post('https://pruesarrerak.bizkaia.eus/N3B4000M/aurkezpena',RequestBody);
end;

Espero que te sirva. Un Saludo

elcharlie 09-11-2020 10:30:11

Cita:

Empezado por juramisa (Mensaje 539008)
Buenos días

Pues bien, el certificado me lo pide, como es de ciudadano, me solicita la clave, se la doy y tras un breve tiempo, me da el siguiente error:
'Error sending data: (12030) La conexión con el servidor finalizó anormalmente'


Si alguien que utilice este método, puede corregirme, qué estoy haciendo mal, agradecido.

Muchas gracias a todos

A mi me hace lo mismo, si seguidamente, lo vuelves a enviar, ya no te pide que valides la clave y lo envía. Debe de ser algo de la configuración del timeout de su servidor de pruebas, digo yo..

juramisa 09-11-2020 11:06:23

Entorno pruebas TicketBai
 
Tienes razón, la segunda vez lo admite. Muchas gracias, ya no sabía que cambiar. La única diferencia que tenía con keys era:

Código Delphi [-]
     NetHTTPClient1.CustomHeaders['Content-Length'] := IntToStr(tamanoFichero(FicheroComprimido));

Que han introducido en una última versión.

Gracias

juramisa 09-11-2020 18:43:50

Cita:

Empezado por elcharlie (Mensaje 539019)
A mi me hace lo mismo, si seguidamente, lo vuelves a enviar, ya no te pide que valides la clave y lo envía. Debe de ser algo de la configuración del timeout de su servidor de pruebas, digo yo..

Si lo reintento como dices, no me funciona, me había equivocado, al controlar el error me da un

Código Delphi [-]
Error
Server error 408: Request Timeout

Si encuentras la solución ya me dirás. Yo seguiré también haciendo pruebas.

keys 10-11-2020 08:19:00

Si os sirve de algo a mi me funciona correctamente. Eso si los certificados no necesitan clave son de la FNMT.

Un Saludo.

elcharlie 10-11-2020 10:52:18

Cita:

Empezado por juramisa (Mensaje 539025)
Si lo reintento como dices, no me funciona, me había equivocado, al controlar el error me da un

Código Delphi [-]
Error
Server error 408: Request Timeout

Si encuentras la solución ya me dirás. Yo seguiré también haciendo pruebas.

A mi me funciona bien con el certificado de sello de empresa, eso si, la primera vez, me pide la clave y como tienes que esperar a que te salga la ventana del pin, lo pones, bla bla blau, me da el error
Código:

[Error sending data: (12030) La conexión con el servidor finalizó anormalmente
Pero de seguido lo vuelvo a intentar y sin problemas, ya te digo, que supongo, que será problemas de ajustes de tiemouts de su servidor de pruebas, pero tampoco puedo estar seguro.
Eso si con un certificado que no pida pin, a la primera.

juramisa 10-11-2020 10:58:05

Hola

Con el certificado de FNMT, efectivamente va mejor, aún así, desde hace un momento me sale

HTTP/1.1 500 Internal Server Error:

Esto es problema de que algo estoy mandando yo mal, o es problema sólo del servidor. Parece tan ambiguo el error 500.

elcharlie 10-11-2020 11:06:24

Cita:

Empezado por juramisa (Mensaje 539030)
Hola

Con el certificado de FNMT, efectivamente va mejor, aún así, desde hace un momento me sale

HTTP/1.1 500 Internal Server Error:

Esto es problema de que algo estoy mandando yo mal, o es problema sólo del servidor. Parece tan ambiguo el error 500.

Te pongo como lo envío yo, por si te sirve:
Código Delphi [-]
    HttpClient.SecureProtocols := [THTTPSecureProtocol.TLS12];

    HttpClient.ContentType := 'application/octet-stream';
    HttpClient.AcceptCharSet := 'utf-8';

    HttpClient.CustomHeaders['Accept-Encoding'] := 'gzip';
    HttpClient.CustomHeaders['Content-Encoding'] := 'gzip';

    HttpClient.CustomHeaders['eus-bizkaia-n3-version'] := '1.0';
    HttpClient.CustomHeaders['eus-bizkaia-n3-content-type'] := 'application/xml';
    HttpClient.CustomHeaders['eus-bizkaia-n3-data'] := JsonData;

   Response := HttpRequest.Post('https://pruesarrerak.bizkaia.eus/N3B4000M/aurkezpena', FicheroGZip);

elcharlie 10-11-2020 11:16:19

Tambien podrias intentar analizar que te responden desde el servidor haciendo esto:

Código Delphi [-]
var
ResponseStreamString: TStringStream;

Rsponse := HttpRequest.Post('https://pruesarrerak.bizkaia.eus/N3B4000M/aurkezpena', FicheroGZip, ResponseStreamString,nil);

if Response.StatusCode  <> 200 then
      ShowMessage(ResponseStreamString.DataString);

Espero ayudarte.

juramisa 10-11-2020 12:03:44

Hola

Por favor alguien puede hacer una prueba de envío ahora. Me da la sensación de que es el servicio de pruebas el que no funciona. La programación es idéntica a la vuestra, es más he optado por copiar y pregar y comentar lo mío y sigue dando error 500.

Gracias.

elcharlie 10-11-2020 12:09:06

Cita:

Empezado por juramisa (Mensaje 539033)
Hola

Por favor alguien puede hacer una prueba de envío ahora. Me da la sensación de que es el servicio de pruebas el que no funciona. La programación es idéntica a la vuestra, es más he optado por copiar y pregar y comentar lo mío y sigue dando error 500.

Gracias.

Probado a las 12:08 y sin problemas

keys 10-11-2020 12:31:46

Acabo de hacer un envío y funciona bien.

¿Estas rellenado el campo número de dispositivo? Yo envíe una factura sin rellenar ese campo y tambien me daba error. Luego hablando con ellos me han dicho que lo tienen que solucionar que es un problema de ellos.

Tambien puede ser algo de fichero que estas intentando enviar.

Un Saludo.

elcharlie 10-11-2020 12:40:29

Yo les enviaría un email a los de de Lantik con el fichero que intentas enviar, para que te lo validen manualmente, y asi ir descartando cosas.

juramisa 10-11-2020 13:03:35

Es lo que he hecho, les he mandado el fichero, tiene que ser algo de las validaciones. Yo pensaba que en el fichero de respuesta vendrían los errores.
El ticketbai va como sigue:

- <Software>
<LicenciaTBAI>TBAIPRUEBA</LicenciaTBAI>
- <EntidadDesarrolladora>
<NIF>14xxxxxxxx</NIF>
</EntidadDesarrolladora>
<Nombre>FACT01</Nombre>
<Version>1.0.0.0</Version>
</Software>
El número de dispositivo no era ya obligatorio. De todas formas esperemos que me contestan. Ya os contaré.

Me entran dudas del GZip, si lo hago adecuadamente, que herramienta usaís?. A ver si es un problema del fichero enviado.

Gracias

elcharlie 10-11-2020 13:09:41

Cita:

Empezado por juramisa (Mensaje 539038)
Es lo que he hecho, les he mandado el fichero, tiene que ser algo de las validaciones. Yo pensaba que en el fichero de respuesta vendrían los errores.
El ticketbai va como sigue:

- <Software>
<LicenciaTBAI>TBAIPRUEBA</LicenciaTBAI>
- <EntidadDesarrolladora>
<NIF>14xxxxxxxx</NIF>
</EntidadDesarrolladora>
<Nombre>FACT01</Nombre>
<Version>1.0.0.0</Version>
</Software>
El número de dispositivo no era ya obligatorio. De todas formas esperemos que me contestan. Ya os contaré.

Me entran dudas del GZip, si lo hago adecuadamente, que herramienta usaís?. A ver si es un problema del fichero enviado.

Gracias


yo uso la ZLib
http://docwiki.embarcadero.com/CodeE...press_(Delphi))

keys 10-11-2020 13:10:18

Cita:

Empezado por juramisa (Mensaje 539038)
Es lo que he hecho, les he mandado el fichero, tiene que ser algo de las validaciones. Yo pensaba que en el fichero de respuesta vendrían los errores.
El ticketbai va como sigue:

- <Software>
<LicenciaTBAI>TBAIPRUEBA</LicenciaTBAI>
- <EntidadDesarrolladora>
<NIF>14xxxxxxxx</NIF>
</EntidadDesarrolladora>
<Nombre>FACT01</Nombre>
<Version>1.0.0.0</Version>
</Software>
El número de dispositivo no era ya obligatorio. De todas formas esperemos que me contestan. Ya os contaré.

Me entran dudas del GZip, si lo hago adecuadamente, que herramienta usaís?. A ver si es un problema del fichero enviado.

Gracias

El numero de dispositivo no es obligatorio, pero su sistema esta dando error si lo envías sin rellenar y además el error no lo retorna en el fichero de respuesta, sino que n o retorna nada.

Yo los comprimo conun componente de los secureblackbox TsbxArchiveWriter.

Un Saludo.

juramisa 10-11-2020 13:32:59

Vale me han respondido lo siguiente

Hemos revisado el fichero que nos han adjuntado y hemos visto que en la codificación del TicketBAI en Base64 le sobran los primeros caracteres que indico con fondo amarillo:

<TicketBai>77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPFQ6VGlja2V0QmFpIHht

Muevo el fichero a "https://www.base64encode.org/" por ejemplo y me da lo mismo. Teneís alguna explicación a esto?.

juramisa 11-11-2020 08:01:55

Buenos días,

Ayer lo sospechaba, y hoy me lo han confirmado.

Hemos visto que el fichero xml, que está dentro del fichero gz que nos han enviado, tiene la codificación UTF-8 con BOM cuando debería ser UTF-8:


Y claro esos caracteres iniciales al convertir el TicketBai a base64 son por lo mismo. ¿Vosotros como realizáis la grabación de los XML en UTF-8 solamente? sin BOM.

Gracias

juramisa 11-11-2020 10:12:07

Buenos días

Ya está todo solucionado, hasta la siguiente.

Si alguien más tiene el mismo problema os cuento como lo he solucionado. Rebuscando por internet he encontrado este código.

Código Delphi [-]
interface

  procedure SaveAsUTF8(const Fichero: string; Data: TStrings);

type
  TUTF8NoBOMEncoding = class(TUTF8Encoding)
  public
    function GetPreamble: TBytes; override;
  end;

implementation

function TUTF8NoBOMEncoding.GetPreamble: TBytes;
begin
  SetLength(Result, 0);
end;

  procedure SaveAsUTF8(const Fichero: string; Data: TStrings);
  var
    fs: TFileStream;
    vStreamWriter: TStreamWriter;
    Enc : TUTF8NoBOMEncoding;
  begin
    fs := TFileStream.Create(Fichero, fmCreate);
    try
      Enc := TUTF8NoBOMEncoding.Create;
//      vStreamWriter := TStreamWriter.Create(fs, TEncoding.UTF8);
      vStreamWriter := TStreamWriter.Create(fs, Enc);
      try
        vStreamWriter.Write(Data.Text);
      finally
        vStreamWriter.Free;
      end;
    finally
      fs.free;
      Enc.Free;
    end;

  end;

En el caso del TicketBai tras la firma lo vuelvo a cargar, y lo vuelvo a guardar.

Código Delphi [-]
      result := LoadXMLDocument(mi_fichero);
   // result: IXMLDocument

      SaveAsUTF8(mi_fichero, result.XML);

En el caso del LROE lo guardo antes de generar el GZip.

Código Delphi [-]
      
      SaveAsUTF8(mi_fichero, result.XML);

Resultado, envío correcto.

Muchas gracias a todos por vuestra ayuda.

juramisa 11-11-2020 14:32:48

Alternativa NetHttpClient
 
Buenos días

Os presento una alternativa a NetHttpClient, quien tiene los componentes de SecureBlackBox 2020 DE.

Código Delphi [-]
var
  CertificateStorage: TsbxCertificateStorage;
  cert : TsbxCertificate;
  otros_parametros : string;
  encontrado : Boolean;
  Cuerpo_Mensaje : TFileStream;

  Entry: TSBxArchivedFile;



procedure....
      // Fichero LROE  GZip
      Cuerpo_Mensaje := TFileStream.Create(FicheroComprimido, fmOpenRead);
      // Cargar mensaje json
      el_eus_bizkaia_n3_data := f_cabecera_LROE(el_concepto, el_subcapitulo, DMBatu.CDSPres.FieldByName('PR020').AsString, 
                          DMBatu.CDSPres.FieldByName('PR040').AsString, DMBatu.CDSPres.FieldByName('PR090').AsString, 
                          DMBatu.CDSPres.FieldByName('PR100').AsString, DMBatu.CDSPres.FieldByName('PR080').AsString, IntToStr(ejercicio_presentacion.Value));
      // Selección del cerificado
      sbxHTTPClient1.TLSSettings.AutoValidateCertificates :=   True;
      CertificateStorage := TsbxCertificateStorage.Create(nil);
      if CertificateStorage.Opened then
         CertificateStorage.Close(True);
      CertificateStorage.Open('system://currentuser@localhost/?store=MY');
      encontrado := False;
      sbxHTTPClient1.ClientChain.Clear;
      for i := 0 to CertificateStorage.Certificates.Count - 1 do
      begin
        cert := CertificateStorage.Certificates[i];
        if bintostr(Cert.SerialNumber) = mi_certificadoID.Caption then
        begin
          sbxHTTPClient1.ClientChain.Add(cert);
          encontrado := True;
        end;
      end;
      if not encontrado then
      begin
        Application.MessageBox('Firma no encontrada',
          'Proceso de firma', MB_OK + MB_ICONWARNING
          + MB_DEFBUTTON2);
        Exit;
      end;
      // Carga parámetros cabecera   
      sbxHTTPClient1.RequestParameters.ContentType       := el_Content_Type;
      otros_parametros := 'Accept-Encoding: '             + el_accept_Encoding              + #13#10
                        + 'Content-Encoding: '            + el_Content_Encoding             + #13#10
                        + 'eus-bizkaia-n3-version: '      + el_eus_bizkaia_n3_version       + #13#10
                        + 'eus-bizkaia-n3-content-type: ' + el_eus_bizkaia_n3_content_type  + #13#10
                        + 'eus-bizkaia-n3-data: '         + el_eus_bizkaia_n3_data                  ;
      sbxHTTPClient1.RequestParameters.CustomHeaders := otros_parametros;
      // HTTP
      case rg_Entorno.ItemIndex of
        0: sbxHTTPClient1.PostStream(la_url_pruebas, Cuerpo_Mensaje);
        1: sbxHTTPClient1.PostStream(la_url, Cuerpo_Mensaje);
      end;
      // sbxHTTPClient1.OutputBytes nos devuelve el cuerpo respuesta
      // Guardo el fichero GZIP
      FicheroRespuesta := DMBatu.CDSEnvc.FieldByName('EN070').AsString +'.gz';
      GuardarRespuesta(FicheroRespuesta,sbxHTTPClient1.OutputBytes);
      // Descomprimo el fichero GZIP
      if sbxArchiveReader1.Opened then
         sbxArchiveReader1.Close;

      sbxArchiveReader1.Open(Integer(aftGzip), FicheroRespuesta);

      for i := 0 to sbxArchiveReader1.Files.Count - 1 do
      begin
        Entry := sbxArchiveReader1.Files[i];
        sbxArchiveReader1.Extract(Entry.Path, ExtractFilePath(DMBatu.CDSEnvc.FieldByName('EN070').AsString), false);
        Application.ProcessMessages;
        RenameFile(ExtractFilePath(DMBatu.CDSEnvc.FieldByName('EN070').AsString) + Entry.Path, DMBatu.CDSEnvc.FieldByName('EN070').AsString);
        Application.ProcessMessages;
      end;
      // Tratamiento de la respuesta
      XMLDocument1 := TXMLDocument.Create(nil);

      XMLDocument1.Active := False;
      XMLDocument1.XML.Clear;
      XMLDocument1.LoadFromFile(DMBatu.CDSEnvc.FieldByName('EN070').AsString);

      XMLDocument1.Active := True;
.......

      procedure GuardarRespuesta(const Fichero: String; Respuesta: TBytes);
      var
        stream: TBytesStream;
      begin
        stream := TBytesStream.Create(Respuesta);
        try
          stream.SaveToFile(Fichero);
        finally
          stream.Free;
        end;
      end;

elcharlie 12-11-2020 08:12:30

Cita:

Empezado por juramisa (Mensaje 539053)
Buenos días

Os presento una alternativa a NetHttpClient, quien tiene los componentes de SecureBlackBox 2020 DE.

Gracias por el aporte.
Un pregunta, de esta manera, ¿ya no te da el mensaje de "Error sending data: (12030) La conexión con el servidor finalizó anormalmente"?
Es por curiosidad...
Un saludo.

keys 12-11-2020 08:52:13

Hola a todos. No se si os pasa a vosotros, pero el fichero de respuesta lo tengo que descomprimir dos veces.

Un Saludo.

juramisa 12-11-2020 09:13:03

Contestando a elcharlie, con el certificado que pide clave, sí, la primera vez me da errores. De todas formas lo estoy probando ahora, y el fichero me viene que no es un gzip.

Contestando a keys, descomprimiendo con SecureBlackBox, me ha ido a la primera. Salvo ahora, que parece que yo he tocado algo o el servidor me devuelve mal el cuerpo del mensaje.

Os seguiré informando.

Saludos

elcharlie 12-11-2020 09:13:59

Cita:

Empezado por keys (Mensaje 539055)
Hola a todos. No se si os pasa a vosotros, pero el fichero de respuesta lo tengo que descomprimir dos veces.

Un Saludo.

Si si, me pasa lo mismo.

Cita:

Empezado por juramisa (Mensaje 539056)
Contestando a elcharlie, con el certificado que pide clave, sí, la primera vez me da errores. De todas formas lo estoy probando ahora, y el fichero me viene que no es un gzip.

Contestando a keys, descomprimiendo con SecureBlackBox, me ha ido a la primera. Salvo ahora, que parece que yo he tocado algo o el servidor me devuelve mal el cuerpo del mensaje.

Os seguiré informando.

Saludos

Gracias por la info

juramisa 12-11-2020 09:58:57

Cita:

Empezado por keys (Mensaje 539055)
Hola a todos. No se si os pasa a vosotros, pero el fichero de respuesta lo tengo que descomprimir dos veces.

Un Saludo.

Se te ha solucionado, ahora parece que va bien el servicio.

De todas formar prueba con lo siguiente si quieres, el código completo está en un mensaje anterior.

Código Delphi [-]
       if sbxArchiveReader1.Opened then
         sbxArchiveReader1.Close;

        sbxArchiveReader1.Open(Integer(aftGzip), FicheroRespuesta);

      // Sólo hay un fichero
      for i := 0 to sbxArchiveReader1.Files.Count - 1 do
      begin
        Entry := sbxArchiveReader1.Files[i];
        sbxArchiveReader1.Extract(Entry.Path, ExtractFilePath(el_fichero_a_recibir), false);
        Application.ProcessMessages;
        RenameFile(ExtractFilePath(el_fichero_a_recibir) + Entry.Path, el_fichero_a_recibir);
        Application.ProcessMessages;
      end;

keys 12-11-2020 10:08:54

Gracias.

El problema lo tengo solucionado, lo descomprimo dos veces y punto.

Yo creo que le problema es del componente TnetHttpClient que es con el que estoy haciendo el envío.

La descompresión ya la estaba haciendo mas o menos como tu pones, pero la tengo que hacer dos veces y si la hago manualmente desde el windows tambien la tengo que hacer dos veces.

Un Saludo.

keys 12-11-2020 15:07:03

Hola a todos.

Una curiosidad que igual os sirve de algo. He preguntado a hacienda por la calidad de los datos en TBAI, es decir si los cifs/nifs tienen que estar bien puestos, asi como los datos de los clientes de las facturas. Ya que ahora el sistema acepta todo siempre que esten bien formados. Es decir puedo poner mi dni con el nombre y los apellidos de otro.

y esta es la respuesta.

"La validación contra el censo de contribuyentes se realizará en un futuro, pero destacar que el declarante tiene la obligación de consignar correctamente los datos de las personas declaradas. Dicho incumplimiento es sancionable según el artículo 204 de la Norma Foral General Tributaria del Territorio Histórico de Bizkaia."

Un Salujdo.

elcharlie 12-11-2020 15:30:33

Cita:

Empezado por keys (Mensaje 539065)
Hola a todos.

Una curiosidad que igual os sirve de algo. He preguntado a hacienda por la calidad de los datos en TBAI, es decir si los cifs/nifs tienen que estar bien puestos, asi como los datos de los clientes de las facturas. Ya que ahora el sistema acepta todo siempre que esten bien formados. Es decir puedo poner mi dni con el nombre y los apellidos de otro.

y esta es la respuesta.

"La validación contra el censo de contribuyentes se realizará en un futuro, pero destacar que el declarante tiene la obligación de consignar correctamente los datos de las personas declaradas. Dicho incumplimiento es sancionable según el artículo 204 de la Norma Foral General Tributaria del Territorio Histórico de Bizkaia."

Un Salujdo.

Yo para esas comprobaciones, desde que entró el SII, utilizo este webService https://www2.agenciatributaria.gob.e...ws/VNifV2.wsdl de la agencia tributaria, que funciona muy bien. Os de dejo el pas del servicio por si os interesa.

Un saludo.

keys 13-11-2020 08:40:36

Hola.

Nosotros tambien lo estamos usando. Tambien hay otro sevicio web para comprobar los documentos intracomunitarios VIES. Pero este no lo hemos conseguido hacer funcfionar https://ec.europa.eu/taxation_custom...formation.html.

Cargamos el wsdl y luego a la hora de llamarlo nos dice que el servicio no esta disponible.Si lo intentamos desde el explorador tambien nos pasa lo mismo. No se si es que no esta realmente disponible o que lo estamos haciendo mal.

Alguien ha conseguido llamar a este webservice.

Un Saludo.

elcharlie 13-11-2020 09:10:30

Cita:

Empezado por keys (Mensaje 539076)
Hola.

Nosotros tambien lo estamos usando. Tambien hay otro sevicio web para comprobar los documentos intracomunitarios VIES. Pero este no lo hemos conseguido hacer funcfionar https://ec.europa.eu/taxation_custom...formation.html.

Cargamos el wsdl y luego a la hora de llamarlo nos dice que el servicio no esta disponible.Si lo intentamos desde el explorador tambien nos pasa lo mismo. No se si es que no esta realmente disponible o que lo estamos haciendo mal.

Alguien ha conseguido llamar a este webservice.

Un Saludo.

Yo lo probé hace tiempo y estaba funcionando bien, pero creo recordar, que había problemas con los CIFS de algunos paises. No te creas que es una maravilla.
EDITO: Ahora si que dá el mensaje de "SERVICE_UNAVAILABLE", estarán de mantenimiento...

larax 19-11-2020 19:41:13

Hola buenas tardes

Estoy teniendo problemas a la hora de firmar (nunca he firmado nada hasta ahora y estoy un poco pez)

A la hora de intentar firmar el xml, estoy teniendo este error con el signtool: "Signtool error: No certificates were found that met all in the given criteria"

Es necesario una firma de por ejemplo de ksoftware.

Con una firma de ellos no tendría este problema?

Muchas gracias


La franja horaria es GMT +2. Ahora son las 05:44:10.

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