Hola amigos..este es mi primer proyecto de hacer una unidad con orientacion a objetos.
Se trata una unidad autenticacionAFIP.pas que contiene una clase login.
Esta clase haria todo el trabajo descripto en los requerimientos del WSAA(autenticacion) de AFIP, ya que no quiero usar librerias de terceros.. use codigo openssl y todo funciona correctamente (lo que pasa es que tengo que diagramar una unidad para que la pc lo haga sola)
El problema viene dado por el paso de parametros entre los siguiente metodos:
guardarxml: con XML Data Binding cargue el schema xsd correspondiente a enviar al afip. el mismo genera el mensaje del tra..para lo mismo toma una variable de tipo string que es el servicio para el que se requiere la autorización. Y devuelve un TXMLDocument.
ahora bien: como paso el TXMLDocument al metodo generarCMS. generarCMS toma el xmlrequest (que es un archivo xml que debe cumplir con el schema que mencione)y obtiene un string que es el certificado cms(son un monton de letras)..
obtuve el error
e2197 constant object cannot be passed as var parameter
buscando encontre esto:
http://docwiki.embar...ameter_(Delphi)
y falta mas ..el resto de los metodos:
el metodo respuestaxml envia el cms junto a la clave privada .key y el certificado .crt de la empresa(en este caso homologacion) a la afip y obtiene un TXMLDocument que contiene los nodos token y sign..estos son parametros para logearse en otros servicios..
Con respecto al constructor:
tomaria como atributo el servicio (ya que afip reqwuiere un ticket por cada servicio)
y luego tiene token y sign que son atributos que setearia en el cosntructor mismo llamando a obtenersign y obtener token.. estos metodos toman la respuesta xml y leen los nodos..
aqui la unidad:
unit UAutenticacionAFIP; interface uses XMLIntf, XMLDoc,shellAPI,dialogs,Classes,SOAPHTTPClient; type TLogin = class private Fservicio: string; Fsign: string; Ftoken: string; procedure Setservicio(const Value: string); procedure Setsign(const Value: string); procedure Settoken(const Value: string); public property token:string read Ftoken write Settoken; property sign:string read Fsign write Setsign; property servicio:string read Fservicio write Setservicio; constructor Loguearse(s:string); function guardarXML(var servicio:string):TXMLDocument; function armarsource:string; function generarCMS(var xml1:TXMLDocument):string; function respuestaXML(var s:string):TXMLDocument; function obtenertoken(respuestacms:TXMLDocument):string; function obtenersign(var xml2:TXMLDocument): string; end; implementation { TLogin } uses tra,IniFiles,SysUtils,Forms,DateUtils, LoginCms1, loginresponse; function TLogin.armarsource: string; var archivoini:TIniFile; source,o,serialNumber,C,cn:string; begin archivoini:=TIniFile.Create(ExtractFilePath(Application.ExeName)+ 'caja.ini'); o:=archivoini.ReadString('EMPRESA','O',''); serialNumber:=archivoini.ReadString('EMPRESA','CUIT',''); cn:=archivoini.ReadString('EMPRESA','cn',''); C:=archivoini.ReadString('EMPRESA','C',''); source:='C='+C+',o='+o+',serialNumber='+serialNumber+',cn='+cn; Result:=source; end; function TLogin.generarCMS(var xml1:TXMLDocument):string; var rutabat,textoCMS,linea:string; archivoCMS:TStringList; begin rutabat:=ExtractFilePath(Application.ExeName)+'certificado\'+'cms.bat'; ShellExecute(0,'open',PWideChar(rutabat),nil, nil,0); archivoCMS:=TStringList.Create; archivoCMS.LoadFromFile(xml1.FileName); textocms:=Copy(archivoCMS.Text,23,2714); result:=textoCMS; end; function TLogin.guardarXML(var servicio:string):TXMLDocument; var loginticketrequest:IXMLLoginTicketRequestType; loginheader:IXMLHeaderType; archivoini:TIniFile; diai,diaf,horai:string; XML1:TXMLDocument; begin //crear archivo xml XML1 := TXMLDocument.Create(nil); XML1.FileName:='loginticketrequest.xml'; loginticketrequest:=NewloginTicketRequest; //asginar valores para loginticketrequest.xml // version loginticketrequest.Version:='1.0'; //header // uniqueid son constantes loginticketrequest.header.UniqueId:=4325399; //hora del pedido.. es ahora diai:=FormatDateTime('yyyy-mm-dd',Now); diaf:=FormatDateTime('yyyy-mm-dd',IncHour(Now,23)); horai:=FormatDateTime('hh:mm:ss',IncMinute(now,-40)); loginticketrequest.header.GenerationTime:=diai+ 'T' + horai; //hora de finalizacion (1 dia es el maximo); loginticketrequest.header.ExpirationTime:=diaf+'T'+horai; //servicio a acceder loginticketrequest.Service:=servicio; XML1.XML.Add(loginticketrequest.XML); XML1.Active:=True; XML1.SaveToFile(ExtractFilePath(Application.ExeName) + 'loginticketrequest.xml'); Result:=XML1; end; constructor TLogin.Loguearse(s:string); var cms:string; xmlrequest,xmlresponse:TXMLDocument; begin Fservicio:=s; Fsign:=obtenersign(xmlresponse); // Ftoken:=obtenertoken(respuestaXML(generarCMS(guardarXML(servicio)))); end; function TLogin.obtenersign(var xml2:TXMLDocument): string; var sign:string; startnode:iXMLNode; nodohijo:IXMLNode; xml1:TXMLDocument; begin xml2:=xml1; xml1.FileName:=ExtractFilePath(Application.ExeName) + 'respuestaxml.xml'; xml1.Active:=True; xml1.LoadFromFile(ExtractFilePath(Application.ExeName) + 'respuestaxml.xml'); startNode := XML1.DocumentElement.ChildNodes[1]; nodohijo:=startnode.ChildNodes[1]; sign:=nodohijo.NodeValue; ShowMessage(sign); Result:=sign; end; function TLogin.obtenertoken(respuestacms:TXMLDocument): string; begin end; function TLogin.respuestaXML(var s:string):TXMLDocument; var RIOLogin:THTTPRIO; xml1:TXMLDocument; content,cms:string; begin RIOLogin:=THTTPRIO.Create(nil); with RIOLogin do begin WSDLLocation:='https://wsaahomo.afip.gov.ar/ws/services/LoginCms?wsdl'; Port:='LoginCms'; Service:='LoginCMSService'; end; cms:=s; xml1:=TXMLDocument.Create(nil); content:=(RIOLogin as LoginCms).loginCms(cms); xml1.XML.Text:=content; xml1.Active:=True; xml1.SaveToFile(ExtractFilePath(Application.ExeName) + 'respuestaxml.xml'); end; procedure TLogin.Setservicio(const Value: string); begin Fservicio := Value; end; procedure TLogin.Setsign(const Value: string); begin Fsign := Value; end; procedure TLogin.Settoken(const Value: string); begin Ftoken := Value; end; end.
Estiimados les pido me ayuden un poco..jiij