Bueno como me aconsejo el amigo Delphius, quiero mostrarles el diseño de mi aplicacion y que me aconsejen..
Situacion: es un sistema de facturacion electronica para argentina. el primer web service que debe ser invocado es el de autorizacion y autenticacion (WSAA).
1- el mismo devuelve un sign y token. al invocarlo se especifica el servicio para el cual se pide el ticket de acceso, es decir la autorizacion: busqueda en el padron(wspn10), factura elecronica(wsfev1) de exportacion(wsfex).
2- el mismo puede ser reutilizado..de hecho el server de la afip devuelve un error en caso de solicitar autorizacion para un servicio que no ha expirado.
entonces yo pense colocar una unidad con una clase login (nombre que se me ocurrio, no definitivo).
para lo mismo use la clase thttprio en tiempo de ejecucion(osea no arrastre un componente) y la interfaz ixmldocument..para cargar y leer nodos xml. y el xml data binding.
IMPORTANTE: me habia olvidado de postear el codigo openssl que se debe ejecutar:
ShellExecute(0,'open',PWideChar(rutabat),nil, nil,0);
y en rutabat: c:\OpenSSL-Win32\bin\openssl.exe smime -sign -signer C:\OpenSSL-Win32\bin\certificado.crt -inkey C:\OpenSSL-Win32\bin\caruso12021991.key -out D:\TPV\Win32\Debug\LoginTicketRequest.xml.cms -in D:\TPV\Win32\Debug\LoginTicketRequest.xml -outform PEM -nodetach
Atributos:
-servicio:nombre del servicio al que se desea acceder. string
-token y sign: 2 string que se setean luego de ejecutar el proceso de obtencion de los mismos(llamo al ws y evaluo el xml resultante)
-expiration: es la hora a la que expira.
implementacion:
crear un objeto login y pasarle al constructor el servicio como parametro.
login:=TLogin.Loguearse('wsfe'); xml1:=NewXMLDocument; xml1:=login.guardarXML(); xml2:=NewXMLDocument; cms:=login.generarCMS(xml1); xml2:=login.respuestaXML(cms); sign:=login.obtenersign(xml2); ShowMessage(sign);
PROBLEMA:
1- como diseñar el acceso a cualquier servicio.Tener en cuenta que lo unico que cambia es el nombre del servicio que se coloca en el xml que es enviado a la AFIP..osea es un solo atributo string..el proceso es el mismo.
2-reutilizar la autorizacion generada cuando se trate de un mismo servicio siempre que la hora actual sea anterior a la hora de expiracion del ultimo certificado generado.
POSIBLE SOLUCION PROPIA:
utilizar el paron factory methos para crear el tipo de login(para lo mismo crear clases que hereden: loginwsfe,loginwsfex).
utilizar el patron singleton..para que, mientras se corre la aplicacion exista una y solo una instancia de cada clase concreta de login.. Para lo mismo login y sus clases hijas tendrian un metodo renovar.. que lo solicita de vuelta. cuando se cierra la aplicacion se destruyen todos los objetos.
Muchas gracias..