En esta sección se incluyen los detalles para emplear los Web Services de Facturación Electrónica de la AFIP.
Introducción
Nuestro sistema estaba desarrollado en Powerbuilder 7. Esa versión no tiene ningún soporte para Web Services y tampoco ninguna librería criptográfica. Por eso, tuvimos que solucionar los siguientes problemas técnicos por nuestra cuenta:
- Realizar una conexión utilizando el protocolo HTTPS. En el caso de Powerbuilder 7, el objeto que posee el lenguaje para realizar esto solo soporta HTTP. Asi que tuvimos que buscar otro. Terminamos utilizando el objeto ActiveX Msxml2.XMLHTTP.4.0 a través de OLE, porque está en casi todas las versiones de Windows. En Win98 es necesario instalar el paquete MSXML 4.0 Service Pack 2 (Microsoft XML Core Services) que se puede descargar del sitio de Microsoft. El archivo que se debe instalar es “msxml.msi”.
- Parsear codigo XML. En nuestro caso, utilizamos un parser que ya estaba en nuestro sistema. También podríamos haber utilizado el objeto activeX.
- Realizar algunas tareas criptográficas como:
- Firmar un texto utilizando una clave publica.
- Generar una clave privada
- Generar un solicitud de certificado (request) con el DN con el formato de la AFIP. El request es después firmado por la AFIP y se convierte en el certificado que se utiliza para validar nuestra firma.
- Obtener el campo DN de un certificado digital.
- Encriptar/Desencriptar simétricamente un texto. Esto es necesario solamente si se decide encriptar la contraseña de la clave privada y que el usuario no tenga que teclearla. Fue una mala decisión de diseño y creo que es mejor que tenga que ingresar la contraseña una vez por sesión y que quede cacheada.
Para el desarrollo utilizamos la librería criptográfica OpenSSL. Me costo un poco obtener ejemplos, por ese motivo, en este wiki agregue una página que describe qué funciones de la librería utilizar para realizar las tareas anteriores.
OpenSSL viene compilada con la calling convention de C, por lo que tuvimos que armar una DLL que actuara como wrapper entre OpenSSL y Powerbuilder, ya que este ultimo solo soporta la calling convention de Pascal (que también utilizada por la API de Windows).
Por otro lado, como PowerBuilder tiene poco soporte para cadenas binarias, decidimos que el wrapper solo iba a enviar y recibir texto en Base64. De esta manera, podíamos utilizar string terminados en nulls como parámetros y me ahorraba trabajo al manipular los datos en Powerbuilder.
Notas de Diseño
Una de las primeras decisiones que tomamos fue que la llamada al WS se iba a realizar cada vez que se quisiera imprimir un comprobante que necesitara CAE y no lo tuviera. Esto tiene la ventaja de ser transparente para el usuario, pero presenta el inconveniente que cada una de las maquinas que pueden facturar tienen que estar configuradas para acceder a los Web Services.
Otra forma de implementarlo es crear un deamon que se ocupe de conectarse a la AFIP y obtener los CAEs. Nosotros teníamos poco experiencia desarrollando este tipo de aplicaciones, por lo que nos inclinamos por la primera opción.
Otro tema a tener en cuenta es separar el proceso de facturación de la obtención del CAE, para que al ocurrir un error con el comprobante no nos quedemos con un CAE que pertenece a un comprobante inexistente. Aunque a nosotros no nos paso, una prépaga decidió implementar ambos procesos en una transacción SQL y se le presento este problema.
Sincronización de Relojes
Las computadoras que emitirán comprobantes electrónicos deben tener sus relojes sincronizados a través del protocolo NTP con el servidor time.afip.gov.ar.
En el sitio http://nettime.sourceforge.net/ se encontrarán las instrucciones para realizar esto en WinXP y Win2000. También se podrá descargar un cliente gratuito para las restantes versiones de Windows que no poseen soporte para NTP integrado.
Instalación de los Certificados Digitales
En cada una de las máquinas que se conectaran a la AFIP se debe instalar el certificado digital de la autoridad certificante de la AFIP. Esto es necesario para poder establecer la conexión HTTPS.
Para ello se deben realizar los siguientes pasos:
- Se debe ingresar en la página http://www.afip.gov.ar/genericos/certificadoAS.asp y descargar el archivo con el certificado.
- Abrir la carpeta donde se ha guardado el certificado.
- Seleccionarlo y presionar el botón derecho y seleccionar Install.
- Seguir los pasos del asistente para instalar el certificado.
Si se quiere revisar que el certificado este instalado correctamente se puede ejecutar c:\windows\system32\certmgr.msc.
Resulta conveniente instalar en algunas máquinas el certificado digital de la autoridad certificante del ambiente de homologación, ya que eso permitirá utilizar el ambiente de prueba de facturación electrónica que posee la AFIP.
Servidores de la AFIP
Entorno de Producción
WebService WSAA (URL): https://wsaa.afip.gov.ar/ws/services/LoginCms
Webservice WSFE (URL): https://servicios1.afip.gov.ar/wsfe/service.asmx
Entorno de Homologación
WebService WSAA (URL): https://wsaahomo.afip.gov.ar/ws/services/LoginCms
Webservice WSFE (URL): https://wswhomo.afip.gov.ar/wsfe/service.asmx
Los datos anteriores los hicimos parametrizables, por si en algún momento la AFIP decide cambiarlos. Además eso nos permitió hacer que el sistema apuntara a Producción solamente si era corrido en la base de Producción de nuestros clientes. Como la mayoría no tienen un departamento de Sistemas, de esa manera, nos evitamos que por error generen un CAE para un comprobante del ambiente de test.
Los ejemplos que incluyo en este sition son todos del ambiente de homologación
Generación del certificado de la empresa que se consumirá los WS
El siguiente proceso se deberá realizar para cada uno de los entes que posee la organización, si están inscriptos en la AFIP en forma separada. Cada una de las organizaciones que requieran conectarse a las computadoras de la AFIP necesitan un certificado propio.
En nuestro sistema, el certificado generado y la clave privada se guardaban en un directorio compartido. Pero lo ideal es que se almacene en la base de datos, ya que ambos archivos solo contienen texto en formato base64.
- El primer paso es generar una clave privada y encriptarla con la contraseña provista por el usuario.
- Generar la solicitud para el certificado (request). El formato que se debe emplear para el campo subject DN es:
serialNumber=CUIT 20305949125,CN=NuestroSistema,OU=Facturacion,O=UnaPrepaga,ST=Capital Federal,C=AR
Donde CN es el nombre del sistema que emite los comprobantes, OU es el sector o departamento de la organización, O es el nombre de la organizaciòn y ST es la provincia.
- A continuación se debe acceder al sitio de la AFIP y subir a la misma el archivo con la solicitud de certificado (request). En http://www.afip.gov.ar/eFactura/ se encontrará el documento “Procedimiento para la habilitación y operación de servicios” las instrucciones para realizar este proceso. Nunca realice este punto, por eso me estoy basando en lo que dicen los instructivos.
- Posteriormente la AFIP nos devolverá un archivo con el certificado.
- A continuación en nuestro sistema almacenamos el path completo del certificado para utilizarlo más adelante.
En nuestro caso, realizamos los pasos anteriores utilizando la libreria OpenSSL.
Para el ambiente de homologación, es necesario generar el request y enviárselo a algún miembro del área de Seguridad Informatica - Autentificación y Autorizacion. Ellos nos devolverán el certificado de la AFIP que nos permitirá conectarnos a los WS.
Verificación del estado de los Web Services
Para esto utilizamos el Web Service Dummy (FEDummy) que resultó muy fácil de implementar y muy útil para diagnosticar problemas con el WS. Si el request a este WS funciona nos estamos asegurando:
- Los firewalls del cliente se encuentran correctamente configurados.
- La máquina tiene los certificados de la AFIP.
- El paquete HTTP que estamos enviando contiene todos los encabezados SOAP necesarios para que funcionen los Web Services.
- Que los WS están funcionando.
Proceso para Obtener el CAE
- El primer paso es obtener un ticket de sesión. El mismo se obtiene invocando al Web Service de Autentificación y Autorización (WSAA).
- Una vez que tenemos un ticket de sesión, podemos solicitar los CAEs utilizando el Web Service de Facturación Electronica (FEAutRequest).
Existen otros Web Services pero para emitir comprobantes electrónicos, solo necesitamos los anteriores (01/06/2008).
Notas sobre el codigo XML de las paginas de Facturación Electrónica
- El XML de los envios a la AFIP tiene los caracteres \n y \r. Así cuando depuraba las variables podía ver claramente que contenían.
- El XML recibido de la AFIP no posee caracteres los \n ni \r, pero en estas paginas, se los agregue para facilitar su lectura.
- En algunos casos, el XML recibido de la AFIP incluye '<' y '>' en vez de '<' y '>'. Esto normalmente se da en el cuerpo principal del XML. Tuvimos que modificar el XML parser para que realice la conversión antes de procesar el XML.