PHP - Factura Electronica Afip

   
Vista:

Factura Electronica Afip

Publicado por Cristian (94 intervenciones) el 20/11/2015 15:31:11
Hola a todos...
Estoy intentando meterme en el tema de la F.E. pero la verdad no logro comprender. Hace bastante que estoy con esto.
Si alguien tiene una idea se lo voy a agradecer.

Saludos
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Factura Electronica Afip

Publicado por diego (8 intervenciones) el 12/12/2015 15:15:21
Hola Cristian, en que puedo ayudarte con respecto a la factura electronica AFIP (ARGENTINA).

Que no logras comprender ?

En mi caso tengo resuelto la facturacion electronica en codigo nativo DELPHI sin ActiveX.
Otra version escrita en PHP sin componentes activeX.

Usando estas dos tecnologias en que podria ayudarte o explicarte.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Factura Electronica Afip

Publicado por Cristian cristian_fg@hotmail.com (94 intervenciones) el 12/12/2015 16:51:47
Hola Diego... mil gracias en responder.
Mira te cuento genere el certificado en la pagina de la afip pero no se como ni para donde seguir.

Si podes guiarme como seguir en PHP te lo agradeceria mucho.

Mi correo es cristian_fg@hotmail.com

Cordial saludo y una vez mas gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Factura Electronica Afip

Publicado por diego diegopuntano@hotmail.com (8 intervenciones) el 12/12/2015 23:55:58
Hola Cristian.

Bueno antes que nada ya tienes acceso a los servicios del AFIP en modo homologacion ?

Me pondre en contacto contigo via emal asi me detallas donde estas trabado
y darde una guia, asi puedas realizar tu aplicacion en php.

Mi correo es diegopuntano@hotmail.com

Tambien ire posteando por aqui los detalle. Asi compartimos con el resto de la comunidad que pueda estar con problemas similares.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Factura Electronica Afip

Publicado por diego (8 intervenciones) el 14/12/2015 02:18:09
Aqui dejo una pequeña reseña de mis respuestas a email asi esta informacion pueda servir a mas personas.

Voy a dar por descontado que has realizado los pasos que se realizan en el AFIP.
para la obtencion del certificado "xxxxx.crt" asi como la habilitacion del servicio de prueba al cual llamaremos
Homologacion, los cuales tienen una url especifica.

Entonces manos a la obra.

El afip basa su WS webService en tecnologia SOAP que poseen una estructura que se encuentra detallada en un
archivo WSDL que si te lo descargas veras que no es mas que XML ahora bien como se come eso te preguntaras.

Bien hay una herramienta en PHP que a partir de un fichero WSDL te genera las clases PHP.
Las clases te ayudaran para acceder a la WS del AFIP.

Se llama wsdl2phpgenerator lo puedes ver completo en https://github.com/wsdl2phpgenerator/wsdl2phpgenerator
en mi caso use la variante "comando de linea de la aplicacion" con extencion .phar cuyo link lo encontraras en la pagina
de github que te pase.

una vez que tengas el archivo wsdl2phpgenerator-2.5.5.phar

a.1.-Procedes de la siguiente manera para windows seria asi en mi caso tengo wamp:

C:\wamp\bin\php\php5.5.12\php wsdl2phpgenerator-2.5.5.phar -i https://wsaahomo.afip.gov.ar/ws/services/LoginCms?wsdl -o /wamp/www/wsdl/loginCms

C:\wamp\bin\php\php5.5.12\php wsdl2phpgenerator-2.5.5.phar -i https://wswhomo.afip.gov.ar/wsfev1/service.asmx?WSDL -o /wamp/www/wsdl/FacElec

a.2.- o si tiene linux ejemplo ubuntu :

sudo php wsdl2phpgenerator-2.5.5.phar -i https://wsaahomo.afip.gov.ar/ws/services/LoginCms?wsdl -o /home/AFIP/wsdl/loginCms

sudo php wsdl2phpgenerator-2.5.5.phar -i https://wswhomo.afip.gov.ar/wsfev1/service.asmx?WSDL -o /home/AFIP/wsdl/FacElec

Las rutas de destino son ejemplo tu eliges donde quieres que se generen las clases php.
las url de la linea de comando son del afip las que figuran en los manuales de desarrollador. como veras
en las url hacen referencia a homologacion o sea a modo de prueba. para produccion son otras.

Perfecto. En las carpetas veras un monton de archivos php son las clases que serviran de nexo con el web service del afip

como veres existen dos partes
La de login y la de facturaelectronica propiamente dicha

LoginCms son las rutinas necesarias para validarte y asi poder luego ingresar a la factura electronica.

En primer lugar veremos el tema de LoginCms ya que de esta forma obtendras el famoso token y sign que
te solicita la parte de factura electronica.

Debes tener instalado en tu pc el OpenSSL

En el manual del desarrollado habla de un archivo XLM llamado:
LoginTicketRequest.xml

el fichero tiene la siguiente estructura

<?xml version="1.0" encoding="UTF­8"?>
<loginTicketRequest version="1.0">
<header>
<source>C=AR, O=mi empresa, SERIALNUMBER=CUIT nnnnnnnnnnn, CN=mi_certificado</source>
<destination>cn=wsaahomo,o=afip,c=ar,serialNumber=CUIT 33693450239</destination>
<uniqueId>1</uniqueId>
<generationTime>2015-12-13T00:00:00</generationTime>
<expirationTime>2015-12-13T23:50:00</expirationTime>
</header>
<service>wsfe</service>
</loginTicketRequest>

tendras que armarlo con php parametros que tendras que rellenar los puse en negrita.

Este fichero es el que hay que firmar para enviarlo al servicio de LoginCMS y asi obtener el token y sign que como ya
mensione sera utilizado en el otro web service para obtener el CAE e informa la factura o los servicios que desees utilizar


Los pasos a seguir una vez obtenido el fichero LoginTicketRequest.xml sera firmarlo con el OpenSSL pero no en cualquier
formato el formato es cms, el resultado tambien usando OpenSSL sera cifrarlo en base64.

Como se hace ?

Obtener el fichero LoginTicketRequest.xml.cms :

openssl cms -sign -in LoginTicketRequest.xml -nodetach -inkey privada.key -signer certificado.crt -out LoginTicketRequest.xml.cms -outform DER

luego:

openssl enc -base64 -in LoginTicketRequest.xml.cms -out LoginTicketRequest.xml.cms.base64

dentro de tu codigo php seria algo asi en este ejemplo para linux hay que hacer referencia al camino de lo ficheros LoginTicketRequest.xml, privada.key, certificado.crt

te recuerdo que certificado.crt seria tu certificado .crt, privada.key seria el archivo .key que usaste para generar el .crt que te devolvio el afip.

exec('openssl cms -sign -in LoginTicketRequest/LoginTicketRequest.xml -nodetach -inkey Certificados/'.$cNumeroCert.'/privada.key -signer Certificados/'.$cNumeroCert.'/certificado.crt -out LoginTicketRequest/LoginTicketRequest.xml.cms -outform DER');

exec('openssl enc -base64 -in LoginTicketRequest/LoginTicketRequest.xml.cms -out LoginTicketRequest/LoginTicketRequest.xml.cms.base64');


Una vez obtenido el fichero LoginTicketRequest.xml.cms.base64 es el que usaremos para solicitar al WebService (WS)

codigo ejemplo de como usarlo seria :


<?php

// obtencion del TA para extraer Token y Sign
require_once('loginCms/LoginCMSService.php'); <<==================== Aqui apunto a las clases que generaste para el loginCMS
$tra = file_get_contents('LoginTicketRequest/LoginTicketRequest.xml.cms.base64');
if (trim($tra)<>'') {
$wsaa = new LoginCMSService();
$ret = $wsaa->loginCms(new loginCms($tra));
$ta = $ret->loginCmsReturn;
if (trim($ta)<>'') {
$xml = new SimpleXMLElement($ta);
foreach ($xml as $element) {
foreach($element as $key => $val) {
if ($key=='source') {$vSource = (String)$val;}
if ($key=='destination') {$vDestination = (String)$val;}
if ($key=='uniqueId') {$vUniqueID = (String)$val;}
if ($key=='generationTime') {$vGenerationTime = (String)$val;}
if ($key=='expirationTime') {$vExpirationTime = (String)$val;}
if ($key=='token') {$vToken = (String)$val;}
if ($key=='sign') {$vSign = (String)$val;}
$pError = '';
}
}
} else {
$pError = 'No se pudo obtener el TicketAccess (TA)';
}
} else {
$pError = 'No se pudo obtener el TicketRequestAccess (TRA)';
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Factura Electronica Afip

Publicado por Guillermo (2 intervenciones) el 11/02/2016 22:37:29
Hola Diego me podrías pasar data para desarrollar el tema de FE con PHP? Muchas gracias. Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Factura Electronica Afip

Publicado por Ligia iep1.terciario@gmail.com (4 intervenciones) el 03/10/2016 15:41:11
Hola Diego, estoy trabajando con wamp5 ver 1.7.3. Ya logro conectarme con los servidores de homologación de AFIP y recibo el CAE...

Tengo 2 problemas que necesito resolver urgente:

1) Al CAE obtenido lo guardo en una variable de session para luego almacenarla en el archivo con los demás datos de la factura generada...me muestra el CAE correcto por pantalla pero guarda otro numero en la base de datos... siempre el mismo numero para todas las facturas... tenes idea de cual puede ser el problema?

2) Cuando no obtengo el CAE por algún error y quiero leer cuales son los errores para solicitar al operador que ingrese nuevamente algún dato para volver a intentar la solicitud de CAE ... no logro que los comandos de "SimpleXML" funcionen para leer el archivo que me manda el ws de afip.
Todo lo que leo sobre SimpleXML hace referencia a XML no a SOAP xml...no se si tiene que ver con eso o con la configuración del wamp. Pero cuando ejecuto ejemplos donde primero cargan en una variable String algo en formato xml y luego lo leen con simplexml_load_string('vble.xml')--> funciona, pero cuando intento con simplexml_load_file, NO funciona.

Espero que me puedas ayudar, desde ya muchas gracias por tu tiempo. Saludos, Ligia
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Factura Electronica Afip

Publicado por diego diegopuntano@hotmail.com (8 intervenciones) el 03/10/2016 18:25:20
Hola Ligia.

En el pto. Nº 1 algo no esta bien el CAE no puede ser el mismo, no utilices variables de session, bueno todo depende de como este encarado el programa. En mi caso cuando envió los datos al WebService que están cargados en variables y retorna el CAE e inmediatamente almaceno los datos en la base de datos. De todas maneras también tienes que tener implementada la función de consultar un comprobante que has informado. Habría que ver el código, ver una muestra, o bien hacer una sesion via team para ver que puede ser.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Factura Electronica Afip

Publicado por MARIA LIGIA (4 intervenciones) el 03/10/2016 18:43:15
Hola Diego, gracias por responder. Es muy raro lo que pasa porque en el mismo programa que recibe los datos de la factura para
grabar el pago primero hago un echo de la variable de session donde gurde el CAE para que muestre por pantalla el nro de CAE y
es el correcto, es el que viene en el archivo 'response-FECAESolicitar.xml' pero cuando realizo el insert

1
2
3
4
5
6
mysql_query("insert into sp_recibos (rec_ptoVenta,rec_numero,rec_serie,rec_estado ,rec_cae,rec_caeFecVto,rec_importe, rec_fecha,
	rec_grupo ,rec_concepto,rec_titular, rec_letras)
	values
	('$_COOKIE[punto]','$recibo','$_COOKIE[serie]','V','$_SESSION[cae]','$_SESSION[fVto]','$total','$fecha',
	'$_SESSION[grupo]','$concepto','$titular','$texto')",$hola)
or die ("error en el insert de recibos - Error: ".mysql_error());

... guarda siempre este valor: 4294967295 y el cae era por ejemplo: 66409431837005...valor que me mostró por pantalla como contenido de la vble de session.
A rec_cae en la base de datos lo tengo definido como INT de 20 sin signo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Factura Electronica Afip

Publicado por MARIA LIGIA iep1.terciario@gmail.com (4 intervenciones) el 03/10/2016 21:48:56
Diego, ya esta solucionado.. era una soncera...el tipo de dato INT unsigned tiene un rango de 0 a 4294967295. Cambie el tipo de dato por BIGINT y se solucionó...

Sigue pendiente el segundo tema... como leer SOAP XML desde PHP para manejar los errores que devuelve el mensaje de AFIP.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Factura Electronica Afip

Publicado por Yamil Bracho (532 intervenciones) el 03/10/2016 22:10:02
PHP 5 o superior tiene la extension para manejar SOAP y si no puede usar la biblioteca NuSOAP
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Factura Electronica Afip

Publicado por diego diegopuntano@hotmail.com (8 intervenciones) el 03/10/2016 23:18:17
No se como has implementado tus clases pero es super-sencillo no hay que usar ninguna libreria SOAP para manejar XML. Si has realizado la implemetacion mediante clases utilizando las clases bases extraídas por un método que explique anteriormente. El manejo queda ultra sencillo.

Por ejemplo: una funcion dentro mi clase que solicita el ultimo comprobante autorizado

1
2
3
4
5
6
7
8
9
10
11
12
13
// Obtiene el ultimo valor de comprobante para un pto.vta. dado y un comprobante tipo especifico
 
public function UltimoComprobanteAutorizado($PtoVta,$CbteTipo) {
$Param   = new FECompUltimoAutorizado($this->_Auth,$PtoVta,$CbteTipo) ;
$Ret     = $this->_WSFE->FECompUltimoAutorizado($Param);
$Error   = $this->ProcesaError($Ret->FECompUltimoAutorizadoResult->Errors) ;
$CbteNro = $Ret->FECompUltimoAutorizadoResult->CbteNro ;
$this->_ARet = ['UltimoComprobanteAutorizado' => $CbteNro,
                'PtoVta'                      => $PtoVta,
                'CbteTipo'                    => $CbteTipo,
                'Error'                       => $Error ] ;
return json_encode($this->_ARet) ;
}

Si bien solo es una es un ejemplo simple, la clase esta formada por una serie de funciones asi de simples.
y al realizar la instancia de la clase seria asi:


1
2
3
4
5
$ptoVta   = 7 ;
$cbteTipo = 6 ;
 
$MyFacEle = new Servicios_Factura_Electronica($cCUITempresa,$vToken,$vSign);
$Salida       = $MyFacEle->UltimoComprobanteAutorizado($ptoVta,$cbteTipo);

y en la variable salida tengo un JSON con los datos que la funcion arma.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Factura Electronica Afip

Publicado por MARIA LIGIA iep1.terciario@gmail.com (4 intervenciones) el 04/10/2016 00:14:10
Hola Diego,

Tengo pendiente probar el método que comentás porque me llamó mucho la atención. Hoy baje de la página que indicás el archivo wsdl2phpgenerator-2.5.5.phar pero no logré que funcione, . ...

(Estoy usando el código de un programador llamado Diego que recopiló información de Internet y dejo a disposición algo bien sencillo y ordenado.)

Entiendo lo que decís, tenés métodos para solicitar lo que necesitás al ws y no usas SOAP, pero, ¿no recibís la respuesta del ws en Soap xml?, como lees que errores encontró?, por ejemplo mal la CUIT del pagador..

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Factura Electronica Afip

Publicado por diego diegopuntano@hotmail.com (8 intervenciones) el 04/10/2016 01:14:58
El wsdl2phpgenerator-2.5.5.phar se ejecuta desde consola y si pasas los parámetros correctos te creara en la carpeta que le indiques una serie de archivos .php con clases base que extrae del wsdl con ellas podrás armar tus clases. Lo he probado desde linux y desde windows con wampServer (http://www.wampserver.com/en/) sin problemas, si no funciona hay algun parametro que no esta siendo pasado correctamente.

Los wsdl son dos uno para modo homologacion y otro para modo produccion en realidad los dos generan las mismas clases la diferencia esta en una url una apunta a modo homologacion y la otra a produccion. Si desarrollas para probar en modo homologacion o prueba y lo corres en modo produccion te dara error y viceversa.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Factura Electronica Afip

Publicado por Miguel Augusto Fierro (3 intervenciones) el 05/11/2016 09:35:42
Hola Diego,
excelente aporte
en cuanto a la opcion en delphi,
tienes tambien ejemplos como los que has aportado para php
Muchas gracias anticipadamente
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Factura Electronica Afip

Publicado por diego (8 intervenciones) el 05/11/2016 12:23:10
Si con mucho gusto Miguel.
En realidad lo de la factura electrónica primero lo desarrolle en Delphi y luego realice el desarrollo en php.

El proceso en Delphi es crear un conjunto de clases extraídas del wsdl de la misma forma que lo explico en
php con el wsdl2phpgenerator-2.5.5.phar.

En Delphi es mucho mas sencillo pues delphi en su IDE tiene incorporada una herramienta que hace eso.

Por ejemplo en Dephi 10.1 Berlin te vas a la opción del menú "Component" y de ahí "Import WSDL" a partir de
ese momento se habré el asistente sigue los pasos uno a uno y como conclusión tendrás una unidad
que te dará acceso en forma transparente y nativa a las funciones del web service del AFIP.

Cualquier duda un gusto en ayudar.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Factura Electronica Afip

Publicado por Miguel Augusto Fierro (3 intervenciones) el 05/11/2016 18:40:44
Muchas gracias Diego

Creo entonces lo hare en php entonces,
el delphi me quede con la version 5 porque las siguientes eran cuando borland se habia desarmado y sus productos siguientes
estaban complicados, hata que avanzaron recien a la version 9 y 10

Probare en delphi tambien a ver como va
Llegaste a hacer algunas rutinas en delphi como para poder avanzar mas rapido?

Muchas gracias, muy cordial de tu parte
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Factura Electronica Afip

Publicado por diego (8 intervenciones) el 05/11/2016 20:15:36
Hola Miguel.

Delphi ha mejorado mucho con Embarcadero, una que es bastante estable es la XE6 Update 1 o bien la Berlin 10.1 Update 1,
La XE6 Update es la mas estable que he probado.

En Delphi tengo desarrollos de Factura Electrónica andando sin ningún problema desde hace mas de un año.

A partir de la unidad que te crea el asistente tienes acceso a las clases del web service del Afip tal cual se lo
ve en el manual del desarrollador del AFIP. (Lo mismo que lograras usando el método que detallo acerca del php)

Es por ello que cuentes con la unidad creada por el asistente.

Cualquier duda especifica o si te puedo dar una mano cuenta conmigo. Saludos.

!!! Delphi por siempre !!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Factura Electronica Afip

Publicado por Miguel Augusto Fierro (3 intervenciones) el 05/11/2016 20:22:45
excelente, avanzare entonces y te comentare
Muchisimas gracias
un abrazo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de pablo

Factura Electronica Afip

Publicado por pablo (1 intervención) el 01/12/2016 19:57:46
Hola,
yo subí un ejemplo en php a modo de material de estudio para uso del web service afip en modo testing.
Dejo el link donde esta el archivo afipfev1.zip que contiene el ejemplo:
https://groups.google.com/forum/?hl=es-419#!forum/factura-electronica-afip---web-service-en-php---2015

También, si alguien necesita algún desarrollo a medida sobre facturación electrónica pueden consultar en http://bairesoft.com.ar

Saludos,
Pablo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar