PDA

Ver la Versión Completa : Alguien ha usado directamente el webservice de consulta al padron de AFIP


giulichajari
29-06-2016, 13:27:07
Hola amigos...estoy tratando de programar usando directamente los webservices de AFIP, es decir sin librerias externas..
ya tengo mi crt y mi key para homologacion...

el caso es que importe el webservice de padron de nivel 3:
https://awshomo.afip.gov.ar/padron-puc-ws/services/select.ContribuyenteNivel3SelectServiceImpl?WSDL

y usando el componente HTTPRio de esta manera

begin
admin:=TIniFile.Create(ExtractFilePath(Application.ExeName )+ 'caja.ini');
ECUIT:=Copy(MaskEdit1.Text,0,2) + Copy(MaskEdit1.Text,4,8) + Copy(MaskEdit1.Text,13,1);
// Fsign:=obtenersign(respuestaXML));
TLogin.unicoLogin;


xml2:=NewXMLDocument;
xml1:=NewXMLDocument;

xml1.LoadFromFile(ExtractFilePath(Application.ExeName)+ 'cuit.xml');

content:=(RIOCuit as padronAFIP.ContribuyenteNivel3SelectServiceImpl).get(xml1.XML.Text,login.armarToken,login.armarSign) ;
xml2.XML.Text:=content;
xml2.Active:=True;
xml2.SaveToFile(ExtractFilePath(Application.ExeName) + 'archivocliente.xml');

end;
obtengo un error Exception class $C0000005 with message 'access violation at 0x00923065: read of address 0x00000000'. Process TPV.exe (3216)

segun vi en internet los ceros significan que hago referencia a un puntero inexistente..hice un showmessage de login.sign y login.token y todo va bien...
el error es en la linea
content:=(RIOCuit as padronAFIP.ContribuyenteNivel3SelectServiceImpl).get(xml1.XML.Text,login.armarToken,login.armarSign) ;

muchas gracias desde ya

Casimiro Notevi
29-06-2016, 18:43:56
Por favor, no olvides poner títulos descriptivos a tus preguntas, que ya no eres un novato en los foros ;)

giulichajari
29-06-2016, 18:55:49
Por favor, no olvides poner títulos descriptivos a tus preguntas, que ya no eres un novato en los foros ;)

ok mil disculpas...

y no sabes donde puede haber un error?

Casimiro Notevi
29-06-2016, 20:12:19
Tendrás que comprobar poniendo un punto de ruptura en esa línea y mirando los valores que tienen, a ver si así encuentras el que está a nulo.

gatosoft
29-06-2016, 22:28:34
La línea que inicas tiene varios elementos. y debes comprobar de forma aislada donde puede ocurrir el error.

content:=(RIOCuit as padronAFIP.ContribuyenteNivel3SelectServiceImpl).get(xml1.XML.Text,login.armarToken,login.armarSign) ;

Los ceros en el mensaje que muestras no necesariamente puede hacer referencia a un objeto no instanciado. Puede ser error accesando a un campo que no reconoce debido a que hay un TypeCast Erróneo. (Es Posible).

Para hacer la prueba aislada, te recomiendo verificar primero las funciones y variables que llamas dentro del GET

1) xml1.XML.Text. Verifica que llegue texto
2) login.armarToken y login.armarSign==> Verifica que la variable login esté instanciada
3) Luego verifica que RIOCuit no sea null
4) ¿padronAFIP.ContribuyenteNivel3SelectServiceImpl es una clase o devuelve una clase.?

Me quedala duda si el procedimiento que llamas al principio TLogin.unicoLogin; deberia asignarse a una variable o simplemente es un procedimiento de clase que ejecuta algo específico.

saludo,

giulichajari
30-06-2016, 13:09:53
La línea que inicas tiene varios elementos. y debes comprobar de forma aislada donde puede ocurrir el error.

content:=(RIOCuit as padronAFIP.ContribuyenteNivel3SelectServiceImpl).get(xml1.XML.Text,login.armarToken,login.armarSign) ;

Los ceros en el mensaje que muestras no necesariamente puede hacer referencia a un objeto no instanciado. Puede ser error accesando a un campo que no reconoce debido a que hay un TypeCast Erróneo. (Es Posible).

Para hacer la prueba aislada, te recomiendo verificar primero las funciones y variables que llamas dentro del GET

1) xml1.XML.Text. Verifica que llegue texto
2) login.armarToken y login.armarSign==> Verifica que la variable login esté instanciada
3) Luego verifica que RIOCuit no sea null
4) ¿padronAFIP.ContribuyenteNivel3SelectServiceImpl es una clase o devuelve una clase.?

Me quedala duda si el procedimiento que llamas al principio TLogin.unicoLogin; deberia asignarse a una variable o simplemente es un procedimiento de clase que ejecuta algo específico.

saludo,
1-xml1.XML.Text.. si llega, hice un showmessage y me lo muestra..es el contenido de un archivo xml, que corresponde al cuit a consultar y que debe respetar un dtd...

Tlogin.unicoLogin= esto corresponde al patron singleton..para no estar logueandome en la afip cada vez que solicito consultar un cuit..tengo ese metodo de clase:

class function TLogin.unicoLogin:TLogin;

begin
if login<>nil then
begin
if login.expiro=False then
begin
Result:=login;
end
else
begin
login.actualizarsigntoken;
Result:=login;
end;
end
else
begin
login:=Tlogin.Loguearse('padron-puc-ws-consulta-nivel3');
login.respuestaXML(login.generarCMS(login.guardarXML()));

end;
end;

para lo mismo tengo una variable global en la unidad donde esta la clase login..les dejo la unit completa adjunta..
3-padronAFIP.ContribuyenteNivel3SelectServiceImpl: ese metodo esta en la unidad creada por el wsdl importer a partir del webservice de consulta al padron...
la verdad no se que puede ser..de ultima mas tarde les mando una captura de pantalla con el debug

giulichajari
20-08-2016, 23:25:47
Ya me funciono. Tengo la consulta al padron sin bibliotecas de terceros! todo propio..jeje. Aparentemente habia que enviar el sign y el token sin armarlo. osea como es devuelto por el webservice debe ser enviado..

maur
20-11-2016, 02:45:21
Estoy haciendo la consulta al servicio de PUC y me dice que el computador no esta autorizado? sabes si tengo que agregar algun servicio en la pagina de afip con la clave fiscal?
Es de uso publico este servicio?