Afip y Factura electronica

7147 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