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 23-04-2023
CyberManolo CyberManolo is offline
Miembro
 
Registrado: oct 2018
Posts: 24
Poder: 0
CyberManolo Va por buen camino
Llamada a autofirma para que firme una factura electrónica

Buenas tardes:

Tenía programado un sistema de generación de facturas electrónicas que funciona correctamente, pero ahora estoy intentando que una vez generado el xml pueda firmarse con auto firma. Para ello uso ShellExecute de ShellAPI. De esta forma:

Código Delphi [-]
ShellExecute(0, 'open',PChar('C:\Program Files\Autofirma\AutoFirma\autofirma.exe') , nil , nil, SW_SHOW);

Se me abre correctamente el programa, pero el usuario tiene que buscar el fichero a firmar. Lo que quiero es pasarle como parámetro el fichero a firmar, pero no lo consigo. En teoría debiera ser así, según el manual técnico de Autofirma:

Código Delphi [-]
ShellExecute(0, 'open', PChar('C:\Program Files\Autofirma\AutoFirma\autofirma.exe') , Pchar(' -i c:\facturas\factura1.xml') , nil, SW_SHOW);

Pero si le paso la ruta del fichero a firmar como parámetro, el programa Autofierma no se arranca.

¿Alguien me puede arrojar luz sobre el asunto? Muchas gracias.

Última edición por Neftali [Germán.Estévez] fecha: 24-04-2023 a las 08:45:31. Razón: Añadir TAG's al código Delphi
Responder Con Cita
  #2  
Antiguo 24-04-2023
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.806
Poder: 22
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Prueba con
...AutoFirma\AutoFirma.exe" sign -gui ...

De todos modos, en la instalación de Autofirma, existe el fichero
AutoFirmaCommandLine.exe
Ese es el que utilizo yo desde un bat que genero con todos los parámetros que necesito:
Código Delphi [-]
"sign.bat" = 

'"' + cPath + 'AutoFirma\AutoFirmaCommandLine.exe" sign ' +
// opcionalmente ' -gui ' +
'-i "' + DameTempPath + 'ToSign.xml' + '" ' +
'-o "' + DameTempPath + 'ToSign.xsig' + '" ' +
'-store windows -filter "subject.contains:' + PChar(cCert) + '" ' +
'-format facturae > "' + DameTempPath + 'sign_result.txt"';
Responder Con Cita
  #3  
Antiguo 24-04-2023
manelb manelb is offline
Miembro
 
Registrado: mar 2017
Posts: 297
Poder: 10
manelb Va por buen camino
Buenos días...

Este es el bat que nosotros utilizamos.
Ahora no tengo a mano cada uno de los parámetros, pero con la documentación supongo que no tendrás problema en descifrarlo.

De todas formas, si tienes algún problema, más tarde puedo detallar cada uno de ellos.

Código:
"c:\AutoFirma\AutoFirma\AutoFirmaCommandLine.exe" sign -i %1 -o %2 -store windows -alias %3 -format facturae -config signatureProductionCity=%4\nsignatureProductionProvince=%5\nsignatureProductionPostalCode=%6\nsignatureProductionCountry=%7
Saludos
Responder Con Cita
  #4  
Antiguo 24-04-2023
CyberManolo CyberManolo is offline
Miembro
 
Registrado: oct 2018
Posts: 24
Poder: 0
CyberManolo Va por buen camino
¿EL bat se lanza con ShellExecute?

Gracias a ambos.

Imagino que el bat lo lanzais con ShellExecute pasando desde ahí los parámetros que necesita dicho bat? (fichero a firmar, fichero firmado, certificado....)
Responder Con Cita
  #5  
Antiguo 24-04-2023
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.806
Poder: 22
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Yo creo el fichero ToSign.xml, que es la factura a firmar.
Luego creo el bat como te muestro en el mensaje anterior con todo rellenado.
Este bat ejecuta AutorimaCommandLine.exe redirigido a un fichero llamado sign_result.txt.
Código:
"C:\...\AutoFirma\AutoFirmaCommandLine.exe" -i "C:\...\ToSign.xml" -o "C:\...\ToSign.xsig" -store windows -filter "subject.contains: EMPRESA SL" -format facturae > "C:\...\sign_result.txt"
Ejecuto el bat con un procedimiento que espera a que termine para evitar leer antes de tiempo:
Código Delphi [-]
function RunAndWait(Handle: THandle; Ejecutable, Argumentos: string; const RunDirectory: PChar = nil; const Visibilidad: integer = SW_SHOWNORMAL; MensajeSiCorrecto: boolean = True): DWORD;
var
  Info : TShellExecuteInfo;
  pInfo : PShellExecuteInfo;
  ExitCode : word;
  P : PChar;
begin
  { Puntero a Info }
  { Pointer to Info }
  pInfo := @Info;
  { Rellenamos Info }
  { Fill info }
  with Info do
  begin
     cbSize := SizeOf(Info);
     fMask := SEE_MASK_NOCLOSEPROCESS;
     wnd := Handle;
     lpVerb := nil;
     lpFile := PChar(Ejecutable);
     { Parametros al ejecutable }
     { Executable parameters }
     lpParameters := PChar(Argumentos + #0);
     if RunDirectory = '' then
        lpDirectory := nil
     else
        lpDirectory := PChar(RunDirectory + #0);
     nShow := Visibilidad;
     hInstApp := 0;
  end;
  { Ejecutamos }
  { Execute }
  if not ShellExecuteEx(pInfo) then
  begin
     Result := GetLastError;
     if FormatMessage(Format_Message_Allocate_Buffer + Format_Message_From_System,
        nil,
        Result,
        0, @P,
        0,
        nil) <> 0 then
     begin
        // Display the string.
        ShowMessage(P);
        // Free the buffer.
        LocalFree(integer(P));
     end;
  end
  else
     Result := 0; // Info.hInstApp;

  { Esperamos que termine }
  { Wait to finish }
  repeat
     ExitCode := WaitForSingleObject(Info.hProcess, 500);
     Application.ProcessMessages;
  until (ExitCode <> WAIT_TIMEOUT);
  ExitCode := GetLastError;

  GetExitCodeProcess(Info.hProcess, Result);
  if ((Result < 32) and (ExitCode = 0)) then
  begin
     ExitCode := GetLastError;
     if FormatMessage(Format_Message_Allocate_Buffer + Format_Message_From_System,
        nil,
        ExitCode,
        0, @P,
        0,
        nil) <> 0 then
     begin
        // Display the string.
        if MensajeSiCorrecto or (ExitCode <> 0) then
           ShowMessage(P);
        // Free the buffer.
        LocalFree(integer(P));
     end;
  end
  else
     Result := 0; // Info.hInstApp;
end;

Finalmente miro si el fichero sign_result.txt tiene el texto "La operacion ha terminado corectamente"
Código Delphi [-]
if ((SysUtils.FileExists(DameTempPath + 'sign_result.txt')) and (Pos('ha terminado correctamente', MemoRead(DameTempPath + 'sign_result.txt')) > 0)) then

Si es así guardo el fichero ToSign.xsig con un nombre acorde (Pro ejemplo: Factura_A-123.xsig) en la carpera de ficheros firmados para seguir con el resto de procesos.
Responder Con Cita
  #6  
Antiguo 26-04-2023
CyberManolo CyberManolo is offline
Miembro
 
Registrado: oct 2018
Posts: 24
Poder: 0
CyberManolo Va por buen camino
Gracias Duilio

Muchas gracias Duilio. Ahora lo he entendido: construyes el bat desde Delphi y luego lo lanzas.
Yo intentaba ejecutar la aplicación con ShellExecute, que tiene un parámetro para pasar, a su vez, los valores de los parámetros de la aplicación que se está llamando.
Un saludo desde Córdoba.
Responder Con Cita
  #7  
Antiguo 07-06-2023
ermendalenda ermendalenda is offline
Miembro
 
Registrado: ago 2021
Posts: 2.761
Poder: 7
ermendalenda Va por buen camino
webinar Factura Electrónica

https://www.youtube.com/watch?v=t-FahVwUHAU
Responder Con Cita
  #8  
Antiguo 07-06-2023
ermendalenda ermendalenda is offline
Miembro
 
Registrado: ago 2021
Posts: 2.761
Poder: 7
ermendalenda Va por buen camino
En 1 Semana otro Borrador
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
Facturas Electronicas Argentina Chaja Varios 3 10-07-2015 19:15:05
Agregar Adendas a Facturas electronicas mexico reypcs Varios 0 20-01-2011 16:26:10
Tabla de Facturas vs Detalles de Facturas magnu9 Conexión con bases de datos 9 27-07-2007 17:27:37
Comunicaciones electronicas EDI Toni Conexión con bases de datos 0 18-04-2006 13:06:34
Campos calculados, facturas y detalles de facturas. Letty Conexión con bases de datos 7 07-11-2003 11:19:44


La franja horaria es GMT +2. Ahora son las 21:17:42.


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