Problemas configurando WSFEv1 + PHP

1,445 views
Skip to first unread message

Claudio Mucci

unread,
Mar 31, 2015, 11:58:45 AM3/31/15
to pyaf...@googlegroups.com
Buenos días a todos. 

Espero que alguien me pueda orientar. 
Estoy dando mis primeros pasos para instalar en un sistema de facturación el módulo de factura electrónica. 

Lo estoy haciendo en PHP, y tomando el ejemplo del repositorio, y ya configurados la clave y el certificado, llego a autenticar con el módulo WSAA.
Ahora, una vez que ya tengo el archivo ´factrua.json´, pongo por linea de comandos; python rece1.py /json

para soporte de DBF debe instalar dbf 0.88.019 o superior
CONFIG_FILE
: rece.ini
conf_dbf
{'iva': 'iva.dbf', 'encabezado': 'encabeza.dbf', 'permiso': 'permiso.dbf', 'comprobante asociado': 'cbteasoc.dbf', 'tributo': 'tributo.dbf', 'dato': 'dato.dbf', 'detalle': 'detalles.dbf'}
wsaa_url https
://wsaahomo.afip.gov.ar/ws/services/LoginCms
wsfev1_url https
://wswhomo.afip.gov.ar/wsfev1/service.asmx?WSDL
cuit
33756290900
Autorizando usando entrada: factura.json
Excepcion: CrearFactura() keywords must be strings
Traceback (most recent call last):
 
File "rece1.py", line 539, in <module>
    autorizar
(ws, f_entrada, f_salida, '/informarcaea' in sys.argv)
 
File "rece1.py", line 159, in autorizar
    ws
.CrearFactura(**encabezado)
TypeError: CrearFactura() keywords must be strings


Si corro el parámetro python rece1.py /dummy

para soporte de DBF debe instalar dbf 0.88.019 o superior

Consultando estado de servidores...
AppServerStatus OK
DbServerStatus OK
AuthServerStatus OK


Si en la linea de comando pongo python rece1.py /prueba

para soporte de DBF debe instalar dbf 0.88.019 o superior
CONFIG_FILE
: rece.ini
conf_dbf
{'iva': 'iva.dbf', 'encabezado': 'encabeza.dbf', 'permiso': 'permiso.dbf', 'comprobante asociado': 'cbteasoc.dbf', 'tributo': 'tributo.dbf', 'dato': 'dato.dbf', 'detalle': 'detalles.dbf'}
wsaa_url https
://wsaahomo.afip.gov.ar/ws/services/LoginCms
wsfev1_url https
://wswhomo.afip.gov.ar/wsfev1/service.asmx?WSDL
cuit
33756290900
Excepcion: (13, 'Permission denied')
Traceback (most recent call last):
 
File "rece1.py", line 385, in <module>
    f_entrada
= open(entrada,"w")
IOError: [Errno 13] Permission denied: 'factura.json'

Si alguien me puede orientar, se los agradeceré. 
Saludos. 


Mariano Reingart

unread,
Apr 3, 2015, 5:29:48 PM4/3/15
to pyaf...@googlegroups.com
2015-03-31 12:37 GMT-03:00 Claudio Mucci <fono...@gmail.com>:
Buenos días a todos. 

Espero que alguien me pueda orientar. 
Estoy dando mis primeros pasos para instalar en un sistema de facturación el módulo de factura electrónica. 

Lo estoy haciendo en PHP, y tomando el ejemplo del repositorio, y ya configurados la clave y el certificado, llego a autenticar con el módulo WSAA.
Ahora, una vez que ya tengo el archivo ´factrua.json´, pongo por linea de comandos; python rece1.py /json

para soporte de DBF debe instalar dbf 0.88.019 o superior
CONFIG_FILE
: rece.ini
conf_dbf
{'iva': 'iva.dbf', 'encabezado': 'encabeza.dbf', 'permiso': 'permiso.dbf', 'comprobante asociado': 'cbteasoc.dbf', 'tributo': 'tributo.dbf', 'dato': 'dato.dbf', 'detalle': 'detalles.dbf'}
wsaa_url https
://wsaahomo.afip.gov.ar/ws/services/LoginCms
wsfev1_url https
://wswhomo.afip.gov.ar/wsfev1/service.asmx?WSDL
cuit
33756290900
Autorizando usando entrada: factura.json
Excepcion: CrearFactura() keywords must be strings
Traceback (most recent call last):
 
File "rece1.py", line 539, in <module>
    autorizar
(ws, f_entrada, f_salida, '/informarcaea' in sys.argv)
 
File "rece1.py", line 159, in autorizar
    ws
.CrearFactura(**encabezado)
TypeError: CrearFactura() keywords must be strings



Por el error, no te esta tomando bien el archivo de entrada.
¿Esta bien configurado en el RECE.INI?
¿Estas usando un rece1.py actualizado?

Fijate los comentarios en el ejemplo:
  • Copiar este script a la carpeta superior donde se encuentra rece1.py
  • Configurar el archivo rece.ini (ver ejemplo en conf/rece.ini):
    • Sección [WSAA]: revisar certificado y clave privada, [WSFEv1]: CUIT
    • Sección [WSFEv1]: ENTRADA=factura.json y SALIDA=salida.json
    • Sección [FACTURA]: ENTRADA=factura.json

Si continua sin poder encontrar el archivo, te recomendaría poner las rutas absolutas en ENTRADA y SALIDA

Si corro el parámetro python rece1.py /dummy

para soporte de DBF debe instalar dbf 0.88.019 o superior

Consultando estado de servidores...
AppServerStatus OK
DbServerStatus OK
AuthServerStatus OK


Si en la linea de comando pongo python rece1.py /prueba

para soporte de DBF debe instalar dbf 0.88.019 o superior
CONFIG_FILE
: rece.ini
conf_dbf
{'iva': 'iva.dbf', 'encabezado': 'encabeza.dbf', 'permiso': 'permiso.dbf', 'comprobante asociado': 'cbteasoc.dbf', 'tributo': 'tributo.dbf', 'dato': 'dato.dbf', 'detalle': 'detalles.dbf'}
wsaa_url https
://wsaahomo.afip.gov.ar/ws/services/LoginCms
wsfev1_url https
://wswhomo.afip.gov.ar/wsfev1/service.asmx?WSDL
cuit
33756290900
Excepcion: (13, 'Permission denied')
Traceback (most recent call last):
 
File "rece1.py", line 385, in <module>
    f_entrada
= open(entrada,"w")
IOError: [Errno 13] Permission denied: 'factura.json'


Esta tratando de armar el ejemplo pero no puede escribir la factura, ¿esa carpeta tiene permisos de escritura para www-data (o el usuario de tu servidor web que corresponda)?
Además, tenes que indicarle /json siempre, sino te va a grabar un archivo de texto normal.
 
Si alguien me puede orientar, se los agradeceré. 

Avísanos si esto te soluciona el problema,

Sds

Claudio Mucci

unread,
Apr 3, 2015, 10:44:54 PM4/3/15
to pyaf...@googlegroups.com
Hola Mariano, 

Gracias por responder!

Como mencionaste, en el archivo rece.ini, en la sección factura, me faltaba poner salida.json.
Tengo el último rece1.py instalado. Le edité DEBUG = True. 

Ahora, cuando corro python rece1.py /json me arroja lo siguiente:

$ python rece1.py /json

para soporte de DBF debe instalar dbf
0.88.019 o superior
CONFIG_FILE
: rece.ini
conf_dbf
{'iva': 'iva.dbf', 'encabezado': 'encabeza.dbf', 'permiso': 'permiso.dbf', 'comprobante asociado': 'cbteasoc.dbf', 'tributo': 'tributo.dbf', 'dato': 'dato.dbf', 'detalle': 'detalles.dbf'}
Creando TRA...
Frimando TRA...
Conectando a WSAA...
Llamando WSAA...
Excepcion: ns1:cms.bad: El CMS no es valido
Traceback (most recent call last):

 
File "rece1.py", line 365, in <module>
    ta
= wsaa.Autenticar("wsfe", cert, privatekey, wsaa_url, proxy=proxy_dict, cacert=CACERT, wrapper=WRAPPER)
 
File "/home/verenaargentina/public_html/intranet/sys/mods/wsfe/wsaa.py", line 224, in Autenticar
    ta
= self.LoginCMS(cms)
 
File "/home/verenaargentina/public_html/intranet/sys/mods/wsfe/utils.py", line 150, in capturar_errores_wrapper
   
return func(self, *args, **kwargs)
 
File "/home/verenaargentina/public_html/intranet/sys/mods/wsfe/wsaa.py", line 166, in LoginCMS
    results
= self.client.loginCms(in0=str(cms))
 
File "/usr/local/lib/python2.6/site-packages/pysimplesoap/client.py", line 147, in <lambda>
   
return lambda *args, **kwargs: self.wsdl_call(attr,*args,**kwargs)
 
File "/usr/local/lib/python2.6/site-packages/pysimplesoap/client.py", line 342, in wsdl_call
    response
= self.call(method, *params)
 
File "/usr/local/lib/python2.6/site-packages/pysimplesoap/client.py", line 220, in call
   
raise SoapFault(unicode(response.faultcode), unicode(response.faultstring))
pysimplesoap
.client.SoapFault: ns1:cms.bad: El CMS no es valido

Te paso la configuración de RECE.INI

[WSAA]
CERT
=db_48.crt
PRIVATEKEY
=db_48.key
URL
=https://wsaahomo.afip.gov.ar/ws/services/LoginCms
##URL=https://wsaa.afip.gov.ar/ws/services/LoginCms


[WSFEv1]
CUIT
=33756290900
CAT_IVA
=1
PTO_VTA
=4000
ENTRADA
=factura.json
SALIDA
=salida.json
##URL=https://servicios1.afip.gov.ar/wsfev1/service.asmx?WSDL
URL
=https://wswhomo.afip.gov.ar/wsfev1/service.asmx?WSDL


[FACTURA]
ARCHIVO
=tipo,letra,numero
FORMATO
=factura.csv
DIRECTORIO
=.
PAPEL
=legal
ORIENTACION
=portrait
DIRECTORIO
=.
SUBDIRECTORIO
=
LOCALE
=Spanish_Argentina.1252
FMT_CANTIDAD
=0.4
FMT_PRECIO
=0.3
CANT_POS
=izq
ENTRADA
=factura.json
SALIDA
=factura.pdf


[PDF]
LOGO
=logo.png
EMPRESA
=Empresa de Prueba
MEMBRETE1
=Direccion de Prueba
MEMBRETE2
=Capital Federal
CUIT
=CUIT 30-00000000-0
IIBB
=IIBB 30-00000000-0
IVA
=IVA Responsable Inscripto
INICIO
=Inicio de Actividad: 01/04/2006
BORRADOR
=HOMOLOGACION


[MAIL]
SERVIDOR
=adan.nsis.com.ar
PUERTO
=25
USUARIO
=no.responder@nsis.com.ar
CLAVE
=noreplyauto123
MOTIVO
=Factura Electronica Nro. NUMERO
CUERPO
=Se adjunta Factura en formato PDF
HTML
=<b>Se adjunta <i>factura electronica</i> en formato PDF</b>
REMITENTE
=Facturador PyAfipWs <pyafipws@nsis.com.ar>


#[BASE_DATOS]
#DRIVER=PGSQL
#SERVER=localhost
#DATABASE=pyafipws
#UID=pyafipws
#PWD=pyafipws


[DBF]
Encabezado = encabeza.dbf
Tributo = tributo.dbf
Iva = iva.dbf
Comprobante Asociado = cbteasoc.dbf
Detalle = detalles.dbf
Permiso = permiso.dbf
Dato = dato.dbf

Espero que puedas orientarme. 
Gracias y saludos!!

Esto último, en la sección [FACTURA] lo tenía mal. Ahora lo corregí. 

Mariano Reingart

unread,
Apr 4, 2015, 12:04:55 PM4/4/15
to pyaf...@googlegroups.com
2015-04-03 22:17 GMT-03:00 Claudio Mucci <fono...@gmail.com>:
Hola Mariano, 

Gracias por responder!

Como mencionaste, en el archivo rece.ini, en la sección factura, me faltaba poner salida.json.
Tengo el último rece1.py instalado. Le edité DEBUG = True. 
 
Para habilitar los mensajes de depuración, también podes pasarle /debug , y te recomiendo agregar --trace para ver todos los mensajes enviados y recibidos. 
Por algún motivo no te esta autorizando bien con tu certificado digital / clave privada (CMS es el requerimiento de ticket de acceso firmado).

Podés probar directamente esa parte:

python wsaa.py db_48.crt db_48.key


 
Te paso la configuración de RECE.INI

[WSAA]
CERT
=db_48.crt
PRIVATEKEY
=db_48.key
URL
=https://wsaahomo.afip.gov.ar/ws/services/LoginCms
##URL=https://wsaa.afip.gov.ar/ws/services/LoginCms


[WSFEv1]
CUIT
=33756290900
CAT_IVA
=1
PTO_VTA
=4000
ENTRADA
=factura.json
SALIDA
=salida.json
##URL=https://servicios1.afip.gov.ar/wsfev1/service.asmx?WSDL
URL
=https://wswhomo.afip.gov.ar/wsfev1/service.asmx?WSDL



A simple vista esta configuración esta OK, como estas usando las URL de homologación (pruebas), tendrías que revisar que db_48.crt sea para ese ambiente.

Rodrigo Moldes

unread,
Apr 5, 2015, 4:33:04 PM4/5/15
to pyaf...@googlegroups.com
Hola claudio, pudiste avanzar con php? Podrias darme una mano?

Claudio Mucci

unread,
Apr 6, 2015, 8:47:28 AM4/6/15
to pyaf...@googlegroups.com
Hola Rodrigo, 
Ahí le acabo de enviar mi avance a Mariano, quizá lo que le escribí te pueda orientar a vos.
Pero la verdad es que estoy medio a ciegas con ésto.
No sé en dónde te quedaste o si estás en el mismo punto que yo. 
Saludos.

Claudio Mucci

unread,
Apr 6, 2015, 8:47:28 AM4/6/15
to pyaf...@googlegroups.com
Hola Mariano, 

Efectivamente probé como vos me decís con el comando python wsaa.py db_48.crt db_48.key y me arroja la siguiente respueta:

WSAA Version 2.08a Homologación True
Excepcion: SSLError: [Errno 185090050] _ssl.c:326: error:0B084002:x509 certificate routines:X509_load_cert_crl_file:system lib

Buscando el error, encontré que me faltaba configurar CACERT. Lo actualicé según se describe en http://www.sistemasagiles.com.ar/trac/wiki/ManualPyAfipWs#Excepci%C3%B3n:SSLErrorX509_load_cert_crl_file
Ahora, al verificar con  python wsaa.py db_48.crt db_48.key el me arroja el siguiente mensaje:

Excepcion: SSLHandshakeError: [Errno 1] _ssl.c:480: error:0D0890A1:asn1 encoding routines:ASN1_verify:unknown message digest algorithm

En este punto, estoy asumiendo que alguno de los archivos crt o key pueden estar mal. 
Acabo de solicitar un nuevo certificado, pero hasta que me llegue, quería saber si voy bien con esta posible solución?

Aguardo tus comentarios. 
Y gracias por todo tu trabajo!

Saludos.

Claudio Mucci

unread,
Apr 7, 2015, 4:42:59 PM4/7/15
to pyaf...@googlegroups.com
Hola Mariano, 
Solicité un nuevo certificado, de otro cuit, para asegurarme que los archivos key y crt estuvieran bien.
Pero al ejecutar por linea de comandos python wsaa.py verena.crt verena.key me da la siguiente respueta:

para soporte de DBF debe instalar dbf 0.88.019 o superior
Usando CRT=verena.crt KEY=verena.key URL=https://wsaahomo.afip.gov.ar/ws/services/LoginCms SERVICE=wsfe TTL=36000

WSAA
Version 2.08a Homologación True
Excepcion: SSLHandshakeError: [Errno 1] _ssl.c:480: error:0D0890A1:asn1 encoding routines:ASN1_verify:unknown message digest algorithm

Qué puede estar sucediendo?
Saludos.

Mariano Reingart

unread,
Apr 10, 2015, 1:57:35 AM4/10/15
to pyaf...@googlegroups.com
2015-04-07 17:42 GMT-03:00 Claudio Mucci <fono...@gmail.com>:
Hola Mariano, 
Solicité un nuevo certificado, de otro cuit, para asegurarme que los archivos key y crt estuvieran bien.
Pero al ejecutar por linea de comandos python wsaa.py verena.crt verena.key me da la siguiente respueta:

para soporte de DBF debe instalar dbf 0.88.019 o superior
Usando CRT=verena.crt KEY=verena.key URL=https://wsaahomo.afip.gov.ar/ws/services/LoginCms SERVICE=wsfe TTL=36000
WSAA
Version 2.08a Homologación True
Excepcion: SSLHandshakeError: [Errno 1] _ssl.c:480: error:0D0890A1:asn1 encoding routines:ASN1_verify:unknown message digest algorithm


Debido a algunos cambios técnicos en los protocolos de seguridad que realizó AFIP (SSLv3 vs TLS a veces con incidencias), puede ser un problema con la versión de OpenSSL instalada.
¿Estan usando Python 2.7 y OpenSSL 1.0.1+?
¿Que sistema operativo utilizan? ¿está actualizado?
¿Actualizaron la biblioteca de comunicación con webservices (pysimplesoap)?

Para más información ver un hilo de conversación anterior:

Claudio Mucci

unread,
Aug 4, 2015, 7:22:12 PM8/4/15
to PyAfipWs Factura Electrónica Libre y temas relacionados AFIP ARBA ANMAT
Hola Mariano y grupo, 

Retomo este tema ya que tuve que cambiar de proveedor de hosting, y recién ahora tengo actualizado todo como para poder retomarlo. 
al ejecutar el comando 

# python wsaa.py verena.crt verena.key

me da el siguiente mensaje: 

para soporte de DBF debe instalar dbf 0.88.019 o superior
Usando CRT=verena.crt KEY=verena.key URL=https://wsaahomo.afip.gov.ar/ws/services/LoginCms SERVICE=wsfe TTL=36000
WSAA
Version 2.08a Homologación True
Excepcion: SMIME_Error: 139976880932608:error:0B080074:x509 certificate routines:X509_check_private_key:key values mismatch:x509_cmp.c:331:
139976880932608:error:2108907F:PKCS7 routines:PKCS7_sign_add_signer:private key does not match certificate:pk7_smime.c:170:
139976880932608:error:21074099:PKCS7 routines:PKCS7_sign:pkcs7 add signer error:pk7_smime.c:88:


Tengo instalado
Python 2.7 y OpenSSL 1.0.1+ sobre CentOS 6.6 64 bits, con cPanel y actulicé pysimplesoap según el instructivo https://code.google.com/p/pyafipws/wiki/InstalacionCodigoFuente#Fedora,_CentOS,_Red-Hat

Alguna idea de éste error para ver por dónde sigo?

Gracias por todo el laburo!

Reply all
Reply to author
Forward
0 new messages