Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Internet
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Colaboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 30-05-2017
Avatar de mrobles
mrobles mrobles is offline
Miembro
NULL
 
Registrado: may 2017
Posts: 115
Poder: 10
mrobles Va por buen camino
Cita:
Empezado por joefrommalaka Ver Mensaje
Buenas tardes,

Estoy con un problema que no consigo encontrar la solución, a ver si alguien pudiese echarme una mano.
Cuando envío más de 20 facturas emitidas (me pasa lo mismo con las recibidas) recibo el siguiente error:

Se requiere un certificado para completar la autenticación de cliente - URL:https://www7.aeat.es/wlpl/SSII-FACT/...iiFactFEV1SOAP - SOAPAction:""

Si esas mismas facturas las envío en dos veces, me las envía sin problema.


Para realizar el envío, genero el xml con delphi 7 y realizo el envío mediante una dll que he creado con Delphi XE7.


El código mediante el cual hago el envío es el siguiente:


Código:
type
  TComunicacionSW = class(TObject)
    private
      FArchivoEnvio: String;
      FArchivoRespuesta: String;
      FHTTPRIO: THTTPRIO;
      procedure HTTPRIOBeforeExecute(const MethodName: string; SOAPRequest: TStream);
      procedure HTTPRIOAfterExecute(const MethodName: string; SOAPResponse: TStream);
    public
      Constructor Create;
      Destructor Destroy;
  end;


procedure TComunicacionSW.HTTPRIOBeforeExecute(const MethodName: string; SOAPRequest: TStream);
var
  v_fileStream: TFileStream;
begin
  SOAPRequest.Size := 0;
  v_fileStream := TFileStream.Create(FArchivoEnvio, fmOpenRead);
  SOAPRequest.Position := 0;
  SOAPRequest.CopyFrom(v_fileStream, v_fileStream.Size);
  v_fileStream.Free;
  SOAPRequest.Position := 0;
end;

procedure TComunicacionSW.HTTPRIOAfterExecute(const MethodName: string; SOAPResponse: TStream);
var
  v_fileStream: TFileStream;
begin
  if FileExists(FArchivoRespuesta) then
    DeleteFile(FArchivoRespuesta);
  v_fileStream := TFileStream.Create(FArchivoRespuesta, fmCreate);
  SOAPResponse.Position := 0;
  v_fileStream.CopyFrom(SOAPResponse, SOAPResponse.size);
  v_fileStream.Free;
  SOAPResponse.Position := 0;
end;

function ObtenerNumeroSerieCertificado(p_nombreCertificado: String): string;
var
  hStore: HCERTSTORE;
  PrevContext, CurContext: PCERT_CONTEXT;
  cbSize: DWORD;
  v_nombre: String;
begin
  Result := '';
  hStore := CertOpenSystemStore(0, PChar('MY'));
  if hStore <> nil then
  begin
    PrevContext := nil;
    CurContext := CertEnumCertificatesInStore(hStore, PrevContext);
    while CurContext <> nil do begin
      v_nombre := '';
      cbSize := CertGetNameString(CurContext, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0, nil, nil, 0);
      if cbSize > 0 then
      begin
        SetLength(v_nombre, cbSize-1);
        CertGetNameString(CurContext, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0, nil, PChar(v_nombre), cbSize);
        if SameText(p_nombreCertificado, v_nombre) then
        begin
          result := GetCertSerialNumber(@CurContext^.pCertInfo^.SerialNumber);
          break;
        end;
      end;
      PrevContext := CurContext;
      CurContext  := CertEnumCertificatesInStore(hStore, PrevContext);
    end;
  end;
end;

function EnviarFacturasEmitidas(p_nombreCertificado, p_archivoEnvio, p_archivoRespuesta: ShortString): PChar;stdcall;export;
var
  v_suministroLRFacturasEmitidas: SuministroFactEmitidas.SuministroLRFacturasEmitidas;
  v_respuestaLRFacturasEmitidas: SuministroFactEmitidas.RespuestaLRFacturasEmitidas;
  v_siiSOAP: SuministroFactEmitidas.siiSOAP;
  v_serialNum: String;
  v_error: string;
  v_comunicacionSW: TComunicacionSW;
begin
  v_error := '';

  v_serialNum := ObtenerNumeroSerieCertificado(p_nombreCertificado);
  
  v_comunicacionSW := TComunicacionSW.Create;
  v_suministroLRFacturasEmitidas := SuministroFactEmitidas.SuministroLRFacturasEmitidas.Create;
  v_respuestaLRFacturasEmitidas := SuministroFactEmitidas.RespuestaLRFacturasEmitidas.Create;
  try
    try
      v_comunicacionSW.FArchivoEnvio := p_archivoEnvio;
      v_comunicacionSW.FArchivoRespuesta := p_archivoRespuesta;
      v_comunicacionSW.FHTTPRIO.HTTPWebNode.ClientCertificate.SerialNum := v_serialNum;

      //Se realiza la llamada sin datos y en el evento HTTPRIOBeforeExecute se establece el xml con los datos generados anteriormente
      v_siiSOAP := SuministroFactEmitidas.GetsiiSOAP(true,'',v_comunicacionSW.FHTTPRIO);
      v_respuestaLRFacturasEmitidas := v_siiSOAP.SuministroLRFacturasEmitidas(v_suministroLRFacturasEmitidas);
    except
      on e:Exception do
        v_error := 'Error DLL: Error en la comunicación con el servicio web.' + e.Message;
    end;
  finally
    v_suministroLRFacturasEmitidas.Free;
    v_respuestaLRFacturasEmitidas.Free;
  end;

  result := StringToPChar(v_error);
end;


El archivo SuministroFactEmitidas lo he generado automáticamente con WSDL Importer de delphi y le he modificado lo siguiente (defURL realmente no lo utilizo):

const
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/wlpl/SSII-FACT/ws/fe/SiiFactFEV1SOAP';
defSvc = 'siiService';
defPrt = 'SuministroFactEmitidasPruebas';


¿Se le ocurre a alguien que es lo que estoy haciendo mal?

Un saludo
Ahora mismo andan un poco pasando de la comprobación de certificados, pero creo que a partir de 10 si que falla si no es un certificado valido (o mal insertado).
Yo ando en PHP y logro mandar bloques de 100 sin problema alguno
Responder Con Cita
  #2  
Antiguo 30-05-2017
joefrommalaka joefrommalaka is offline
Miembro
NULL
 
Registrado: mar 2017
Posts: 10
Poder: 0
joefrommalaka Va por buen camino
Cita:
Empezado por mrobles Ver Mensaje
Ahora mismo andan un poco pasando de la comprobación de certificados, pero creo que a partir de 10 si que falla si no es un certificado valido (o mal insertado).
Yo ando en PHP y logro mandar bloques de 100 sin problema alguno
Muchas gracias por tú rápida respuesta. Para realizar el envío estoy utilizando un certificado válido, es el que ha estado utilizando mi cliente hasta ahora para todas sus operaciones con AEAT. Y la cosa es que enviando el archivo manualmente (desde la url https://www7.aeat.es/static_files/co...teWSAEAT2.html) si que se envía, pero utilizando el servicio wsdl no lo consigo.
Responder Con Cita
  #3  
Antiguo 30-05-2017
javipes javipes is offline
Miembro
 
Registrado: jul 2007
Posts: 25
Poder: 0
javipes Va por buen camino
buff! tengo un lío tremendo... si he conseguido generar el suministro de facturas emitidas, siguiendo lo que he visto en el hilo,
¿como puedo ver el contenido del xml ANTES de llamar a GetsiiSOAP(true,'',HTTPRIO1).SuministroLRFacturasEmitidas(ASumLRFacturasEmitidas); ?

seguro que es muy sencillo
Responder Con Cita
  #4  
Antiguo 30-05-2017
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 4.214
Poder: 24
newtron Va camino a la fama
Cita:
Empezado por javipes Ver Mensaje
buff! tengo un lío tremendo... si he conseguido generar el suministro de facturas emitidas, siguiendo lo que he visto en el hilo,
¿como puedo ver el contenido del xml ANTES de llamar a GetsiiSOAP(true,'',HTTPRIO1).SuministroLRFacturasEmitidas(ASumLRFacturasEmitidas); ?

seguro que es muy sencillo
Aunque esto está engordando demasiado y se hace complicado, revisa el hilo (de principio en adelante) y verás que esa pregunta ya está contestada aunque ahora mismo no recuerdo exactamente cómo era.

Saludos
__________________
Be water my friend.
Responder Con Cita
  #5  
Antiguo 31-05-2017
Galahad Galahad is offline
Miembro
 
Registrado: abr 2007
Posts: 266
Poder: 20
Galahad Va por buen camino
Cita:
Empezado por newtron Ver Mensaje
Aunque esto está engordando demasiado y se hace complicado, revisa el hilo (de principio en adelante) y verás que esa pregunta ya está contestada aunque ahora mismo no recuerdo exactamente cómo era.

Saludos
Hola, tienes que utilizar el/los eventos del componente httprio beforeexecute o afterexecute, te mando un ejemplo de código..



Cita:
procedure TFModelo_SII.HTTPRIO1BeforeExecute(const MethodName: string;
SOAPRequest: TStream);
var
ss:TFileStream;
cfichero: string;
begin
cfichero := montar_fichero_sii( date,time,'nombredefichero.xml');
if FileExists( cfichero ) then
DeleteFile( cfichero);

ss:=TFileStream.Create( cfichero, fmCreate);
SOAPRequest.Position := 0;
ss.CopyFrom(SOAPRequest, SOAPRequest.size);
ss.Free;
SOAPRequest.Position := 0;
end;

Responder Con Cita
  #6  
Antiguo 31-05-2017
brincola brincola is offline
Miembro
NULL
 
Registrado: feb 2011
Posts: 28
Poder: 0
brincola Va por buen camino
Cita:
Empezado por Galahad Ver Mensaje
Hola, tienes que utilizar el/los eventos del componente httprio beforeexecute o afterexecute, te mando un ejemplo de código..
Si cfichero existe, no es preciso borrarlo, ya que el parámetro fmCreate en ss:=TFileStream.Create( cfichero, fmCreate);'machaca' (rewrite) el fichero si existe.

¿Dónde está la implementación de montar_fichero_sii( date,time,'nombredefichero.xml')? Gracias.
Responder Con Cita
  #7  
Antiguo 30-05-2017
brincola brincola is offline
Miembro
NULL
 
Registrado: feb 2011
Posts: 28
Poder: 0
brincola Va por buen camino
Cita:
Empezado por javipes Ver Mensaje
buff! tengo un lío tremendo... si he conseguido generar el suministro de facturas emitidas, siguiendo lo que he visto en el hilo,
¿como puedo ver el contenido del xml ANTES de llamar a GetsiiSOAP(true,'',HTTPRIO1).SuministroLRFacturasEmitidas(ASumLRFacturasEmitidas); ?

seguro que es muy sencillo
Quítate 1300 (o sea, mira la entrada 53). Allí habla de introducir este evento:

procedure TForm1.HTTPRIO1BeforeExecute(const MethodName: string; SOAPRequest: TStream);
var
ss:TFileStream;
begin
SOAPRequest.Size:=0;
ss:=TFileStream.Create('C:\1.xml', fmOpenRead);
SOAPRequest.Position := 0;
SOAPRequest.CopyFrom( ss, ss.Size);
ss.Free;
SOAPRequest.Position := 0;
end;

No lo he probado aún, pero tiene sentido.
Responder Con Cita
  #8  
Antiguo 30-05-2017
CMB CMB is offline
Miembro
 
Registrado: ene 2017
Posts: 349
Poder: 10
CMB Va por buen camino
Más de 86.000 vistas

Y ya van más de 86.000 vistas!!! Y 1.363 respuestas.
Responder Con Cita
  #9  
Antiguo 30-05-2017
RubenMon RubenMon is offline
Registrado
NULL
 
Registrado: feb 2017
Posts: 3
Poder: 0
RubenMon Va por buen camino
Hola.

Un pequeño aporte.
Me he liado bastante para pasar de texto al indice de las enumeraciones de los XMLNS que genera Delphi. Por ejemplo para saber el índice del país a partir del código del país en texto.
He visto algunas soluciones en otras respuestas pero hacía falta declarar listas o arrays auxiliares.

Una pequeña función puede ayudar en estos casos:

Código:
function IndiceEnum(Info: PTypeInfo; const Name: string): Integer;
var
  InternalName: string;
begin
  InternalName := RemClassRegistry.GetInternalPropName(Info, Name);
  Result := GetEnumValue(Info, InternalName);
  if Result < 0 then
    raise Exception.CreateFmt('Valor %s no encontrado en enumeracion %s', [Name, Info^.Name]);
end;
y en el código se puede colocar

Código:
FacturaExpedida.Contraparte.IDOtro.CodigoPais := CountryType2(IndiceEnum(TypeInfo(CountryType2), Pais));
Donde "Pais" es una variable de tipo "string" que contiene el código del país ('FR', 'IT', etc);

La misma función se puede utilizar con otras enumeraciones que estén declaradas en los XLMNS.

Rubén.
Responder Con Cita
  #10  
Antiguo 31-05-2017
barnarasta barnarasta is offline
Miembro
NULL
 
Registrado: abr 2017
Posts: 20
Poder: 0
barnarasta Va por buen camino
Sobre el tema de los NIF censados o NO CENSADOS yo tengo un caso curioso:

IBRAHIMI EL BABANI RACHID 54677557W
El la busqueda por nif https://www1.agenciatributaria.gob.e...BUGC-JDIT/Cnec
da como correcto y al realizar el envio de EMITIDAS la rechaza como NO CENSADO.
Responder Con Cita
  #11  
Antiguo 31-05-2017
brincola brincola is offline
Miembro
NULL
 
Registrado: feb 2011
Posts: 28
Poder: 0
brincola Va por buen camino
Interesante, RubenMon.
Responder Con Cita
  #12  
Antiguo 30-05-2017
brincola brincola is offline
Miembro
NULL
 
Registrado: feb 2011
Posts: 28
Poder: 0
brincola Va por buen camino
Cita:
Empezado por brincola Ver Mensaje
Quítate 1300 (o sea, mira la entrada 53). Allí habla de introducir este evento:

procedure TForm1.HTTPRIO1BeforeExecute(const MethodName: string; SOAPRequest: TStream);
var
ss:TFileStream;
begin
SOAPRequest.Size:=0;
ss:=TFileStream.Create('C:\1.xml', fmOpenRead);
SOAPRequest.Position := 0;
SOAPRequest.CopyFrom( ss, ss.Size);
ss.Free;
SOAPRequest.Position := 0;
end;

No lo he probado aún, pero tiene sentido.
Ahora, ya probándolo, yo haría la siguiente corrección:

procedure TForm1.HTTPRIO1BeforeExecute(const MethodName: string; SOAPRequest: TStream);
var
ss:TFileStream;
begin
ss:=TFileStream.Create('C:\1.xml', fmOpenWrite);
SOAPRequest.Position := 0;
ss.CopyFrom(SOAPRequest,SOAPRequest.Size);
ss.Free;
SOAPRequest.Position := 0;
end;

Pero esto aún da un problema: no genera el fichero. Hay que crearlo previamente (copy con 1.xml y terminarlo con Ctrl Z si lo quieres vacío).


Los TFileStream son un poco tozudos a veces con los share y demás permisos (Read, Write, etc).
Con paciencia y un poco de tiempo acabar de perfilar para corregir este problema.
Responder Con Cita
  #13  
Antiguo 30-05-2017
brincola brincola is offline
Miembro
NULL
 
Registrado: feb 2011
Posts: 28
Poder: 0
brincola Va por buen camino
Cita:
Empezado por brincola Ver Mensaje
Ahora, ya probándolo, yo haría la siguiente corrección:

procedure TForm1.HTTPRIO1BeforeExecute(const MethodName: string; SOAPRequest: TStream);
var
ss:TFileStream;
begin
ss:=TFileStream.Create('C:\1.xml', fmCreate);
SOAPRequest.Position := 0;
ss.CopyFrom(SOAPRequest,SOAPRequest.Size);
ss.Free;
SOAPRequest.Position := 0;
end;

Pero esto aún da un problema: no genera el fichero. Hay que crearlo previamente (copy con 1.xml y terminarlo con Ctrl Z si lo quieres vacío).


Los TFileStream son un poco tozudos a veces con los share y demás permisos (Read, Write, etc).
Con paciencia y un poco de tiempo acabar de perfilar para corregir este problema.
Con esto como definitivo:

procedure TForm1.HTTPRIO1BeforeExecute(const MethodName: string; SOAPRequest: TStream);
var
ss:TFileStream;
begin
ss:=TFileStream.Create('C:\1.xml', fmCreate);
SOAPRequest.Position := 0;
ss.CopyFrom(SOAPRequest,SOAPRequest.Size);
ss.Free;
SOAPRequest.Position := 0;
end;

... ya vale.
Responder Con Cita
  #14  
Antiguo 02-06-2017
javipes javipes is offline
Miembro
 
Registrado: jul 2007
Posts: 25
Poder: 0
javipes Va por buen camino
Brincola. Muchas gracias.
Tambien al resto de foreros.
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
TICKET BAI (TicketBAI); Nuevo sistema de la Agencia Tributaria del Pais Vasco keys Internet 4524 Hace 4 Días 16:17:40
AEAT envio de datos vía Webservice problemas con WSDL CelsoO Internet 11 09-10-2019 20:03:41
webService Soap de la Administración Digital Española notific@ apicito Internet 3 31-01-2017 11:25:28
Error en Webservice funcion envio de sms webmasterplc Delphi para la web 5 25-07-2013 20:10:29
Problemas con envío de XML a un WebService davidvamo Internet 1 13-02-2007 15:49:20


La franja horaria es GMT +2. Ahora son las 20:26:39.


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