Para poder usar estos webservices, como se comento en varias oportunidades, desarrollamos interfaces propias hechas en Python debido a la incompatibilidad y complejidad de otras soluciones (.NET, Java, PHP).
A continuación se presenta un ejemplo de cuatro simples pasos, sobre como usar SoapClient y SimpleXmlElement para consultar fácilmente los servicios web de AFIP:
Paso 1: Importar las clases que necesitamos utilizar de nuestras librerias de XML y SOAP:
from simplexml import SimpleXMLElement from soap import SoapClient
Paso 2: Revisar el wsdl que describe los servicios y extraer URL, acción y espacio de nombres (buscar atributos location, soapAction -sin la operación-, targetNamespace respectivamente):
WSFEXURL = "https://wswhomo.afip.gov.ar/wsfex/service.asmx" SOAP_ACTION = 'http://ar.gov.afip.dif.fex/' SOAP_NS = "http://ar.gov.afip.dif.bfe/"
Paso 3: Creamos nuesto cliente SOAP de servicio web:
client = SoapClient(WSFEXURL,action=SOAP_ACTION, namespace=SOAP_NS, trace=True)
Paso 4: Llamamos a la función remota, por Ej. FEXDummy que obtiene el estado de los servidores de la AFIP. Para ello debemos invocar el método "virtual" del objeto client de acuerdo como especifíca el wsdl (se recomienda leer el manual del desarrollador que proporciona AFIP ya que el wsdl no es muy intuitivo). Como respuesta nos devuelve un objeto XML al cual podemos acceder directamente por sus atributos:
response = client.FEXDummy() result = response.FEXDummyResult print str(result.AppServer) print str(result.DbServer) print str(result.AuthServer)
Esto es todo, si funcionan bien nos debería imprimir el estado de los servidores (OK si estan funcionando).
Notar la simplicidad y dinamismo gracias a Python, sin perder flexibilidad, pudiendo invocar métodos arbitrarios y convertir los tipos de datos según nuestras necesidades.
En este caso el método del servicio web no recibe parámetros, si los tuviera se pasarían como argumentos por nombre (usando valores simples, diccionarios u objetos) de Python, ej.:
response = client.FEXGetPARAM_MON(Auth={"Token": token, "Sign": sign, "Cuit":long(cuit)})También puede tomarse como referencia los ejemplos de AFIP hechos en PHP, ya que desarrollamos estas herramientas para que sean similares.
El código completo para utilizar el servicio web de factura electrónica de exportación puede ser descargado de google code
Para más información y novedades sobre estos temas exite un grupo de noticia, el sitio con información general del proyecto y la páginas sobre factura electrónica, información técnica y la interfaz PyAfipWs.