Con OPENSSL hay que generar un archivo (yo lo llamo clave.key) y con ese otro archivo más (ponele el nombre que quieras) que el contador lo "sube" en la página de la AFIP en uno de lo tantos pasos que debe hacer para registrar al cliente en el sistema RECE de Facturación Electrónica. La Afip le devuelve otro archivo que te lo debe pasar a vos. Yo lo llamo certificado.crt.- Estos 2 archivos son los que usa la dll para identificarse ante la Afip cuando va a emitir una Factura Electrónica. Vos te identificas, informas cuit, neto, iva, total, etc que vas a facturar, la Afip te dice si o no, y si te dice si te entrega un CAE y un VTO, que vos DEBES guardar con los demás datos de la factura y que deben ser impresos. Estos 2 datos son los que le dan la legalidad a la factura impresa, ya que la puedes imprimir en cualquier papel y no necesita nada más que esto, ni siquiera el famoso código de barras, aunque yo lo imprimo para que quede "profesional".
Aquí te adjunto la rutina completa de autorización para hacer una factura (una pelotudez). Hay más detalles, pero por ahora creo que te alcanza para comenzar. Suerte!!!
PARAMETERS _feptovta, _fetipocomp, _fetipodoc, _fenrodoc, _fefechacomp, _feneto1, _feneto2, _feiva1, _feiva2, _fetotal, _feexento
PRIVATE _feptovta, _fetipocomp, _fetipodoc, _fenrodoc, _fefechacomp, _feneto1, _feneto2, _feiva1, _feiva2, _fetotal, _feexento
PRIVATE _resultado
_resultado = .F.
IF FILE("certificado.crt") AND ;
FILE("clave.key") AND ;
FILE("feafip.dll") AND ;
FILE("openssl.exe") AND ;
FILE("licencia.lic") AND ;
FILE("libeay32.dll") AND ;
FILE("ssleay32.dll")
PUBLIC wsfev1 as FEAFIPLib.wsfev1
WAIT "Solicitando autorización a la AFIP..." WINDOW NOWAIT
o.numero_comprobante = 0
o.fecae = ""
o.fevto = CTOD(" / / ")
*_fefechacomp = TRANSFORM(YEAR(_fefechacomp),"@L 9999") + TRANSFORM(MONTH(_fefechacomp),"@L 99") + TRANSFORM(DAY(_fefechacomp),"@L 99")
_fefechacomp = DTOC(_fefechacomp,1)
* Tipos de comprobante (_fetipocomp)
* 1 = FACTURAS A
* 2 = NOTAS DE DEBITO A
* 3 = NOTAS DE CREDITO A
* 6 = FACTURAS B
* 7 = NOTAS DE DEBITO B
* 8 = NOTAS DE CREDITO B
* 11 = FACTURAS C
* 12 = NOTAS DE DEBITO C
* 13 = NOTAS DE CREDITO C
IF EMPTY(o.fe_urlwsaa)
ENDIF
IF EMPTY(o.fe_urlwsw)
ENDIF
* URLs de autenticacion y negocio. Cambiarlas por las de producción al implementarlas en el cliente(abajo)
* Enotorno de desarrollo
* Entorno de producción (en el cliente)
wsfev1 = CREATEOBJECT("FEAFIPLib.wsfev1")
wsfev1.cuit = INT(VAL(o.mi_cuit))
wsfev1.url = o.fe_urlwsw
* Si se identifica correctamente
IF wsfev1.login("certificado.crt", "clave.key", o.fe_urlwsaa)
* Si puede recuperar el último comprobante emitido
IF wsfev1.sfrecuperalastcmp(_feptovta, _fetipocomp)
o.numero_comprobante = wsfev1.sflastcmp + 1
wsfev1.RESET()
* Parametros
* Concepto (Entero) : Concepto facturado. Si es producto o servicio.
* (1=Producto / 2=Servicio / 3=Productos y Servicios)
* Tipo de documento del cliente (80=Cuit / 96=DNI)
* Número de documento. Debe coincidir según el tipo definido en el parámetro anterior.
* Comprobante a autorizar (Desde)
* Comprobante a autorizar (Hasta)
* Fecha del comprobante (aaaammdd)
* Importe total (Flotante)
* Importe total de servicios.
* Neto gravado.
* Monto exento.
* Fecha de servicio desde (solo requerido si concepto es servicio)
* Fecha de servicio hasta (solo requerido si concepto es servicio)
* Fecha de vencimiento del pago (solo requerido si concepto es servicio)
* Id de moneda.
* Cotización de la moneda.
wsfev1.agregafactura(1, _fetipodoc, _fenrodoc, o.numero_comprobante, o.numero_comprobante, _fefechacomp, _fetotal, 0, ;
_feneto1+_feneto2, _feexento, "", "", "", "PES", 1)
* Código de Iva (5=21% / 4=10.5%)
IF _feiva1 > 0
wsfev1.agregaiva(5, _feneto1, _feiva1)
ENDIF
IF _feiva2 > 0
wsfev1.agregaiva(4, _feneto2, _feiva2)
ENDIF
IF wsfev1.autorizar(_feptovta, _fetipocomp)
IF wsfev1.sfresultado(0)="A"
o.fecae = wsfev1.sfcae(0)
c = wsfev1.sfvencimiento(0)
o.fevto = CTOD(RIGHT(c,2) + "/" + SUBSTR(c,5,2) + "/" + LEFT(c,4))
_resultado = .T.
ELSE
* observaciones
MESSAGEBOX(wsfev1.autorizarrespuestaobs(0))
ENDIF
ELSE
MESSAGEBOX(wsfev1.errordesc)
ENDIF
ELSE
* Si no pudo recuperar el último comprobante emitido
MESSAGEBOX(wsfev1.errordesc)
ENDIF
ELSE
* Si no se identificó correctamente
MESSAGEBOX(wsfev1.errordesc)
ENDIF
RELEASE wsfev1
WAIT CLEAR
ELSE
MESSAGEBOX("Falta alguno de los siete archivos necesarios para la emisión de la Factura Electrónica. Comuníquese con el personal de soporte de Zona de Precios.", 16, _VFP.msgbox_error)
ENDIF
RETURN _resultado