Afip y Factura electronica

7,438 views
Skip to first unread message

* du!

unread,
Aug 15, 2011, 9:48:47 AM8/15/11
to php...@googlegroups.com
Hola a todos,
me estoy metiendo en esto de la factura electronica, que tengo que
desarrollar prontamente en php corriendo bajo linux
vi que hay varias libs, como afipws y otras

pero no queria arrancar si pedir un consejo por aca,
recomiendan alguna otra lib? cosas a tener en cuenta? experiencias?

Gracias!

Juan Rodríguez Monti

unread,
Aug 15, 2011, 12:09:26 PM8/15/11
to php...@googlegroups.com

Fijate el laburo que está haciendo Mariano Reingart con
http://www.pyafipws.com.ar/ que es muy impresionante y está mantenido.
Ofrece compatibilidad con varios lenguajes, si bien está desarrollado
en Python.

Es muy bueno.

Saludos,
Juan

Jadull Edgardo

unread,
Aug 15, 2011, 12:12:56 PM8/15/11
to php...@googlegroups.com
Excelente dato. gracias


--
Has recibido este mensaje porque estás suscrito al grupo "Grupo PHP Argentina" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a php...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a php-arg+u...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/php-arg?hl=es.




--
Saludos

Edgardo A. Jadull

* du!

unread,
Aug 15, 2011, 12:21:36 PM8/15/11
to php...@googlegroups.com
Si, era el que comentaba y por ahora fue lo mejor que vi

2011/8/15 Jadull Edgardo <jadu...@gmail.com>:

nachi77o

unread,
Oct 8, 2011, 7:46:31 PM10/8/11
to Grupo PHP Argentina
revisaste la doc oficial de la afip? hay un ejemplito en php

http://www.afip.gov.ar/ws/#WSFeDet

Exitos!

Xava

unread,
Oct 12, 2011, 10:37:26 AM10/12/11
to Grupo PHP Argentina
si Muchas Gracias Nachito,
ya esta resuelto, termine armando un par de clases propias para la
coneccion con WSAA y WSFE,
si alguien las llega a necesitar avise!

Pablo Z - Medaneros

unread,
Oct 12, 2011, 10:41:48 AM10/12/11
to php...@googlegroups.com
Hola! a mi me interesa....

Saludos
Z

El 12/10/2011 11:37 AM, Xava escribi�:

Andrés Morales

unread,
Oct 12, 2011, 12:02:25 PM10/12/11
to php...@googlegroups.com
De una, te las encargo!

Almacenamiento Almacenamiento

unread,
Oct 12, 2011, 12:09:15 PM10/12/11
to php...@googlegroups.com
Nose pero yo anote la información sobre esto xD, es muy interesante el tema, y capaz sea de mucha utilidad.

Juan Ignacio Langdon Sagasta

unread,
Oct 12, 2011, 5:29:36 PM10/12/11
to php...@googlegroups.com
dale pasalas!! estamos por encarar un proyecto y nos vendrian bien! cuando tengamos algo implementado tambien lo compartiremos.

Gracias
Tec. Juan Ignacio Langdon Sagasta
Facultad de Ciencias Económicas y Sociales
Universidad Nacional de Mar del Plata

Dante Marcelo

unread,
Oct 12, 2011, 6:28:52 PM10/12/11
to php...@googlegroups.com
hola pasalas estoy en el lugar donde trabajo me pidieron algo asi...y no tengo idea para donde correr jajaja

xava *

unread,
Oct 12, 2011, 8:13:38 PM10/12/11
to php...@googlegroups.com
hacer esto, es una rompida de huevos

Basicamente son dos clases,
afip/wsaa.class.php
afip/wsfe.class.php

en el archivo index.php hay un ejemplo de como se usan,
el codigo esta basado en los ejemplos oficiales de la AFIP, para poder usarlo tienen que pedir unos certificados por mail a la AFIP (lo hizo mi amigo, no se donde es pero busquen que debe estar facil) una vez que tienen los certifcados los guardan dentro de la carpeta keys/

cualquier duda pregunten,
la clase wsfe no tiene soporte para envio en lotes de facturas (comprobantes) pero es facil de implementarlo si no necesitan

aclaro, antes que nada, que todo puede estar mucho mejor, soy conciente de eso, pero tenia que sacarlo rapido asi que ahi quedo, aunque aun le sigo trabajando detalles

espero les sirva!
adjunto algunos links de interes (si no van a safar de leer)


información técnica oficial sobre servicios web
http://www.afip.gov.ar/ws/
http://www.scribd.com/doc/44611334/Pasos-para-usar-Factura-Electronica-en-modo-testing

PyAfipWs (la documentacion de como funciona es lo mismo, ahi estan los links a donde pedir el cert y demas)
http://www.sistemasagiles.com.ar/trac/wiki/PyAfip
http://www.sistemasagiles.com.ar/trac/wiki/FacturaElectronicaPython

Manual de Uso PyAfipWs: Interfase y herramientas para servicios web AFIP (Factura Electrónica y otros)
http://www.sistemasagiles.com.ar/trac/wiki/ManualPyAfipWs

- otros
PyRece: Aplicativo Autorizador y Generador de Facturas Electrónicas  (usa PyAfipWs)
http://www.sistemasagiles.com.ar/trac/wiki/PyRece





2011/10/12 Dante Marcelo <dant...@gmail.com>
hola pasalas estoy en el lugar donde trabajo me pidieron algo asi...y no tengo idea para donde correr jajaja
afip.tar.gz

BARBAZUL

unread,
Oct 13, 2011, 1:08:38 AM10/13/11
to php...@googlegroups.com

Uhhh esto me viene al pelo. Yo había hecho la implementación de esta API hace algunos años pero ni se donde quedo ese código y encima debe estar de desactualizado y JUSTO esta semana salio que alguien me lo pidió. AL Peloooo.

Nota: Sale un github de esto, no?

Andrés Morales

unread,
Oct 13, 2011, 8:16:27 AM10/13/11
to php...@googlegroups.com
El 13 de octubre de 2011 02:08, BARBAZUL <tere...@gmail.com> escribió:

Uhhh esto me viene al pelo. Yo había hecho la implementación de esta API hace algunos años pero ni se donde quedo ese código y encima debe estar de desactualizado y JUSTO esta semana salio que alguien me lo pidió. AL Peloooo.

Nota: Sale un github de esto, no?


Debería subirse a github... y lo laburamos en conjunto...

* du!

unread,
Oct 13, 2011, 10:21:36 AM10/13/11
to php...@googlegroups.com
dale, por la tarde lo subo :)
y agrego unos TODO

2011/10/13 Andrés Morales <andresfern...@gmail.com>

PHP management

unread,
Oct 13, 2011, 3:51:05 PM10/13/11
to Grupo PHP Argentina
Gracias!

On Oct 13, 9:16 am, Andrés Morales <andresfernandomora...@gmail.com>
wrote:
> >> *información técnica oficial sobre servicios web*
> >>http://www.afip.gov.ar/ws/
>
> >>http://www.scribd.com/doc/44611334/Pasos-para-usar-Factura-Electronic...
> >> *
> >> *
> >> *PyAfipWs *(la documentacion de como funciona es lo mismo, ahi estan los
> >> *Manual de Uso PyAfipWs: Interfase y herramientas para servicios web AFIP
> >> (Factura Electrónica y otros)*
> >>http://www.sistemasagiles.com.ar/trac/wiki/ManualPyAfipWs*
> >> *
> >> - otros
> >> *PyRece: Aplicativo Autorizador y Generador de Facturas Electrónicas
> >>  (usa PyAfipWs)*
> >>http://www.sistemasagiles.com.ar/trac/wiki/PyRece
>
> >> 2011/10/12 Dante Marcelo <dante...@gmail.com>

Julian

unread,
Jun 16, 2013, 6:00:56 PM6/16/13
to php...@googlegroups.com, xa...@00101010.com.ar
Xava, 

Ante todo, mil gracias por la contribucion.

Probe tu codigo y wsaa funciona, pero wsfe me da el siguiente error (en response-FEAutRequest.xml al habilitarle el modo debug)

FEAutRequest@SRV_RA: Usuario no autorizado a realizar esta operacion. ValidacionDeToken: No apareció CUIT en lista de relaciones: 2147483647

Sin embargo, no tengo ni idea de donde sale ese CUIT, ya que no corresponde con el mio.

Alguna idea?

Gracias de antemano,
Julian

Ariel Loffreda

unread,
Aug 5, 2013, 10:59:57 PM8/5/13
to php...@googlegroups.com, xa...@00101010.com.ar, jul...@coccia.com

Gente, estoy entrando recien ahora en este tema de la Factura Electronica.
Ante todo les comento que estoy intentando generar el ticket con el wsaa con php y sobre linux, asi que no tengo ningun com ni libreria externa para utilizar (al menos en debian no se como usarlas)
Para poder generar el token con el wsaa, tengo mi crt y mi key, pero cuandor quiero generar el signTRA me devuelve el siguiente error

Warning: openssl_pkcs7_sign(): error getting private key in /var/www/fele/wsaa-client.class.php on line 80

ERROR generating PKCS#7 signature

Estuve googleando y no encuentro solucion, les dejo el codigo, que lo tome prestado de AFIP

           $tra='TRA.xml';
          $tratmp='TRA.tmp';
          $key='afip/pedido.key';
          $crt='afip/privada.crt';

 (linea 80 del error)
           $STATUS=openssl_pkcs7_sign($tra, $tratmp, $crt,
            array($key, constant('PASSPHRASE')),
            array(),
            !PKCS7_DETACHED
            );

[constant('PASSPHRASE')]->'xxxxxxx' (no se que va aca, es la constante por defecto)

Muchas Gracias!!
Saludos


Ariel Loffreda

Alan Cluet Saball

unread,
Nov 22, 2013, 4:37:40 PM11/22/13
to php...@googlegroups.com

saludos


Obtengo el siguiente error y no encuentro la manera de solucionarlo

C:\xampp\htdocs\Trabajando\afip\wsaa.class.php:52 WSAA class. Faltan archivos necesarios para el funcionamiento

Todas las constantes estan definidas correctamente y los $path modificados.

Alguna idea? 

Alan Cluet Saball

unread,
Nov 23, 2013, 4:54:36 PM11/23/13
to php...@googlegroups.com
Cambiando varios $path para adaptarlo consigo evitar los errores de que faltan archivos.
Y aparecen estos.

Warning: file(xmlgenerados/TA.xml): failed to open stream: No such file or directory in C:\xxx\afip\wsaa.class.php on line 180

Fatal error: Call to undefined function openssl_pkcs7_sign() in C:\xxx\afip\wsaa.class.php on line 106

El divendres 22 de novembre de 2013 18:37:40 UTC-3, Alan Cluet Saball va escriure:

Sebastian Ginyaume

unread,
Dec 9, 2013, 9:53:11 AM12/9/13
to php...@googlegroups.com
Con que version de php funciona?

Roberto C. Fernández G.

unread,
Jul 24, 2014, 4:34:21 AM7/24/14
to php...@googlegroups.com, xa...@00101010.com.ar, jul...@coccia.com
Estimado Ariel, pudiste solucionar el error "openssl_pkcs7_sign(): error getting private key "?? si es asi, me podrias indicar como lo hiciste? desde ya muchas gracias.

Joaquín Vicente

unread,
Jul 24, 2014, 3:12:13 PM7/24/14
to php...@googlegroups.com, xa...@00101010.com.ar, jul...@coccia.com

No pude evitarlo...



Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a php-arg+u...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a php...@googlegroups.com. Para acceder a más opciones, visita https://groups.google.com/d/optout.

Ale Prieto

unread,
Aug 25, 2014, 11:38:00 AM8/25/14
to php...@googlegroups.com
Roberto, buen día!

¿Generaste las claves y las firmaste con AFIP?


Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a php-arg+u...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a php...@googlegroups.com. Para acceder a más opciones, visita https://groups.google.com/d/optout.



--

Nica Clark

unread,
Dec 29, 2014, 9:48:50 AM12/29/14
to php...@googlegroups.com, xa...@00101010.com.ar
Hola muchas gracias estoy intentando usar el módulo pero no me funciona. Al activar el modo debugger me da el siguiente error en el xml de response: "Error al convertir de Base64 al token". Pruebo el servidor de la afip y veo que esta andando, ademas me sucede siempre, por eso descarto que sea problema del servidor. Alguien sabe que puede ser?

Rodrigo Moldes

unread,
Apr 6, 2015, 8:04:42 AM4/6/15
to php...@googlegroups.com
Hola a todos! Tienen algun codigo completo en php?, la verdad es una rompida de huevos como decian mas abajo..
Gracias!

Misael

unread,
Apr 9, 2015, 1:27:39 PM4/9/15
to php...@googlegroups.com
Hola Xava, quisiera saber si pudiste hacer funcionar la facturación electrónica de la afip.
Disculpame que se que este mensaje es muy viejo, pero me estoy rompiendo la cabeza con todo esto y lei que vos habias podido desarrollar unas Clases propias.

Desde ya muchas gracias!!
Saludos.

Marcelo Arguello

unread,
Apr 15, 2015, 9:14:45 AM4/15/15
to php...@googlegroups.com
Hola gente,
                 me sumo a la consulta de Misael. Ademas quisiera saber si alguien hizo implementaciones en servidores linux, ya que necesito desarrollar un módulo que me permita realizar facturas electrónicas. Hasta donde vi PyAfipWs corre bajo windows y los modulos que provee afip tambien (me equivoco?).

Si alguien está trabajando en algun desarrollo para este tema, avise que me interesa sumarme.

Saludos Cordiales.-
Ing. Argüello Marcelo.-

Misael

unread,
Apr 18, 2015, 11:23:03 AM4/18/15
to php...@googlegroups.com
Hola Marcelo, como estas ?.
Hecha un vistazo por acá: https://github.com/reingart/pyafipws
Yo todavía no me puse de lleno con esto, pero aparentemente funciona.

La posibilidad de emitir facturas con PHP mediante un framework de facturación desarrollado en Python (pyafipws) utilizando el comando exec.
Es un trabajo que realizo Mariano Reingart, que por cierto en la pagina http://www.sistemasagiles.com.ar/ dan soporte comercial a todo esto.

Saludos.

Marcelo

unread,
Apr 18, 2015, 12:14:16 PM4/18/15
to php...@googlegroups.com
Hola Misael,
                   gracias por responder. Ahi lo estoy consultando a Mariano por mail si su desarrollo corre bajo linux.

Saludos Cordiales.-

Marcelo Argüello
Ingeniero en Sistemas de Información
0351-3275330 · marcelo....@gmail.com

Socio fundador de MakeIT-COOP
marcelo....@makeit.coop · www.makeit.coop

 skype   linkedIn

--
Has recibido este mensaje porque estás suscrito a un tema del grupo "Grupo PHP Argentina" de Grupos de Google.
Para anular la suscripción a este tema, visita https://groups.google.com/d/topic/php-arg/lJ_PQshAaLU/unsubscribe.
Para anular la suscripción a este grupo y a todos sus temas, envía un correo electrónico a php-arg+u...@googlegroups.com.

Daniel Lagamma

unread,
Jun 16, 2015, 7:33:00 AM6/16/15
to php...@googlegroups.com, xa...@00101010.com.ar, jul...@coccia.com
Les doy la solucion para el error "openssl_pkcs7_sign(): error getting private key ":
El archivo .tmp debe existir, asi que mi solucion fue crear el .tmp sin datos:

            $fp = fopen('TRA.tmp','w');
            fwrite($fp,$asc);
            fclose($fp);
    
             $STATUS=openssl_pkcs7_sign(realpath("TRA.xml") , realpath("TRA.tmp"), "file://". realpath(CERT) ,
            array("file://". realpath(PRIV_KEY) , PASSPHRASE),
            array(),
            !PKCS7_DETACHED);
 
Saludos

Miguel Angel Martínez

unread,
Jun 16, 2015, 4:26:40 PM6/16/15
to php...@googlegroups.com
Hola Xava

Me interesa lo que puedas compartir.
Te agradezco mucho!

Saludos

INNOVAR GROUP MDQ

unread,
Jun 19, 2015, 5:33:26 PM6/19/15
to php...@googlegroups.com
Estimados, estoy tratando de armar la factura electrónica en php, tanto la común como así también para una cooperativa de servicios, si alguien me puede ayudar se lo agradeceré o si alguien tiene algo hecho que lo quiera vender también será bienvenido ya que la necesito urgente, desde ya muchas gracias a todos.

Un cordial saludo.

Miguel Angel Martínez

unread,
Jun 19, 2015, 6:15:31 PM6/19/15
to php...@googlegroups.com

Yo estoy en lo mismo. Si hay algo hecho me vendría bien. Si termino algo lo paso.

Saludos

El jun 19, 2015 6:33 PM, "INNOVAR GROUP MDQ" <olivera1...@gmail.com> escribió:
Estimados, estoy tratando de armar la factura electrónica en php, tanto la común como así también para una cooperativa de servicios, si alguien me puede ayudar se lo agradeceré o si alguien tiene algo hecho que lo quiera vender también será bienvenido ya que la necesito urgente, desde ya muchas gracias a todos.

Un cordial saludo.

--

Carlos Hidalgo

unread,
Jun 20, 2015, 11:15:40 AM6/20/15
to php...@googlegroups.com
Estas en MX?

El 19/06/2015, a las 16:17, INNOVAR GROUP MDQ <olivera1...@gmail.com> escribió:

Estimados, estoy tratando de armar la factura electrónica en php, tanto la común como así también para una cooperativa de servicios, si alguien me puede ayudar se lo agradeceré o si alguien tiene algo hecho que lo quiera vender también será bienvenido ya que la necesito urgente, desde ya muchas gracias a todos.

Un cordial saludo.

--
Has recibido este mensaje porque estás suscrito al grupo "Grupo PHP Argentina" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a php-arg+u...@googlegroups.com.

Miguel Angel Martínez

unread,
Jun 20, 2015, 12:25:49 PM6/20/15
to php...@googlegroups.com
Hola.

No, estoy en Argentina.

--
Has recibido este mensaje porque estás suscrito a un tema del grupo "Grupo PHP Argentina" de Grupos de Google.
Para anular la suscripción a este tema, visita https://groups.google.com/d/topic/php-arg/lJ_PQshAaLU/unsubscribe.
Para anular la suscripción a este grupo y a todos sus temas, envía un correo electrónico a php-arg+u...@googlegroups.com.

Para publicar en este grupo, envía un correo electrónico a php...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/php-arg.
Para acceder a más opciones, visita https://groups.google.com/d/optout.



--
Miguel Angel

Matias Wernicke

unread,
Jun 23, 2015, 4:44:04 PM6/23/15
to php...@googlegroups.com

Miguel Angel Martínez

unread,
Jun 24, 2015, 8:43:33 AM6/24/15
to php...@googlegroups.com
Te agradezco Matias, pero estoy buscando algo open source para implementar via php en linux.

Saludos
--
Miguel Angel

Gerardo Gorelik Zonis

unread,
Jun 25, 2015, 3:57:33 PM6/25/15
to php...@googlegroups.com, jul...@coccia.com, xa...@00101010.com.ar

Daniel, he probado diferentes maneras y no he conseguido salir del error : error getting private key.

Ha esta altura estoy pensando que es un error en el formato con el que tengo guardado el certificado.

He realizado los siguientes pasos para generar el CERT (supuestamente archivo en formato PEM)
1- openssl genrsa -out MiClavePrivada 1024
2-

openssl req -new -key claveLaloGZXXX-subj "/C=AR/O=NOMBRE NOMBRE/CN=NOMBRESISTEMA/serialNumber=CUIT NROCUITA" -out SALIDACSR

3-con el contenido del archivo SALIDACSR fui al sitio de la AFIP (ingresando mi clave fiscal) ->

WSASS - Autogestión Certificados Homologación  -> nuevo certificado

coloque un alias

pegue el contenido del CSR y luego click en crear dn y certificado


Este resultado entiendo es mi CERT (El sistema devuelve un certificado x509v2 en formato PEM)


4- ingreso al php para generar el TA -> ticket de acceso  Y ERROR


 $STATUS=openssl_pkcs7_sign("TRA.xml", "TRA.tmp", "file://".CERT,
    array("file://".PRIVATEKEY, PASSPHRASE),
    array(),
    !PKCS7_DETACHED
    );

Observaciones:

- tengo creado el archivo TRA.tmp

- controle todos los path y estan correctos, he puesto la funcion realpath

- ejecuto el php por linea de comando (CMD de windows) -> php.exe wsaa-client.php wsfev1

- controlado que la extension openssl este funcionando tanto para ejecutar en el navegador como para ejecutar en linea de comando



alguien pudo pasar este paso?


Paso el php que estoy utilizando, sacado de AFIP en su momento


---------------------------------------------------------------------------------------------------------

<?php
# Author: Gerardo Fisanotti - DvSHyS/DiOPIN/AFIP - 13-apr-07
# Function: Get an authorization ticket (TA) from AFIP WSAA
# Input:
#        WSDL, CERT, PRIVATEKEY, PASSPHRASE, SERVICE, URL
#        Check below for its definitions
# Output:
#        TA.xml: the authorization ticket as granted by WSAA.
#==============================================================================
define ("WSDL", "wsaa.wsdl");     # The WSDL corresponding to WSAA
define ("CERT", "ghf.crt");       # The X.509 certificate in PEM format
define ("PRIVATEKEY", "ghf.key"); # The private key correspoding to CERT (PEM)
define ("PASSPHRASE", "dsfafafdasfas"); # The passphrase (if any) to sign
define ("PROXY_HOST", "10.20.152.112"); # Proxy IP, to reach the Internet
define ("PROXY_PORT", "80");            # Proxy TCP port
define ("URL", "https://wsaahomo.afip.gov.ar/ws/services/LoginCms");
#define ("URL", "https://wsaa.afip.gov.ar/ws/services/LoginCms");
#------------------------------------------------------------------------------
# You shouldn't have to change anything below this line!!!
#==============================================================================
function CreateTRA($SERVICE)
{
  $TRA = new SimpleXMLElement(
    '<?xml version="1.0" encoding="UTF-8"?>' .
    '<loginTicketRequest version="1.0">'.
    '</loginTicketRequest>');
  $TRA->addChild('header');
  $TRA->header->addChild('uniqueId',date('U'));
  $TRA->header->addChild('generationTime',date('c',date('U')-60));
  $TRA->header->addChild('expirationTime',date('c',date('U')+60));
  $TRA->addChild('service',$SERVICE);
  $TRA->asXML('TRA.xml');
}
#==============================================================================
# This functions makes the PKCS#7 signature using TRA as input file, CERT and
# PRIVATEKEY to sign. Generates an intermediate file and finally trims the
# MIME heading leaving the final CMS required by WSAA.
function SignTRA()
{
  $STATUS=openssl_pkcs7_sign("TRA.xml", "TRA.tmp", "file://".CERT,
    array("file://".PRIVATEKEY, PASSPHRASE),
    array(),
    !PKCS7_DETACHED
    );
  if (!$STATUS) {exit("ERROR generating PKCS#7 signature\n");}
  $inf=fopen("TRA.tmp", "r");
  $i=0;
  $CMS="";
  while (!feof($inf))
    {
      $buffer=fgets($inf);
      if ( $i++ >= 4 ) {$CMS.=$buffer;}
    }
  fclose($inf);
#  unlink("TRA.xml");
  unlink("TRA.tmp");
  return $CMS;
}
#==============================================================================
function CallWSAA($CMS)
{
  $client=new SoapClient(WSDL, array(
          'proxy_host'     => PROXY_HOST,
          'proxy_port'     => PROXY_PORT,
          'soap_version'   => SOAP_1_2,
          'location'       => URL,
          'trace'          => 1,
          'exceptions'     => 0
          ));
  $results=$client->loginCms(array('in0'=>$CMS));
  file_put_contents("request-loginCms.xml",$client->__getLastRequest());
  file_put_contents("response-loginCms.xml",$client->__getLastResponse());
  if (is_soap_fault($results))
    {exit("SOAP Fault: ".$results->faultcode."\n".$results->faultstring."\n");}
  return $results->loginCmsReturn;
}
#==============================================================================
function ShowUsage($MyPath)
{
  printf("Uso  : %s Arg#1 Arg#2\n", $MyPath);
  printf("donde: Arg#1 debe ser el service name del WS de negocio.\n");
  printf("  Ej.: %s wsfe\n", $MyPath);
}
#==============================================================================
ini_set("soap.wsdl_cache_enabled", "0");
if (!file_exists(CERT)) {exit("Failed to open ".CERT."\n");}
if (!file_exists(PRIVATEKEY)) {exit("Failed to open ".PRIVATEKEY."\n");}
if (!file_exists(WSDL)) {exit("Failed to open ".WSDL."\n");}
if ( $argc < 2 ) {ShowUsage($argv[0]); exit();}
$SERVICE=$argv[1];
CreateTRA($SERVICE);
$CMS=SignTRA();
$TA=CallWSAA($CMS);
if (!file_put_contents("TA.xml", $TA)) {exit();}
?>

Gerardo Gorelik Zonis

unread,
Jun 25, 2015, 10:44:18 PM6/25/15
to php...@googlegroups.com, xa...@00101010.com.ar, jul...@coccia.com
Encontre el problema.

El contenido de uno de los archivos estaba mal.


#=============================

=================================================
define ("WSDL", "wsaa.wsdl");     # The WSDL corresponding to WSAA
define ("CERT", "ghf.crt");       # The X.509 certificate in PEM format
define ("PRIVATEKEY", "ghf.key"); # The private key correspoding to CERT (PEM)
define ("PASSPHRASE", "dsfafafdasfas"); # The passphrase (if any) to sign

define ("PROXY_HOST", "10.20.152.112"); # Proxy IP, to reach the Internet
define ("PROXY_PORT", "80");            # Proxy TCP port
define ("URL", "https://wsaahomo.afip.gov.ar/ws/services/LoginCms");
#define ("URL", "https://wsaa.afip.gov.ar/ws/services/LoginCms");


Dentro del archivo que definen con nombre ghf.crt deben ingresar el certificado que les da via web la afip. (paso 3) El que comienza...  -----BEGIN CERTIFICATE-----  

Dentro del archivo que definen con nombre ghf.key deben ingresar el contenido del archivo generado en el openssl (Paso 1)

en PASSPHRASE ... deben escribir la clave que ingresaron en las lineas de openssl ... paso 1 y paso 2


No me fue necesario utilizar el archivo .tmp


Espero que les sirva


saludos






El jueves, 25 de junio de 2015, 16:57:33 (UTC-3), Gerardo Gorelik Zonis escribió:

Daniel, he probado diferentes maneras y no he conseguido salir del error : error getting private key.

Ha esta altura estoy pensando que es un error en el formato con el que tengo guardado el certificado.

He realizado los siguientes pasos para generar el CERT (supuestamente archivo en formato PEM)
1- openssl genrsa -out claveLaloGZXXX 1024
2-

Marcos Piñero

unread,
Jul 3, 2015, 5:08:05 PM7/3/15
to php...@googlegroups.com, jul...@coccia.com, xa...@00101010.com.ar
Gerardo, tengo el mismo problema que tenían uds.
Warning:
openssl_pkcs7_sign(): error getting private key in D:\Documents\Mis
Webs\wsaa-client-php\wsaa-client.php on line 64
ERROR generating PKCS#7 signature

He probado de todo, de todos modos no entiendo bien lo PASSPHRASE

Me podrían dar una mano, muchas gracias.

Gerardo Gorelik Zonis

unread,
Jul 3, 2015, 6:09:53 PM7/3/15
to php...@googlegroups.com, xa...@00101010.com.ar, jul...@coccia.com
Marcos, el passphrase es la clave privada que vos utilizaste cuando generaste las claves a traves del openssl.

ejemplo:
1-openssl genrsa -out passphrase 1024

y luego generas con
2- openssl req -new -key passphrase -subj "/C=AR/O=subj_o/CN=subj_cn/serialNumber=CUIT subj_cuit" -out MiPedidoCSR

Fijate los pasos que seguí para incluir los contenidos de los archivos en el primer mail. Tb fijate que este todo dentro del mismo ambito (los archivos a la misma altura que el php)

te paso actualmente como lo tengo funcionando al codigo... pronto paso una clase con los metodos para que sea mas practico.

saludos

<?php

define("WSDLA", "wsaa.wsdl");     # The WSDL corresponding to WSAA
define("WSDL", "wsdl.wsdl");     # The WSDL corresponding to WSAA
define("CERT", "ghf.crt");       # The X.509 certificate in PEM format - el del paso 3.. empieza el archivo con -----BEGIN CERTIFICATE-----
define("PRIVATEKEY", "ghf.key"); # The private key correspoding to CERT (PEM) .. paso 1, empieza archivo con -----BEGIN RSA PRIVATE KEY-----
define("PASSPHRASE", "claveLaloGZ-Credifiar"); # The passphrase (if any) to sign .. clave que se coloco en paso 1 y 2
define("PROXY_HOST", "10.20.152.113"); # Proxy IP, to reach the Internet
define("PROXY_PORT", "80");            # Proxy TCP port
define("URL", "https://wsaahomo.afip.gov.ar/ws/services/LoginCms");  # ambiente de prueba


ini_set("soap.wsdl_cache_enabled", "0");
ini_set('soap.wsdl_cache_ttl', "0");

function getCAE() {

   
}

function CreateTRA($SERVICE) {
    $TRA = new SimpleXMLElement(
                    '<?xml version="1.0" encoding="UTF-8"?>' .
                    '<loginTicketRequest version="1.0">' .
                    '</loginTicketRequest>');
    $TRA->addChild('header');
    $TRA->header->addChild('uniqueId', date('U'));

    $TRA->header->addChild('generationTime', date('c', date('U') - 60));
    $TRA->header->addChild('expirationTime', date('c', date('U') + 60));
    $TRA->addChild('service', $SERVICE);
    $TRA->asXML('TRA.xml');
}

function SignTRA() {
    $STATUS = openssl_pkcs7_sign("TRA.xml", "TRA.tmp", "file://" . CERT, array("file://" . PRIVATEKEY, PASSPHRASE), array(), !PKCS7_DETACHED

    );
    if (!$STATUS) {
        exit("ERROR generating PKCS#7 signature\n");
    }
    $inf = fopen("TRA.tmp", "r");
    $i = 0;
    $CMS = "";
    while (!feof($inf)) {
        $buffer = fgets($inf);
        if ($i++ >= 4) {
            $CMS.=$buffer;
        }
    }
    fclose($inf);
    unlink("TRA.tmp");
    return $CMS;
}

function CallWSAA($CMS) {
    $client = new SoapClient(WSDLA, array(

                'soap_version' => SOAP_1_2,
                'location' => URL,
                'trace' => 1,
                'exceptions' => 0
            ));
    $results = $client->loginCms(array('in0' => $CMS));

    file_put_contents("request-loginCms.xml", $client->__getLastRequest());
    file_put_contents("response-loginCms.xml", $client->__getLastResponse());
    if (is_soap_fault($results)) {
        exit("SOAP Fault: " . $results->faultcode . "\n" . $results->faultstring . "\n");
    }
    return $results->loginCmsReturn;
}

$SERVICE = $argv[1];
CreateTRA($SERVICE);
$CMS = SignTRA();
$TA = CallWSAA($CMS);


if (!file_put_contents("TA.xml", $TA)) {
    exit();
}
$ta_xml = simplexml_load_string($TA);
$TOKEN = $ta_xml->credentials->token;
$SIGN = $ta_xml->credentials->sign;

$opts = array(
    'ssl' => array('ciphers' => 'RC4-SHA')
);

$client_wsfe = new SoapClient(WSDL, array(
            'trace' => true,
            'encoding' => 'UTF-8',
            'cache_wsdl' => WSDL_CACHE_BOTH,
            //'ssl_method' => SOAP_SSL_METHOD_SSLv3,
            'stream_context' => stream_context_create($opts),
            "exceptions" => false
        ));



// metodo para probar si se conecta
//$results_AutRequest = $client_wsfe->FEDummy();


/*
//////////////////
$results_AutRequest = $client_wsfe->FECompUltimoAutorizado(
         array(
            'Auth' => array
                (
                'Token' => $TOKEN,
                'Sign' => $SIGN,
                'Cuit' => 20264678014,
               
            ),
             'PtoVta' => 1,
             'CbteTipo' => 6 //1 factura A - 6 factura B
       
        )
        );
 
 */

//////////////////
/*$results_AutRequest = $client_wsfe->FEParamGetTiposTributos(
         array(
            'Auth' => array
                (
                'Token' => $TOKEN,
                'Sign' => $SIGN,
                'Cuit' => 20264678014,
               
            )
        )
        );*/
/*
//////////////////
$results_AutRequest = $client_wsfe->FEParamGetTiposIva(
         array(
            'Auth' => array
                (
                'Token' => $TOKEN,
                'Sign' => $SIGN,
                'Cuit' => 20264678014,
               
            )
        )
        );
 */
 $imp_total = 159.05;
$imp_total_conceptos = 0;
$imp_neto = 125;
$imp_operaciones_exentas = 0;
$imp_iva = 26.25;
$imp_trib = 7.80;



$results_AutRequest = $client_wsfe->FECAESolicitar(
        array(
            'Auth' => array
                (
                'Token' => $TOKEN,
                'Sign' => $SIGN,
                'Cuit' => 20264678014
            ),
            'FeCAEReq' => array
                (
                'FeCabReq' => array
                    (
                    'CantReg' => 1,
                    'PtoVta' => 1,
                    'CbteTipo' => 6 //1 factura A - 6 factura B
                ),
                'FeDetReq' => array
                    (
                    'FECAEDetRequest' => array
                        (
                        'Concepto' => 1, // Productos y servicios
                        'DocTipo' => 96, //80 (CUIT) - 96 DNI
                        'DocNro' => 26467801,
                        'CbteDesde' => 2,
                        'CbteHasta' => 2,
                        'CbteFch' => date('Ymd'),
                        'ImpTotal' => round($imp_total, 2),
                        'ImpTotConc' => round($imp_total_conceptos, 2),
                        'ImpNeto' => round($imp_neto, 2),
                        'ImpOpEx' => round($imp_operaciones_exentas, 2),
                        'ImpTrib' => round($imp_trib, 2),
                        'ImpIVA' => $imp_iva,
                        'FchServDesde' => '',
                        'FchServHasta' => '',
                        'FchVtoPago' => '',
                        'MonId' => 'PES',
                        'MonCotiz' => 1,
                        'Tributos' => array(
                            'Tributo' => array(
                                'Id' => 99,
                                'Desc' => 'Impuesto municipal matanza',
                                'BaseImp' => 150,
                                'Alic' => 5.2,
                                'Importe' => 7.8
                            )
                        ),
                        'Iva' => array(
                            'AlicIva' => array(
                                'Id' => 5,
                                'BaseImp' => 125,
                                'Importe' => 26.25
                            )
                        )
                    )
                )
            )
        )
);

// los resultados los pongo en un archivo
file_put_contents(microtime(true) . '_results_AutRequest.txt', var_export($results_AutRequest, true));
file_put_contents(microtime(true) . '_results_AutRequest_soap.txt', var_export($client_wsfe, true));

?>


Marcos Piñero

unread,
Jul 3, 2015, 6:34:36 PM7/3/15
to php...@googlegroups.com, xa...@00101010.com.ar, jul...@coccia.com
O sea que es el nombre del archivo key?

Gracias por tu respuesta
...

Gerardo Gorelik Zonis

unread,
Jul 3, 2015, 6:43:47 PM7/3/15
to php...@googlegroups.com, jul...@coccia.com, xa...@00101010.com.ar
si, es el nombre del archivo key, pero lo definis para hacer la conexion, no para ubicar ese archivo.

Hiciste todos los pasos sin inconveniente? lo estas haciendo sobre SO windows y lo corres por consola de DOS ?
...

Marcos Piñero

unread,
Jul 3, 2015, 6:45:50 PM7/3/15
to php...@googlegroups.com, xa...@00101010.com.ar, jul...@coccia.com
Ahh, no, lo pruebo en Firefox, capaz que es eso?
...

Gerardo Gorelik Zonis

unread,
Jul 3, 2015, 6:49:16 PM7/3/15
to php...@googlegroups.com, xa...@00101010.com.ar, jul...@coccia.com
tene en cuenta lo siguiente para ejecutar por consola.

tener el php.exe definido como variable global, asi podes ejecutarlo desde cualquier ubicacion.

hacer phpinfo desde la consola ... php.exe phpinfo.php >> info.txt  .. y ahi fijate si tenes habilitado el soap y el openssl .. utilizan diferentes php.ini el de consola y el del navegador.

saludos
...

Marcos Piñero

unread,
Jul 4, 2015, 11:47:16 AM7/4/15
to php...@googlegroups.com, jul...@coccia.com, xa...@00101010.com.ar
Tenes razón en el phpinfo de la consola no veo ni el SOAP ni el openssl, sí los veo desde el navegador
De todos modos me parece que no levanta el php.ini, te paso el resultado del txt

Usage: php [options] [-f] <file> [--] [args...]
   php [options] -r <code> [--] [args...]
   php [options] [-B <begin_code>] -R <code> [-E <end_code>] [--] [args...]
   php [options] [-B <begin_code>] -F <file> [-E <end_code>] [--] [args...]
   php [options] -S <addr>:<port> [-t docroot]
   php [options] -- [args...]
   php [options] -a

  -a               Run interactively
  -c <path>|<file> Look for php.ini file in this directory
  -n               No php.ini file will be used
  -d foo[=bar]     Define INI entry foo with value 'bar'
  -e               Generate extended information for debugger/profiler
  -f <file>        Parse and execute <file>.
  -h               This help
  -i               PHP information
  -l               Syntax check only (lint)
  -m               Show compiled in modules
  -r <code>        Run PHP <code> without using script tags <?..?>
  -B <begin_code>  Run PHP <begin_code> before processing input lines
  -R <code>        Run PHP <code> for every input line
  -F <file>        Parse and execute <file> for every input line
  -E <end_code>    Run PHP <end_code> after processing all input lines
  -H               Hide any passed arguments from external tools.
  -S <addr>:<port> Run with built-in web server.
  -t <docroot>     Specify document root <docroot> for built-in web server.
  -s               Output HTML syntax highlighted source.
  -v               Version number
  -w               Output source with stripped comments and whitespace.
  -z <file>        Load Zend extension <file>.

  args...          Arguments passed to script. Use -- args when first argument
                   starts with - or script is read from stdin

  --ini            Show configuration file names

  --rf <name>      Show information about function <name>.
  --rc <name>      Show information about class <name>.
  --re <name>      Show information about extension <name>.
  --rz <name>      Show information about Zend extension <name>.
  --ri <name>      Show configuration for extension <name>.

Gracias nuevamente por todo
...

Marcos Piñero

unread,
Jul 4, 2015, 12:50:16 PM7/4/15
to php...@googlegroups.com, jul...@coccia.com, xa...@00101010.com.ar
Ejecuté por consola php -i y aparecen tanto el SOAP como el openssl
Pero ejecuto php.exe -f wass-client.php y me dice:
SOAP Fault: HTTP
Could not connect to host

Perdón por lo rompe bolas
 
...

Tordek

unread,
Jul 4, 2015, 2:38:21 PM7/4/15
to php...@googlegroups.com
Tenés SOAP, pero no podés acceder a la URL del ws. ¿Qué pasa si tratás
de entrar a la URL directo con un navegador? Debería ser una de las
dos definidas en el archivo:
define ("URL", "https://wsaa.afip.gov.ar/ws/services/LoginCms");
> --
> Has recibido este mensaje porque estás suscrito al grupo "Grupo PHP
> Argentina" de Grupos de Google.
> Para anular la suscripción a este grupo y dejar de recibir sus mensajes,
> envía un correo electrónico a php-arg+u...@googlegroups.com.
> Para publicar en este grupo, envía un correo electrónico a
> php...@googlegroups.com.

Gerardo Gorelik Zonis

unread,
Jul 5, 2015, 3:50:04 PM7/5/15
to php...@googlegroups.com
Perfecto lo que dice Tordek, proba directamente si anda la url.

Me ha pasado varias veces que esta caido.

Saludos

Marcos Piñero

unread,
Jul 6, 2015, 9:33:48 AM7/6/15
to php...@googlegroups.com
Si esta respuesta es para mi, ejecute https://wsaahomo.afip.gov.ar/ws/services/LoginCms en el navegador mi respondió:

LoginCms

Hi there, this is an AXIS service!

Perhaps there will be a form for invoking the service here...

Gerardo Gorelik Zonis

unread,
Jul 6, 2015, 10:25:13 AM7/6/15
to php...@googlegroups.com
la dirección a probar.. que encontre varias veces caida es:

https://wswhomo.afip.gov.ar/wsfev1/service.asmx?WSDL

ahora esta funcionando :)

Marcos Piñero

unread,
Jul 6, 2015, 10:36:01 AM7/6/15
to php...@googlegroups.com
Puedo acceder a esa dir, veo un WSDL
...

Gerardo Gorelik Zonis

unread,
Jul 6, 2015, 10:40:33 AM7/6/15
to php...@googlegroups.com
aja, y te sigue diciendo lo de Could not connect to host ...

si te fijas hay dos llamadas a la afip...

la primera es al wsaa para autenticar y luego al wsdl para utilizar alguna funcion

en el codigo que habia puesto anteriormente te va haciendo archivos de las conexiones.. te hace algun archivo??
...

Marcos Piñero

unread,
Jul 6, 2015, 10:47:21 AM7/6/15
to php...@googlegroups.com
Si, 3 xml
request-loginCms.xml
response-loginCms.xml
TRA.xml
...

Gerardo Gorelik Zonis

unread,
Jul 6, 2015, 11:04:36 AM7/6/15
to php...@googlegroups.com
aja, pasame el request y response... asi puedo ver si tenes algo mal armado y que fue lo q te contesto
...

Marcos Piñero

unread,
Jul 6, 2015, 11:10:01 AM7/6/15
to php...@googlegroups.com
Response vacio y request

<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://wsaa.view.sua.dvadac.desein.afip.gov"><env:Body><ns1:loginCms><ns1:in0>
MIIG1wYJKoZIhvcNAQcCoIIGyDCCBsQCAQExCzAJBgUrDgMCGgUAMIIBIgYJKoZI
hvcNAQcBoIIBEwSCAQ88P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYt
OCI/Pg0KPGxvZ2luVGlja2V0UmVxdWVzdCB2ZXJzaW9uPSIxLjAiPjxoZWFkZXI+
PHVuaXF1ZUlkPjE0MzYxOTQ2NTI8L3VuaXF1ZUlkPjxnZW5lcmF0aW9uVGltZT4y
MDE1LTA3LTA2VDExOjU2OjMyLTAzOjAwPC9nZW5lcmF0aW9uVGltZT48ZXhwaXJh
dGlvblRpbWU+MjAxNS0wNy0wNlQxMTo1ODozMi0wMzowMDwvZXhwaXJhdGlvblRp
bWU+PC9oZWFkZXI+PHNlcnZpY2UvPjwvbG9naW5UaWNrZXRSZXF1ZXN0Pg0KoIID
tjCCA7IwggKaoAMCAQICCBGBVJcLX6xlMA0GCSqGSIb3DQEBBQUAMEMxJTAjBgNV
BAMMHEFGSVAgVGVzdGluZyBDb21wdXRhZG9yZXMgQ0ExDTALBgNVBAoMBEFGSVAx
CzAJBgNVBAYTAkFSMB4XDTE1MDcwMzIyMjcxOFoXDTE4MDMyOTIyMjcxOFowUDEV
MBMGA1UEAwwMbWF0cmljdWxhZG9zMRkwFwYDVQQFExBDVUlUIDIwMjUxNzQ4MDU2
MQ8wDQYDVQQKDAZjb2RuZXQxCzAJBgNVBAYTAkFSMIGfMA0GCSqGSIb3DQEBAQUA
A4GNADCBiQKBgQDDj0sLs96uxuKk09t8zR2h0UiqGz8b7QMrXIU508OXamB3yJxv
E5q8i+VYFeZU4sITFnZ9H8hbisnJ+ypON74QghNwykQhvtEE0ds6wmIGbtnu4kvQ
J94sTa0QN4HEHQ43uyCAmey+bK78EawDbO/B6SbIL20vPaH1zGJKkAaWXwIDAQAB
o4IBHzCCARswDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8EBAMCBeAwHQYDVR0OBBYE
FDMCpZS2SK6y7ZbvWrrfWHw4d/NiMB8GA1UdIwQYMBaAFER07rScJt9W4cEN61cL
kBk2PZYBMIG6BgNVHSAEgbIwga8wgawGDisGAQQBgbtjAQIBAgEBMIGZMIGWBggr
BgEFBQcCAjCBiR6BhgBDAGUAcgB0AGkAZgBpAGMAYQBkAG8AIABwAGEAcgBhACAA
YwBvAG0AcAB1AHQAYQBkAG8AcgBlAHMAIABzAG8AbABvACAAdgBhAGwAaQBkAG8A
IABlAG4AIABlAG4AdABvAHIAbgBvAHMAIABkAGUAIABkAGUAcwBhAHIAcgBvAGwA
bABvMA0GCSqGSIb3DQEBBQUAA4IBAQA5dUab7gu1CYwMnPygw+KsZuqiMRPg3XP5
41IlmBKO/4XQtS0N/+3Gjk8OG/o/C/uBxR2HjwQQkwXqeQY5tdm5irESCnfXuwmf
Ex+dSlZ6B842LUmE8CttXTOPsO62Njtp7HpPMGlEsmy31jGRmbQCPuJkbCrYizZv
hR+D4FbpM5kdfOKuhM5JjexDnsVB6WX83lBEA3wsCH+be5RI69yrO5G6O1XRBsnA
oSp7yo/l9x6R9erHLxE/qXk2FUXvGUrrH5L1TqP1CAIwFn01gUoysdYB7ecYdKI4
reDn8wUbdLgJLYmc6J4CRA7b/jjcZfXwESQJaSi5ZLujEOGhdp0oMYIB0DCCAcwC
AQEwTzBDMSUwIwYDVQQDDBxBRklQIFRlc3RpbmcgQ29tcHV0YWRvcmVzIENBMQ0w
CwYDVQQKDARBRklQMQswCQYDVQQGEwJBUgIIEYFUlwtfrGUwCQYFKw4DAhoFAKCB
2DAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0xNTA3
MDYxNDU3MzJaMCMGCSqGSIb3DQEJBDEWBBT4YDDqDVO72JDCjZiHm9RZtiV3QzB5
BgkqhkiG9w0BCQ8xbDBqMAsGCWCGSAFlAwQBKjALBglghkgBZQMEARYwCwYJYIZI
AWUDBAECMAoGCCqGSIb3DQMHMA4GCCqGSIb3DQMCAgIAgDANBggqhkiG9w0DAgIB
QDAHBgUrDgMCBzANBggqhkiG9w0DAgIBKDANBgkqhkiG9w0BAQEFAASBgCg2mwMv
CQAeXc+0qyoFkgQ0N0SPKCAhu432rwSSs+EManNohAR0fTNzlXeGtPwAGBL/iuSq
l7a10scSnR8QWJoF6Cpfjh+3uHOsJtKyqoQwk1sgCTZ0whBJzCXInFQHRXkNOJfg
/1O9fXudm807TZrjAD4PAeGpBjVqtZwuVzju

</ns1:in0></ns1:loginCms></env:Body></env:Envelope>
...

Gerardo Gorelik Zonis

unread,
Jul 6, 2015, 2:00:18 PM7/6/15
to php...@googlegroups.com
el request esta bien... no veo nada raro.

fijate lo siguiente.. en el wsaa.wsdl
si te figura la url  <wsdlsoap:address location="https://wsaahomo.afip.gov.ar/ws/services/LoginCms"/>

si esta bien.. lo unico que se me ocurre que tengas algun firewall que te bloquee
...

Marcos Piñero

unread,
Jul 6, 2015, 2:31:29 PM7/6/15
to php...@googlegroups.com
Es raro porque el address location está bien y no tengo firewall y además me da el mismo error desde 2 pc distintas, así que puede ser algo en el crt y/o key, ya no se que hacer
...

Paula Bourlot

unread,
Feb 1, 2016, 8:59:50 AM2/1/16
to Grupo PHP Argentina
Me podrías mandar a mi también? 
Gracias!!

El jueves, 13 de octubre de 2011, 11:21:36 (UTC-3), Xava escribió:
dale, por la tarde lo subo :)
y agrego unos TODO

2011/10/13 Andrés Morales <andresfernandomorales@gmail.com>


El 13 de octubre de 2011 02:08, BARBAZUL <tere...@gmail.com> escribió:

Uhhh esto me viene al pelo. Yo había hecho la implementación de esta API hace algunos años pero ni se donde quedo ese código y encima debe estar de desactualizado y JUSTO esta semana salio que alguien me lo pidió. AL Peloooo.

Nota: Sale un github de esto, no?


Debería subirse a github... y lo laburamos en conjunto...
 
El 12/10/2011 21:13, "xava *" <xa...@00101010.com.ar> escribió:
hacer esto, es una rompida de huevos

Basicamente son dos clases,
afip/wsaa.class.php
afip/wsfe.class.php
en el archivo index.php hay un ejemplo de como se usan,
el codigo esta basado en los ejemplos oficiales de la AFIP, para poder usarlo tienen que pedir unos certificados por mail a la AFIP (lo hizo mi amigo, no se donde es pero busquen que debe estar facil) una vez que tienen los certifcados los guardan dentro de la carpeta keys/

cualquier duda pregunten,
la clase wsfe no tiene soporte para envio en lotes de facturas (comprobantes) pero es facil de implementarlo si no necesitan

aclaro, antes que nada, que todo puede estar mucho mejor, soy conciente de eso, pero tenia que sacarlo rapido asi que ahi quedo, aunque aun le sigo trabajando detalles

espero les sirva!
adjunto algunos links de interes (si no van a safar de leer)


información técnica oficial sobre servicios web
PyAfipWs (la documentacion de como funciona es lo mismo, ahi estan los links a donde pedir el cert y demas)
http://www.sistemasagiles.com.ar/trac/wiki/PyAfip
http://www.sistemasagiles.com.ar/trac/wiki/FacturaElectronicaPython

Manual de Uso PyAfipWs: Interfase y herramientas para servicios web AFIP (Factura Electrónica y otros)
http://www.sistemasagiles.com.ar/trac/wiki/ManualPyAfipWs

- otros
PyRece: Aplicativo Autorizador y Generador de Facturas Electrónicas  (usa PyAfipWs)
http://www.sistemasagiles.com.ar/trac/wiki/PyRece





2011/10/12 Dante Marcelo <dant...@gmail.com>
hola pasalas estoy en el lugar donde trabajo me pidieron algo asi...y no tengo idea para donde correr jajaja

--
Has recibido este mensaje porque estás suscrito al grupo "Grupo PHP Argentina" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a php...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a php-arg+unsubscribe@googlegroups.com

Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/php-arg?hl=es.

--
Has recibido este mensaje porque estás suscrito al grupo "Grupo PHP Argentina" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a php...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a php-arg+unsubscribe@googlegroups.com

Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/php-arg?hl=es.

--
Has recibido este mensaje porque estás suscrito al grupo "Grupo PHP Argentina" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a php...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a php-arg+unsubscribe@googlegroups.com

Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/php-arg?hl=es.

--
Has recibido este mensaje porque estás suscrito al grupo "Grupo PHP Argentina" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a php...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a php-arg+unsubscribe@googlegroups.com

Gerardo Gorelik Zonis

unread,
Feb 1, 2016, 7:09:11 PM2/1/16
to php...@googlegroups.com
en estos dias estoy retomando el tema que lo habia dejado.. lo emprolijo y lo subo

saludos

Gerardo Gorelik Zonis
Ing. en Sistemas de Información
Colón - Entre Ríos - Argentina
www.estiloactivo.com

El 31 de enero de 2016, 19:45, Paula Bourlot<paulab...@gmail.com> escribió:
Me podrías mandar a mi también? 
Gracias!!

El jueves, 13 de octubre de 2011, 11:21:36 (UTC-3), Xava escribió:
dale, por la tarde lo subo :)
y agrego unos TODO

2011/10/13 Andrés Morales <andresfern...@gmail.com>


2011/10/12 Dante Marcelo <dant...@gmail.com>
Para anular tu suscripción a este grupo, envía un correo electrónico a php-arg+u...@googlegroups.com

Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/php-arg?hl=es.

--
Has recibido este mensaje porque estás suscrito al grupo "Grupo PHP Argentina" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a php...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a php-arg+u...@googlegroups.com

Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/php-arg?hl=es.

--
Has recibido este mensaje porque estás suscrito al grupo "Grupo PHP Argentina" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a php...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a php-arg+u...@googlegroups.com

Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/php-arg?hl=es.

--
Has recibido este mensaje porque estás suscrito al grupo "Grupo PHP Argentina" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a php...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a php-arg+u...@googlegroups.com

Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/php-arg?hl=es.

--
Has recibido este mensaje porque estás suscrito a un tema del grupo "Grupo PHP Argentina" de Grupos de Google.
Para anular la suscripción a este tema, visita https://groups.google.com/d/topic/php-arg/lJ_PQshAaLU/unsubscribe.
Para anular la suscripción a este grupo y a todos sus temas, envía un correo electrónico a php-arg+u...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a php...@googlegroups.com.
Visita este grupo en https://groups.google.com/group/php-arg.

Para acceder a más opciones, visita https://groups.google.com/d/optout.

Miguel Angel Martínez

unread,
Feb 1, 2016, 8:01:58 PM2/1/16
to php...@googlegroups.com

Gracias!

Tordek

unread,
Feb 1, 2016, 10:49:35 PM2/1/16
to php...@googlegroups.com
Pueden ver la versión que yo armé acá:

https://bitbucket.org/tordek/afiphp

Gracias!

Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a php-arg+u...@googlegroups.com.

Gerardo Gorelik Zonis

unread,
Mar 19, 2016, 10:35:11 PM3/19/16
to Grupo PHP Argentina
Tordek, has tenido problema con el pasaje a producción??

He cambiado la url 

Luego en AFIP he entrado a Administración de Certificados Digitales  (previamente generé un nuevo CSR), ahi generé el alias y me dió el certificado.

Copie contenido de lo que me dió en mi archivo csr y luego en mi .key el que obtuve con el openssl.

Luego entre a Administrador de Relaciones de Clave Fiscal y relacioné el alias generado en punto anterior con facturacion electronica (F. 3283/E)

peroooo... al querer generar un CAE me tira 
    'Code' => 600,
     'Msg' => 'ValidacionDeToken: Error al verificar hash: VerificacionDeHash: No validó la firma digital.

he buscado diferentes cosas pero no encuentro nada.. el openssl esta en pkcs#10, me genera el ta.xml con la firma y token


recordas algun otro paso que has hecho??

saludos y gracias

Gerardo Gorelik Zonis

unread,
Mar 19, 2016, 11:12:47 PM3/19/16
to Grupo PHP Argentina
Encontre el problema.... acordarse de reemplazar el archivo wsdl y wsaa con sus valores de producción...

en el wsdl

Este servicio se llama en Homologación desde:


Para visualizar el WSDL en Homologación:


Este servicio se llama en Producción desde:


Para visualizar el WSDL en Producción:


y en wsaa sacar homo donde aparezca...

saludoss

malditos...@gmail.com

unread,
Mar 23, 2016, 9:23:08 AM3/23/16
to Grupo PHP Argentina, xa...@00101010.com.ar
Hola. Estoy empezando en este tema. Bajé las librerías y las instalé en un ubuntu. La parte de wsaa anda (genera los dos archivos xml TA y TRA. Pero cuando quiere obtener el el ultimo nro, devuelve false y muere ahí. Tenés idea que puede estar pasando? Tengo el pyrece andando en el mismo servidor así que se me ocurre que puede ser algún cambio en la afip.

Desde ya muchas gracias.

Tordek

unread,
Mar 23, 2016, 10:03:40 AM3/23/16
to php...@googlegroups.com
¿Qué querés decir con "devuelve false"? var_dump del UltimoNumero te devuelve "(bool) false"?

¿Tenés todos los errores activados, te dice algo? ¿Estás usando el ejemplo en examples/factura.php?

Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a php-arg+u...@googlegroups.com.

malditos...@gmail.com

unread,
Mar 23, 2016, 10:17:35 AM3/23/16
to Grupo PHP Argentina
Hola. Gracias por tu respuesta tan rápida. Bajé el adjunto afip.tar.gz que está en uno de los mensajes de este foro y ejecuto el index.php. En este rato estuve probando y me di cuenta que el servidor wsfe que trae configurado es viejo. lo cambié y ahora estoy probando a ver si lo puedo hacer andar. Tal vez haya una actualizacion de las clases wsaa.class.php y wsfe_class.php. pero no las encontré.  Sabés si existe una actualización y de dónde bajarla? Gracias otra vez. Pablo

Tordek

unread,
Mar 23, 2016, 10:52:06 AM3/23/16
to php...@googlegroups.com
La verdad no tengo idea de ese archivo; el mio, que hasta donde yo sé está actualizado, lo podés probar acá: https://bitbucket.org/tordek/afiphp/branch/factura_electronica

malditos...@gmail.com

unread,
Mar 23, 2016, 11:58:19 AM3/23/16
to Grupo PHP Argentina
Lo voy a probar.  Cualquier cosa te consulto. Gracias. Muy amable.

Gaston Levy Mayo

unread,
Apr 8, 2016, 5:09:52 PM4/8/16
to Grupo PHP Argentina
Buenas Tardes, como estas? Queria saber si tenias las clases de php para factura electronica. De ser asi, si me las podes mandar te lo agradeceria.
Saludos,
Gaston.

El miércoles, 12 de octubre de 2011, 11:37:26 (UTC-3), Xava escribió:
si Muchas Gracias Nachito,
ya esta resuelto, termine armando un par de clases propias para la
coneccion con WSAA y WSFE,
si alguien las llega a necesitar avise!


On Oct 8, 8:46 pm, nachi77o <nacholang...@gmail.com> wrote:
> revisaste la doc oficial de la afip? hay un ejemplito en php
>
> http://www.afip.gov.ar/ws/#WSFeDet
>
> Exitos!
>
> On 15 ago, 10:48, "* du!" <xav...@gmail.com> wrote:
>
>
>
>
>
>
>
> > Hola a todos,
> > me estoy metiendo en esto de la factura electronica, que tengo que
> > desarrollar prontamente en php corriendo bajo linux
> > vi que hay varias libs, como afipws y otras
>
> > pero no queria arrancar si pedir un consejo por aca,
> > recomiendan alguna otra lib? cosas a tener en cuenta? experiencias?
>
> > Gracias!

Gerardo Gorelik Zonis

unread,
Apr 10, 2016, 4:46:55 PM4/10/16
to Grupo PHP Argentina

Ahi adjunte la clase afipclass.php

A tener en cuenta del ejemplo
- Voy tomando el CAE uno por uno, no paso por lote, no me funciono y no quise renegar je je
- Vas a ver unos objetos facturas que son los que he utilizado para ir registrando segun mi conveniencia en el sistema.
- En caso de errores, lo voy registrando para ver que puede haber sucedido. He visto que no siempre se devuelve el error en la variable que dice AFIP por lo que fui viendo para ir registrandolo.


una vez que lo incluyas podes usarlo de la siguiente manera:

--------------------------------------------------------------------------
// incluir libreria afip
Import::Package("lib.afip.AFIPClass");
ini_set("soap.wsdl_cache_enabled", "0");
ini_set('soap.wsdl_cache_ttl', "0");


$cuit = XXXXXXXXX;
$afip = new AFIP();
// seteo la ubicacion de donde estan los archivos crt
$afip->setUbicacionparam('/../../modules/consumo/config/');

// seteo donde quiero ubicar los temporales para debug/log
$afip->setUbicaciontemp('/../../modules/consumo/temp');

$afip->setWsdl('wsdl.wsdl');
$afip->setWsaa('wsaa.wsdl');

$afip->setCert("ghf.crt"); //ghf.crt
$afip->setPrivatekey("ghf.key"); //ghf.key
$afip->setCuit($cuit); 

$afip->ConectarWSAA();
$afip->conexionWSDL();

// en la variable tildadas vienen para mi los id de las facturas de los cuales tengo q obtener el CAE
$cantreg = count($_REQUEST['tildadas']);
if ($cantreg > 0) {

$facturaDAO = new co_facturaDAO();
for ($i = 0; $i < $cantreg; $i++) {

$facturaid = $_REQUEST['tildadas'][$i];
$facturaPO = new Co_facturaPO();
$facturaPO->setKey($facturaid);
$facturaDAO->BuscarPorKey($facturaPO);

// armo un arreglo para setear automaticamente los parametros a enviar a AFIP
$arreglo = array('tipodocumentoid' => $facturaPO->getTipodocumentoid(), 'numerodocumento' => $facturaPO->getNumerodocumento(), 'cuit' => $facturaPO->getCuit(),
'importeneto' => $facturaPO->getImporteneto(), 'importeintereses' => $facturaPO->getImporteintereses(), 'importeiva' => $facturaPO->getImporteiva(),
'nrofactura' => $facturaPO->getNrofactura(), 'importetotal' => $facturaPO->getImportetotal(), 'capitalafinanciar' => $facturaPO->getCapitalafinanciar(),
'facturaid' => $facturaid, 'tipofactura' => $facturaPO->getTipofactura(), 'puntoventa' => $facturaPO->getPuntoventa());
// llamo a la libreria para armar los parametros
$paramsfactu = $afip->armadoFacturaUnica($arreglo, $facturaPO->getTipofactura(), $facturaPO->getPuntoventa());

//termino de definir los parametros
$params = array(
'Auth' => array
(
'Token' => $afip->getToken(),
'Sign' => $afip->getSign(),
'Cuit' => $cuit
),
'FeCAEReq' => $paramsfactu);

// realizo la llamada
$resultado = $afip->llamarmetodo('FECAESolicitar', $params);
//obtengo el resultado
$estado = $resultado->FECAESolicitarResult->FeCabResp->Resultado;
$error = 0;
if ($estado == 'A') { // transaccion ok, registro el CAE
$afipPO = new Afip_facturaPO();
$afipPO->setCAE($resultado->FECAESolicitarResult->FeDetResp->FECAEDetResponse->CAE);
$afipPO->setCAEfechavto($resultado->FECAESolicitarResult->FeDetResp->FECAEDetResponse->CAEFchVto);
$afipPO->setRespuesta('A');
$afipPO->setFacturaid($arreglo['facturaid']);
$afipPO->setTipofactura($arreglo['tipofactura']);
$afipPO->setPuntoventa($arreglo['puntoventa']);
$afipPO->setNrofactura($arreglo['nrofactura']);
$afipPO->setFechaproceso($resultado->FECAESolicitarResult->FeCabResp->FchProceso);
$afipPO->setFechaconexion(date('Y-m-d H:i:s'));
$afipDAO->insert($afipPO);
} elseif ($estado == 'R') { // transaccion rechazada, registro el error
$afipPO = new Afip_facturaPO();
$afipPO->setRespuesta('N');
$afipPO->setTipofactura($arreglo['tipofactura']);
$afipPO->setPuntoventa($arreglo['puntoventa']);
$afipPO->setNrofactura($arreglo['nrofactura']);
$afipPO->setFechaproceso($resultado->FECAESolicitarResult->FeCabResp->FchProceso);
$afipPO->setFechaconexion(date('Y-m-d H:i:s'));
$afipDAO->insert($afipPO);

$afipErrorDAO = new Afip_erroresDAO();
$afipErrorPO = new Afip_erroresPO();
$afipErrorPO->setAfip_facturaid($afipPO->getKey());
if ($resultado->FECAESolicitarResult->Errors->Err->Code != '') {
$afipErrorPO->setCodigoerror($resultado->FECAESolicitarResult->Errors->Err->Code);
$afipErrorPO->setDetalleerror(str_replace("'", ' ', $resultado->FECAESolicitarResult->Errors->Err->Msg));
} else {
if (is_array($resultado->FECAESolicitarResult->FeDetResp->FECAEDetResponse->Observaciones->Obs)) {
$arreaux = $resultado->FECAESolicitarResult->FeDetResp->FECAEDetResponse->Observaciones->Obs;
$codeaux = '';
$erroraux = '';
for ($h = 0; $h < count($arreaux); $h++) {
$elem = $arreaux[$h];
$codeaux .= $elem->Code . '//';
$erroraux .= str_replace("'", ' ', $elem->Msg) . '//';
}
$afipErrorPO->setCodigoerror($codeaux);
$afipErrorPO->setDetalleerror($erroraux);
} else {
$afipErrorPO->setCodigoerror($resultado->FECAESolicitarResult->FeDetResp->FECAEDetResponse->Observaciones->Obs->Code);
$afipErrorPO->setDetalleerror(str_replace("'", ' ', $resultado->FECAESolicitarResult->FeDetResp->FECAEDetResponse->Observaciones->Obs->Msg));
}
}
$parametros = json_encode($paramsfactu);
$afipErrorPO->setParametros($parametros);
$afipErrorDAO->insert($afipErrorPO);
$error = 1;
break;
} elseif ($estado == 'P') { // rechazo parcial
$afipPO = new Afip_facturaPO();
$afipPO->setRespuesta('P');
$afipPO->setTipofactura($arreglo['tipofactura']);
$afipPO->setPuntoventa($arreglo['puntoventa']);
$afipPO->setNrofactura($arreglo['nrofactura']);
$afipPO->setFechaproceso($resultado->FECAESolicitarResult->FeCabResp->FchProceso);
$afipPO->setFechaconexion(date('Y-m-d H:i:s'));
$afipDAO->insert($afipPO);

$afipErrorDAO = new Afip_erroresDAO();
$afipErrorPO = new Afip_erroresPO();
$afipErrorPO->setAfip_facturaid($afipPO->getKey());
$afipErrorPO->setCodigoerror($resultado->FECAESolicitarResult->Errors->Err->Code);
$afipErrorPO->setDetalleerror($resultado->FECAESolicitarResult->Errors->Err->Msg);
$parametros = json_encode($paramsfactu);
$afipErrorPO->setParametros($parametros);
$afipErrorDAO->insert($afipErrorPO);
$error = 2;
break;
}else{
$error = 1;
break;
}
}
}


------------------------------------------------------------------


saludos
AFIPClass.php

Gerardo Gorelik Zonis

unread,
Sep 6, 2016, 8:58:09 PM9/6/16
to Grupo PHP Argentina
un cambio que tuve que realizar hoy 06-09-16 en la clase porque habia dejado de funcionar...

 public function conexionWSDL() {
........
...
$opts = array(
            'ssl' => array('ciphers' => 'RC4-SHA')
        );

por
 $opts = array(
            'ssl' => array('crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT |
                                    STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT)
        );


Gracias Tordek por darme ideas de que podía suceder!

EGO ECOSYSTEM

unread,
Sep 25, 2022, 8:44:17 AM9/25/22
to Grupo PHP Argentina
Buenos días, me encuentro trabajando en un sistema para una cooperativa, tengo que implementar el CAEA, alguin tiene una librerìa en php para su utilización, lo que necesito es obtener el CAEA y presentar sus facturas.

Muchas Gracias.

Un cordial saludo.

Reply all
Reply to author
Forward
0 new messages