Nueva pregunta

Pregunta:

Fecha: 17-04-2017 10:17:45 (En Español)

AFIP Argentina: Consulta a la API del padrón de Contribuyentes[Resuelta]

Buenas tardes a todos. Tengo este código con el cual consulto los datos del padrón de la AFIP y me trae los datos mas relevantes. El problema es que hasta la semana pasada andaba lo más bien en un servidor que tengo en linode y hoy dejo de funcionar. En mi PC funciona lo más bien. Tengo windows 10 y en linode Ubuntu 4.

<?php
$cuit = '20138815081';
$buscar = 'https://soa.afip.gob.ar/sr-padron/v2/persona/'.$cuit;
$respuesta = file_get_contents($buscar);
echo($respuesta);echo('</br>');
echo('=================================================================');echo('</br>');
$respuesta = json_decode($respuesta);
// Leer provincias en base al codigo fiscarl.
echo("nombre : ".$respuesta->data->nombre);echo('</br>');
echo("direccion : ".$respuesta->data->domicilioFiscal->direccion);echo('</br>');
echo("cp : ".$respuesta->data->domicilioFiscal->codPostal);echo('</br>');
echo("prov : ".$respuesta->data->domicilioFiscal->idProvincia);echo('</br>');
// Impuestos inscriptos
$tabla = $respuesta->data->impuestos;
$elementos = count ($tabla);
for($i=0;$i<$elementos;$i++){
	echo('Impuesto = '.$respuesta->data->impuestos[$i]);echo('</br>');
}
?>


No se si es un problema de linux o que la consulta se ejecuta desde el exterior.

Saludos.

PD: cambiando la IP de mi PC con esos programas que te la enmascaran para que sea de otro pais no funciona. Me devuelve vacio lo mismo que dese linode
Etiquetas: API - Facturación - PHP - Pregunta - REST Votos: 3 - Respuestas: 73 - Vistas: 77 Compartir en: Google Facebook Twitter LinkedIn Link
 

Respuestas:

  • Fecha: 18-04-2017 03:59:46 Hola Matias, estuve probando tu código en servidores de Argentina y funciona ok (dudo que el webservice este bloqueado para consultas desde el exterior, ya que el gobierno Argentino tiene servidores en el extranjero).

    Prueba incluir las siguientes dos líneas arriba de todo de tu script, con esto podrás visualizar todos los errores (independiente de la configuración de errores de tu servidor):
    ini_set('display_errors', '1');
    error_reporting(-1);
    


    Debido a la simpleza del script hay muy pocas cosas que pueden fallar, más precisamente la función file_get_contents() y json_decode(), veamos algunas consideraciones:

    * Puede que las envolturas fopen de tipo URL esten deshabilitadas, debes verificar que "allow_url_fopen" este en "1", documentación oficial. Esto afecta a file_get_contents(), si no esta habilitada no podrás usar una URL como nombre de archivo. Si bien es una posibilidad, suele ser raro, porque por defecto esta habilitado.
    Prueba ejecutar el siguiente código para verificarlo:
    <?php
    if(ini_get('allow_url_fopen')){
        echo 'Habilitado';
    }else{
        echo 'NO habilitado';
    }
    


    * Con respecto a la función json_decode(), en el caso de ocurrir un error durante la decodificación del contenido de $respuesta, se puede usar json_last_error() para determinar la naturaleza exacta del mismo, documentación oficial.

    Espero que mi respuesta te sea de ayuda.

    Saludos y buen código!
      Votos: 3 - Link respuesta
     
  • Fecha: 18-04-2017 04:30:21 Gracias Fernando por la respuesta.

    Estuve haciendo pruebas y lo que pude deducir es que bloquearon las consultas desde paginas del exterior. en otros foros ya son 4 los usuarios que tuvieron este problema.

    Lo que yo probé fue ejecutar https://soa.afip.gob.ar/sr-padron/v2/persona/20138815081 desde mi navegador y me trae el json. Enmascare la IP con SoftEther VPN, tomando una de canada y al ejecutarlo no me trae nada.

    Poniendo las sentencias que me pasaste devuelve :

    Notice: Trying to get property of non-object in /www/wgts/htdocs/prueba/por_cuit.php on line 12
    Notice: Trying to get property of non-object in /www/wgts/htdocs/prueba/por_cuit.php on line 12
    

    ......

    Lo que estoy tratando de hacer ahora es con un botón ejecutar en una pantalla la sentencia https://soa.afip.gob.ar/sr-padron/v2/persona/20138815081. Como esta sentencia muestra directamente un json quisiera leer esa pantalla y guardarla como txt. No se si se puede.

    Solamente serviria para aquellos usuarios que ejecuten el sistema desde argentina ya que al abrir la nueva pantalla seria desde su PC (en argentina).

    Saludos y gracias nuevamente
      Votos: 2 - Link respuesta
     
  • Fecha: 18-04-2017 04:42:05 Con JavaScript me da este error :

    XMLHttpRequest cannot load https://soa.afip.gob.ar/sr-padron/v2/persona/20138815081. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost' is therefore not allowed access.
    


    Por lo cual creo que están bloqueando accesos.
      Votos: 0 - Link respuesta
     
  • Fecha: 18-04-2017 08:20:39 Matias, si es posible invocar el webservice por JavaScript, solo que hay que configurar (para el caso de JQuery) el parámetro crossDomain: true

    Mira, aquí te dejo un ejemplo 100% ejecutable de como podrías hacer dicha invocación:

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="UTF-8">
            <title>Ejemplo AFIP Argentina: Consulta a la API del padrón de Contribuyentes con JavaScript</title>
            <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
            <script type="text/javascript">
                function obtenerDatos(cuit) {
                    $.ajax({
                        type: "get",
                        crossDomain: true,
                        url: 'https://soa.afip.gob.ar/sr-padron/v2/persona/' + cuit,
                        async: true,
                        cache: false,
                        dateType: 'JSON',
                        data: {},
                        success: function (transport) {
                            if (transport.success) {
                                alert('Nombre: ' + transport.data.nombre + "\n"
                                        + 'Direccion: ' + transport.data.domicilioFiscal.direccion + "\n"
                                        + 'CP: ' + transport.data.domicilioFiscal.codPostal);
                            }
                        }
                    });
                }
            </script>
        </head>
        <body>
            <form onsubmit="obtenerDatos($('#cuit').val());return false"> 
                <label>CUIT:</label>
                <input id="cuit" type="text" value="20138815081"/>
                <input type="submit" value="Consultar CUIT"/>
            </form>
        </body>
    </html>
    


    Espero que mi respuesta te sea de ayuda.

    Saludos y buen código!
      Votos: 5 - Link respuesta
     
  • Fecha: 18-04-2017 09:05:07 Muchas gracias Fernando.

    La función anda perfecto tanto en mi PC como desde los servidores en linode (Canada) y elserver.com que no se donde están. Ahora solo me queda acomodar las variables a mi programa de gestión.

    muchísimas gracias por tu colaboración y estoy en deuda.

    Te pido tu autorización para publicar la solución en el grupo "PyAfipWs Factura Electrónica Libre y temas relacionados AFIP ..."

    Saludos y muchas gracias.

    PD: no funciona si la aplicación se esta ejecutando en un PC que este en el exterior. Pero como es para factura electrónica en argentina no hay problema. O sea deja de funcionar si el usuario final esta en el exterior.
      Votos: 2 - Link respuesta
     
  • Fecha: 18-04-2017 10:21:49 De nada Matias, me alegra que te haya sido de ayuda.

    Obviamente puedes compartir, es la idea de la comunidad "...compartir conocimiento entre desarrolladores web de todas partes del mundo..." y si puedes no olvides compartir fuente http://www.phpcentral.com/pregunta/885/afip-argentina-consulta-a-la-api-del-padron-de-contribuyentes, así la comunidad sigue creciendo ;)

    Con respecto al consumo del webservice desde el exterior, aun no lo he probado, no descarto que este bloqueado el acceso, pero me resulta algo extraño sabiendo que muchas apps del gobierno Argentino estan hosteados fuera del país. Si este fuera el caso, siempre puedes hacer un php proxy, algo como lo siguiente.

    Creas un archivos cuit.php en un servidor de Argentina con el siguiente código:
    <?php
    $cuit = (isset($_GET['cuit']))?$_GET['cuit']:'';
    echo file_get_contents('https://soa.afip.gob.ar/sr-padron/v2/persona/' . $cuit);
    


    y luevo invocas tu proxy desde el país que quieras así:
    http://www.TUSITIOENARGENTINA.com.ar/cuit.php?cuit=20138815081


    Saludos y como siempre buen código!

    PD: si consideras que la pregunta esta resuelta no olvides cambiar su estado a "resuelta" (observa que tienes un botón en tu pregunta original para hacer el cambio de estado) y votar las respuestas que te fueron de ayuda.
      Votos: 4 - Link respuesta
     
  • Fecha: 09-06-2017 09:48:18 Hola que tal, quisiera saber de que forma dentro de la función puedo comparar si tiene el valor 30 iva

    for($i=0;$i<$elementos;$i++){
        echo('Impuesto = '.$respuesta->data->impuestos[$i]);echo('</br>');
    }
    


    en esta función muestra todos los impuestos a los que está inscripto pero quiero extraer si tiene el impuesto 30
    me pueden ayudar?
    gracias
      Votos: 0 - Link respuesta
     
  • Fecha: 09-06-2017 10:35:08 Yo utilizo esta funcion en JavaScript, podes hacer algo similar en PHP

    	/******************************************
    	*** Verificar que existan impuestos ***
    	*******************************************/
    	if(typeof(transport.data.impuestos) !== 'undefined'){ 
    		var impuestos = transport.data.impuestos;  
    		for (index = 0; index < impuestos.length; ++index) {
    			console.log(impuestos[index]);
    			if(impuestos[index] == '30'){var iva = '30';}
    			if(impuestos[index] == '20'){var iva = '20';}
    			}
    	}else{var iva = '99'}
    


    Con esto if(typeof(transport.data.impuestos) !== 'undefined') me aseguro que venga la tabla de impuestos en el JSON

    30 es responsable inscripto, 20 Monotributo y 99 consumidor final en mis tablas.
      Votos: 1 - Link respuesta
     
  • Fecha: 09-06-2017 16:40:23 Dejo por si a alguien le sirve

    <?php
    // Impuestos inscriptos
    $tabla = $respuesta->data->impuestos;
    $elementos = count ($tabla);
    for($i=0;$i<$elementos;$i++){
            $impuesto=$respuesta->data->impuestos[$i];
            if ($impuesto == 30){
                    echo "Responsable Inscripto<br>";
            }
            else{
                    echo "";
            }
    }
    ?>
    
      Votos: 1 - Link respuesta
     
  • Fecha: 12-07-2017 13:50:01 Buenas, alguien sabe como se puede chequear si el cliente es excento?   Votos: 0 - Link respuesta
     
  • Fecha: 13-07-2017 04:30:37 Depende del tipo de impuesto. Tenes que recorrer la tabla que te devuelve de impuestos.

    $buscar = 'https://soa.afip.gob.ar/sr-padron/v2/persona/'.$cuit; // obtengo los datos del cliente
    $respuesta = json_decode(file_get_contents($buscar));
    
    $tabla = $respuesta->data->impuestos;
    $elementos = count ($tabla);
    $iva = '99';
    for($i=0;$i<$elementos;$i++){
    	if($respuesta->data->impuestos[$i] == '30'){$iva = '30';} // Responsable inscripto
    	if($respuesta->data->impuestos[$i] == '20'){$iva = '20';} // Monotributo
    	if($respuesta->data->impuestos[$i] == '32'){$iva = '32';} // Excento.
    }
    

    si no tiene uno de estos impuestos yo lo considero consumidor final
      Votos: 0 - Link respuesta
     
  • Fecha: 13-07-2017 04:31:58 Si lo haces en Javascript

    	/**************************************
    	*** Verificar que existan impuestos ***
    	**************************************/
    	if(typeof(transport.data.impuestos) !== 'undefined'){
    		var impuestos = transport.data.impuestos;
    		var iva = 99;
    		for (index = 0; index < impuestos.length; ++index) {
    			console.log(impuestos[index]);
    			if(impuestos[index] == '32'){var iva = '32';}
    			if(impuestos[index] == '30'){var iva = '30';}
    			if(impuestos[index] == '20'){var iva = '20';}
    			}
    	}else{var iva = '99'}
    
      Votos: 0 - Link respuesta
     
  • Fecha: 13-07-2017 05:04:57 Gracias matías, ya tengo todo armado yo, solo me restaba saber como mirar si es excento, el resto lo hago similar a como sugerís, la unica diferencia es que chequeo si el dato ingresado es CUIT o DNI, tambien si al ingresar DNI ese DNI tiene cuit, entonces paso a buscar por CUIT a partir del DNI, ya que si el cliente te da el DNI y tiene cuit, AFIP probablemente te rebote la factura.

    Saludos.
      Votos: 0 - Link respuesta
     
  • Fecha: 13-07-2017 11:17:27 Buenas tardes a todos,
    Yo venía trabajando con esta URL hace bastante y siempre me funcionó bien:

    https://soa.afip.gob.ar/sr-padron/v2/persona/[CUIT]

    pero hace poco comenzó a dar este error aleatoreamente:

    XMLHttpRequest cannot load https://soa.afip.gob.ar/sr-padron/v2/persona/20327195981. No 'Access-Control-Allow-Origin' header is present on the requested resource

    Aparentemente el servidor no permite Cross-origin resource sharing (CORS), pero hay veces que si lo permite. Inspeccionando el response, se incluye la cabecera "Access-Control-Allow-Origin:*" aleatoreamente (tendrán varios servidores con balanceo de carga ¿? es lo único que se me ocurre)

    Todo ejecutado en Argentina...

    Les paso el jsfiddle con el código de Fernando, si lo inspeccionan con F12 pueden ver en la consola el error que indico arriba, ami me da aleatoriamente, a veces me obtiene los datos y a veces me da error! (de 10 veces, 9 me da error y 1 me trae los datos)

    https://jsfiddle.net/gustavompons/ggy7aojs/2/

    A alguien le pasa lo mismo? Saben cómo se podrá solucionar?

    Desde ya muchas gracias!

    Saludos!
      Votos: 0 - Link respuesta
     
  • Fecha: 13-07-2017 11:51:33 A mi me anda... Acabo de entrar y me devuelve tus datos...

    Edito: tenes razon... Falla a veces. Dejame verlo en un rato tranqui en mi pc.
      Votos: 1 - Link respuesta
     
  • Fecha: 13-07-2017 12:23:50 Gracias Gustavo. Tal cual, a veces funciona y otras no.

    Pensandolo bien, el jsfiddle se ejecuta fuera de Argentina, pero igual el comportamiento en mi PC es el mismo!

    Saludos!
      Votos: 0 - Link respuesta
     
  • Fecha: 13-07-2017 12:52:20 Yo estoy probando el mio desde mi PC y tambien falla, uso el v1 igual, pero tambien anda mal.

    Lo mejor sería usar el webservice, pero me parece que no se puede consultar por DNI en ninguno de los padrones...
      Votos: 0 - Link respuesta
     
  • Fecha: 14-07-2017 04:27:25 A ver, si nos ponemos las pilas entre todos por ahi sacamos algo bueno. El padrón de la afip esta fallando, tanto por web como por webservice. Se puede descargar el padron y meterlo en la base pero es solo de contribuyentes.

    Hay una web que se llama facturacionweb.com.ar, que cuando vas a facturar, pones el DNI y te salta todo... si tiene cuit te busca los impuestos y si no tiene cuit te pone nombre y apellido.

    En principio creí que era lo mismo que hacia yo, aunque me extrañaba que separen nombre y apellido, ya que afip devuelve el dato completo, pero despues de hacer varias pruebas con apellidos dobles o nombre tiples me di cuenta que separa mal, o sea que usan ese dato de afip que trae nombre y apellido juntos, sin separadores.

    Otra cosa que me llamó la atencion, es que si bien afip falla en el padrón en estos momentos, la web sigue dando datos como si nada, no falla ni tarda, cualquier DNI lo devuelve bien... o sea que no estan sacando los datos de ahí.

    Yo uso https://soa.afip.gob.ar/sr-padron/v1/persona/ y https://soa.afip.gob.ar/sr-padron/v1/personas/ (o el V2) Con el DNI detecto si tiene CUIT y hago la consulta por cuit, sino pongo nombre y apellido, tal como hace la web.

    Otro método por CUIT es con webservice de padrón A4, pero es lo mismo y solo por CUIT

    El último método es descarga de padrón, pero solo por cuit y no trae domicilio y otros datos.


    Saludos.
      Votos: 0 - Link respuesta
     
  • Fecha: 14-07-2017 06:19:05 ----- Consulta por CUIT

    Por favor, quienes puedan probar...

    Lo que hice es captar si me da error, llamo la funcion otra vez. Parece ser un problema de Access-Control.

    Lo que resta hacer es limitar a x loops para que no sea infinito, pero primero hay que hacerlo andar.
      Votos: 1 - Link respuesta
     
  • Fecha: 14-07-2017 07:16:47 Hoy me esta funcionando bien desde mi PC y desde un servidor en el exterior (linode)
    utilizo estas dos opciones
    https://soa.afip.gob.ar/sr-padron/v2/persona/'.$cuit;
    https://soa.afip.gob.ar/sr-padron/v2/personas/'.$dni;

    Me fallo el martes o miercoles.
      Votos: 0 - Link respuesta
     
  • Fecha: 14-07-2017 07:18:12 si alguien tiene el método de webservice y lo puede publicar, lo pruebo desde mi pc y desde linode   Votos: 0 - Link respuesta
     
  • Fecha: 14-07-2017 08:03:38 Matías, hoy sigue fallando, menos que ayer pero falla. El webservice esta caído y de la mesa no responden asi que lo descarto por el momento..   Votos: 0 - Link respuesta
     
  • Fecha: 14-07-2017 09:24:34 Funciona perfecto Gustavo, yo había pensado en hacer lo mismo, un loop de x reintentos, parece que por ahora va a ser la solución. Muchas gracias!

    El WS yo todavía no lo probe ¿tampoco funciona?
      Votos: 0 - Link respuesta
     
  • Fecha: 14-07-2017 10:02:16 No funciona el webservice (responde siempre id inexistente), yo tengo armado ya para detectar si es cuit o dni...

    Consulta cuit/dni
      Votos: 0 - Link respuesta
     
  • Fecha: 31-10-2017 11:33:51 Hola,
    ¿Hay forma de obtener todos los puntos de venta (direcciones) de un CUIT determinado?.
    Gracias
    Pablo
      Votos: 0 - Link respuesta
     
  • Fecha: 06-03-2018 10:39:49 Con los cambios que hubo en 10/2017
    tienen el codigo fuente de como hacerlo ahora? gracias
      Votos: 0 - Link respuesta
     
  • Fecha: 07-03-2018 07:02:30 Hola Marcela.
    Este es el codigo que estoy utilizando ahora y funciona bien.
    Tenes que relacionar el certificado de la AFIP con el servicio del padron A4

    Código PHP
    =========
    <?php
    include("../includes/versesion.php");
    date_default_timezone_set("Chile/Continental");// setear la hora para que coinsida con la hora nuestra
    $error_afip = array("ok"=>'1',"nombre"=>'',"direccion"=>'',"cp"=>'',"prov"=>'',"iva"=>'',"localidad"=>'',"telefono"=>'',"mail"=>'');
    $error_afip = json_encode($error_afip);
    $certificado = "certificado.crt"; // es el certificado obtendio de administrador del webservice a conectarse
    $clave = "clave.key"; // Es la clave generada an el open_ssl
    $persona = (double) $_POST[cuit]; // Es el cuit que busco
    $tipo_doc = $_POST[tipo_doc]; // Es el cuit que busco
    if($tipo_doc == '10' or $tipo_doc == '11'){include('../includes/calcular_cuil.php');}
    $auditar = 'CUIT solicitado = '.$persona;include('../includes/auditar.php');
    define ("WSDL", "wsaa.wsdl");     # The WSDL corresponding to WSAA
    define ("URL", "https://wsaa.afip.gov.ar/ws/services/LoginCms");
    define ("CERT", "certificado.crt");       
    define ("PRIVATEKEY", "clave.key");
    define ("PASSPHRASE", "xxxxx"); # The passphrase (if any) to sign
    define ("CUIT", "20138815081");
    #**********************************************
    #** No hay que cambiar nada en estas lineas ***
    #**********************************************
    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')-10));
      $TRA->header->addChild('expirationTime',date('c',date('U')+10));
      $TRA->addChild('service',$SERVICE);
      $TRA->asXML('TRA.xml');
    }
    #**************************************************************************************
    #** Esta función hace que la firma PKCS # 7 use TRA como archivo de entrada, CERT y ***
    #** PRIVATEKEY para firmar. Genera un archivo intermedio y finalmente ajusta el     ***
    #** Encabezado MIME dejando el CMS final requerido por WSAA                         ***
    #**************************************************************************************
    
    function SignTRA()
    {
    	$currentPath = getcwd() . "/";
    	if (!file_exists("TRA.xml")) {exit("Failed to open TRA.xml\n");}
    
      $STATUS=openssl_pkcs7_sign($currentPath ."TRA.xml", $currentPath ."TRA.tmp", "file://". $currentPath . CERT,
        array("file://". $currentPath . PRIVATEKEY, PASSPHRASE),
        array(),
        !PKCS7_DETACHED
        );
      if (!$STATUS) {exit("ERROR generating PKCS#7 signature ". $currentPath . CERT."\n" );}
      $inf=fopen($currentPath ."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(WSDL, 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)) 
    		{$error_afip = array("ok"=>1,"nombre"=>'',"direccion"=>'',"cp"=>'',"prov"=>'',"iva"=>'',"localidad"=>'',"telefono"=>'',"mail"=>'',"persona"=>'');
    			echo(json_encode($error_afip));
    			$auditar='Devuelto error = '.json_encode($error_afip);include('../includes/auditar.php');
    			exit();}
    		//{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 ".$certificado."\n");}
    if (!file_exists(PRIVATEKEY)) {exit("Failed to open ".$clave."\n");}
    if (!file_exists(WSDL)) {exit("Failed to open ".WSDL."\n");}
    $SERVICE = 'ws_sr_padron_a4';
    CreateTRA($SERVICE);
    $CMS=SignTRA();
    $TA = simplexml_load_string(CallWSAA($CMS));
    #var_dump($TA);
    #************************************
    #*** Invocar al metodo getPersona ***
    #************************************
    $wservice = "https://aws.afip.gov.ar/sr-padron/webservices/personaServiceA4";
    $wsdl_p4 = "https://aws.afip.gov.ar/sr-padron/webservices/personaServiceA4?WSDL";
    
    #echo('======================================= padron=======================================');echo('</br>');
    
    $padron = new SoapClient($wsdl_p4, array( 
                  'soap_version' => SOAP_1_1,
                  'location'     => $wservice,
                  'exceptions'   => 0,
                  'trace'        => 1)
        );
    
    #echo('======================================= resultado=======================================');echo('</br>');
    
    $resultado = $padron->getPersona(
            array(
    		'token' => $TA->credentials->token,
    		'sign' => $TA->credentials->sign,
    		'cuitRepresentada' => 20138815081, // es el cuit con el que pedi el certificao
    		'idPersona' => $persona
    		)
            );
    #var_dump($resultado);
    #echo('=======================================Datos en json=======================================');echo('</br>');
    $datos = json_encode($resultado);
    $recibo = json_decode($datos);
    
    //echo(json_encode($resultado));// Muestra el resultado de la consulta
    $auditar='Resultado = '.json_encode($resultado);include('../includes/auditar.php');
    $apellido = $recibo->personaReturn->persona->apellido.'; '.$recibo->personaReturn->persona->nombre;
    $razonsocial = $recibo->personaReturn->persona->razonSocial;
    $tipoclave = $recibo->personaReturn->persona->tipoClave;
    if($recibo->personaReturn->persona->tipoClave == 'CUIT'){
    	$direccion = $recibo->personaReturn->persona->domicilio[0]->direccion;
    	$localidad = $recibo->personaReturn->persona->domicilio[0]->localidad;
    	$cp = $recibo->personaReturn->persona->domicilio[0]->codPostal;
    	$provincia = $recibo->personaReturn->persona->domicilio[0]->descripcionProvincia;
    	$IDProvincia = $recibo->personaReturn->persona->domicilio[0]->idProvincia;
    	$telefono = $recibo->personaReturn->persona->telefono->numero.' '.$recibo->personaReturn->persona->telefono->tipoLinea;
    	$mail = $recibo->personaReturn->persona->email->direccion;
    	}else{
    	$direccion = $recibo->personaReturn->persona->domicilio->direccion;
    	$localidad = $recibo->personaReturn->persona->domicilio->localidad;
    	$cp = $recibo->personaReturn->persona->domicilio->codPostal;
    	$provincia = $recibo->personaReturn->persona->domicilio->descripcionProvincia;
    	$IDProvincia = $recibo->personaReturn->persona->domicilio->idProvincia;
    	$telefono = '';
    	$mail = '';
    	}
    if(strlen(trim($razonsocial)) > 0){$nombre = $razonsocial;}else{$nombre = $apellido;}
    if(strlen(trim($localidad)) > 0){$localidad = $localidad;}else{$localidad = $provincia;}
    // Leer provincias en base al codigo fiscarl.
    include('../includes/conexion.php');
    $consul_prov = "select * from provincias where pr_afip = '$IDProvincia'";
    $resul_prov = mysql_query($consul_prov);
    $cant_prov = mysql_num_rows($resul_prov);
    $auditar=$consul_prov;include('../includes/auditar.php');
    $fila_prov = mysql_fetch_array($resul_prov);
    mysql_close($con_php);
    #######################################
    ### Vrtificar que tipo de iva tiene ###
    #######################################
    $tabla = $recibo->personaReturn->persona->impuesto;
    $elementos = count ($tabla);
    $iva = 99;
    for($i=0;$i<$elementos;$i++){
    	if($recibo->personaReturn->persona->impuesto[$i]->estado == 'ACTIVO'){
    		if($recibo->personaReturn->persona->impuesto[$i]->idImpuesto == '30'){$iva = '30';}
    		if($recibo->personaReturn->persona->impuesto[$i]->idImpuesto == '20'){$iva = '20';}
    		if($recibo->personaReturn->persona->impuesto[$i]->idImpuesto == '21'){$iva = '20';}
    		if($recibo->personaReturn->persona->impuesto[$i]->idImpuesto == '33'){$iva = '32';}
    	}
    }
    // LeerIVA en base al codigo fiscarl.
    include('../includes/conexion.php');
    $consul_iva = "select * from iva where iv_afip = '$iva'";
    $resul_iva = mysql_query($consul_iva);
    $cant_iva = mysql_num_rows($resul_iva);
    $auditar=$consul_iva;include('../includes/auditar.php');
    $fila_iva = mysql_fetch_array($resul_iva);
    mysql_close($con_php);
    
    $datos_afip = array("ok"=>0,"nombre"=>$nombre,"direccion"=>$direccion,"cp"=>$cp,"prov"=>$fila_prov[pr_id],"iva"=>$fila_iva[iv_id],"localidad"=>$localidad,"telefono"=>$telefono,"mail"=>$mail,"persona"=>$persona,"tipoclave"=>$tipoclave);
    echo(json_encode($datos_afip));
    
    
    ?>
    


    Saludos .
      Votos: 0 - Link respuesta
     
  • Fecha: 07-03-2018 07:05:14 Solo funciona con cuit o cuil si pones DNI tenes que calcular el CUIL   Votos: 0 - Link respuesta
     
  • Fecha: 07-03-2018 08:18:04 Gracias
    El certificado y key los guardo en el servidor junto con el php con el codigo?
    Porque me da el error: Failed to open wsaa.wsdl
    Gracias
      Votos: 0 - Link respuesta
     
  • Fecha: 07-03-2018 08:49:34 Si. Tenes que ver la ruta y el nombre que tienen
    Lineas 14 y 15
    define ("CERT", "certificado.crt");
    define ("PRIVATEKEY", "clave.key");

    Yo los tengo en el mismo directorio.
      Votos: 0 - Link respuesta
     
  • Fecha: 07-03-2018 09:38:06 Gracias, funciona perfecto   Votos: 0 - Link respuesta
     
  • Fecha: 17-03-2018 10:56:35 Cuando quiero adherirme en la AFIP para ver/consultar los padrones via WebService me dice que no estoy autorizado. Que necesito? me dio un numero de ticket y un mail donde consultar, pero ese mail rebota diciendo de hacerlo en un form online, y en ese form no hay opciones para desarrolladores. Alguno tiene una guia donde obtener los certificados y la autorizacion correspondiente para poder adherir el servicio en el sitio de la AFIP? que hace falta?   Votos: 0 - Link respuesta
     
  • Fecha: 18-03-2018 05:20:40 http://www.afip.gob.ar/ws/paso4.asp   Votos: 0 - Link respuesta
     
  • Fecha: 21-03-2018 03:48:49 Buen dia. ¿Alguno sabe y/o tiene como obtener la cotización del dolar o de cualquier moneda de la AFIP?   Votos: 0 - Link respuesta
     
  • Fecha: 20-04-2018 12:31:39 Buenas alguien me puede pasar el código completo. Copié el de Matias Wernicke pero tiene varios include y obviamente no me funciona. Desde ya muchas gracias. Saludos.   Votos: 0 - Link respuesta
     
  • Fecha: 07-05-2018 13:19:58 @GuillermoBillot, claramente tenes que meter tijera en ese código.

    # urls del servicio de autenticación. 
    define ("WSDL", 'https://wsaahomo.afip.gov.ar/ws/services/LoginCms?wsdl');
    define ("URL", "https://wsaahomo.afip.gov.ar/ws/services/LoginCms");
    


    # ruta personalizada a tus archivos de autenticacion
    $certificado = 'assets/afip/cert.pem'; 
    $clave = 'assets/afip/cert.key);
      
    define ("CERT", $certificado);       
    define ("PRIVATEKEY", $clave);
    


    # webservice
    define ("SERVICE", 'ws_sr_padron_a5');    
    $wservice = "https://awshomo.afip.gov.ar/sr-padron/webservices/personaServiceA5";
    $wsdl_padron = "https://awshomo.afip.gov.ar/sr-padron/webservices/personaServiceA5?WSDL"; 
    


    # archivos que se generan durante la autenticacion
    En todos los lados en que se nombran estos archivos hay que definir una ruta valida:
    TRA.xml
    TRA.tmp
    request-loginCms.xml
    response-loginCms.xml


    El código en mi caso, habiendo recortado, queda así:

        $certificado = resource_path('assets/afip/cert.pem'); // es el certificado obtendio de administrador del webservice a conectarse
        $clave = resource_path('assets/afip/cert.key'); // Es la clave generada an el open_ssl
        
        $persona = (double) 2026xxxx757; // Es el cuit que busco
        $tipo_doc = 80; // Es el tipo de documento. 80=CUIT
        
        define ("WSDL", 'https://wsaahomo.afip.gov.ar/ws/services/LoginCms?wsdl');     # The WSDL corresponding to WSAA
        define ("URL", "https://wsaahomo.afip.gov.ar/ws/services/LoginCms");
        define ("SERVICE", 'ws_sr_padron_a5');       
        define ("CERT", $certificado);       
        define ("PRIVATEKEY", $clave);
        define ("PASSPHRASE", env('AFIP_PASSPHRASE')); # The passphrase (if any) to sign
        define ("CUIT", 30xxxxx6393);
        
        // chequeo de que exiten los archivos locales.
        if (!file_exists(CERT)) {exit("Failed to open ".$certificado."\n");}
        if (!file_exists(PRIVATEKEY)) {exit("Failed to open ".$clave."\n");}
        
        // TODO: chequear si es posible escribir los archivos TRA.xml y TRA.tmp en algun lugar dado
        // Mismo con request-loginCms.xml y response-loginCms.xml
    
        #**********************************************
        #** Metodos ***********************************
        #**********************************************
        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')-10));
          $TRA->header->addChild('expirationTime',date('c',date('U')+10));
          $TRA->addChild('service', $SERVICE);
          $TRA->asXML( storage_path('TRA.xml'));
        }
        
        #**************************************************************************************
        #** Esta función hace que la firma PKCS # 7 use TRA como archivo de entrada, CERT y ***
        #** PRIVATEKEY para firmar. Genera un archivo intermedio y finalmente ajusta el     ***
        #** Encabezado MIME dejando el CMS final requerido por WSAA                         ***
        #**************************************************************************************
        function SignTRA()
        {
            $currentPath = getcwd() . "/";
            if (!file_exists(storage_path('TRA.xml'))) {exit("Failed to open TRA.xml\n");}
    
            $STATUS=openssl_pkcs7_sign(
              storage_path('TRA.xml'), 
              storage_path('TRA.tmp'), 
              "file://". CERT,
                array("file://". PRIVATEKEY, PASSPHRASE),
                array(),
                !PKCS7_DETACHED
            );
          if (!$STATUS) {exit("ERROR generating PKCS#7 signature ". $currentPath . CERT."\n" );}
          $inf=fopen(storage_path('TRA.tmp'), "r");
          $i=0;
          $CMS="";
          while (!feof($inf)) 
            { 
              $buffer=fgets($inf);
              if ( $i++ >= 4 ) {$CMS.=$buffer;}
            }
          fclose($inf);
          unlink(storage_path('TRA.tmp'));
          return $CMS;
        }
        
        function CallWSAA($CMS)
        {
            $client=new \SoapClient(WSDL, array(
                    'soap_version'   => SOAP_1_2,
                    'location'       => URL,
                    'trace'          => 1,
                    'exceptions'     => 0
                    )); 
    
            $results=$client->loginCms(array('in0'=>$CMS));
            file_put_contents(storage_path("request-loginCms.xml"),$client->__getLastRequest());
            file_put_contents(storage_path("response-loginCms.xml"),$client->__getLastResponse());
            
            if (is_soap_fault($results)) 
            {
                var_dump(json_encode($results));
                exit();
            }
               
          return $results->loginCmsReturn;
        }
        #==============================================================================
    
        ini_set("soap.wsdl_cache_enabled", "0");
     
        CreateTRA(SERVICE);
        $CMS=SignTRA();    
        $TA = simplexml_load_string(CallWSAA($CMS));
     
        #************************************
        #*** Invocar al metodo getPersona ***
        #************************************
        $wservice = "https://awshomo.afip.gov.ar/sr-padron/webservices/personaServiceA5";
        $wsdl_padron = "https://awshomo.afip.gov.ar/sr-padron/webservices/personaServiceA5?WSDL";
      
        $padron = new SoapClient($wsdl_padron, array( 
                      'soap_version' => SOAP_1_2,
                      'location'     => $wservice,
                      'exceptions'   => 0,
                      'trace'        => 1)
            );
       
        $resultado = $padron->getPersona(
                array(
                'token' => $TA->credentials->token,
                'sign' => $TA->credentials->sign,
                'cuitRepresentada' => CUIT, // es nuestro CUIT
                'idPersona' => $persona
                )
        );
        var_dump($resultado);
    
      Votos: 0 - Link respuesta
     
  • Fecha: 29-08-2018 07:32:50 De golpe dejó de funcionar y sale el siguiente error:

    Warning: SoapClient::SoapClient(https://aws.afip.gov.ar/sr-padron/webservices/personaServiceA4?WSDL): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in cuit.php on line 110

    Warning: SoapClient::SoapClient(): I/O warning : failed to load external entity "https://aws.afip.gov.ar/sr-padron/webservices/personaServiceA4?WSDL" in cuit.php on line 110

    Fatal error: SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://aws.afip.gov.ar/sr-padron/webservices/personaServiceA4?WSDL' : failed to load external entity "https://aws.afip.gov.ar/sr-padron/webservices/personaServiceA4?WSDL" in cuit.php on line 110


    Que puede ser?
      Votos: 0 - Link respuesta
     
  • Fecha: 29-08-2018 08:05:53 A mi me paso lo mismo.
    Mande mail a la AFIP el lunes y otro el martes y no me contestaron.
    Es como que no existe la pagina.

    Ahora estoy utilizando el PadronA5 pero no trae los mismos datos
      Votos: 0 - Link respuesta
     
  • Fecha: 29-08-2018 08:28:06 Hola alguna novedad de porque sigue caido? te contestaron el e-mail los de afip? gracias   Votos: 0 - Link respuesta
     
  • Fecha: 29-08-2018 09:00:52 No   Votos: 0 - Link respuesta
     
  • Fecha: 30-08-2018 03:58:48 Estimados eh mandado como 5 mails ya pero me responde que lo esta revisando el área técnica, alguno tiene algún otro dato? @Matias Wernicke tuviste que adaptar mucho código para la respuesta del servicio de padrón PadronA5?.   Votos: 0 - Link respuesta
     
  • Fecha: 30-08-2018 11:13:29 Les dejo el codigo del padronA5

    <?php
    include("../includes/versesion.php");
    date_default_timezone_set("Chile/Continental");// setear la hora para que coinsida con la hora nuestra
    $error_afip = array("ok"=>'1',"nombre"=>'',"direccion"=>'',"cp"=>'',"prov"=>'',"iva"=>'',"localidad"=>'',"telefono"=>'',"mail"=>'');
    $error_afip = json_encode($error_afip);
    
    $modo = 'P'; // valores posibles H = Homologacion -- P = Produccion
    $certificado = "certificado.crt"; // es el certificado obtendio de administrador del webservice a conectarse
    $clave = "clave.key"; // Es la clave generada an el open_ssl
    $persona = (double) $_POST[cuit]; // Es el cuit que busco
    $tipo_doc = $_POST[tipo_doc]; // Es el cuit que busco
    $tipo_doc = 11; // 10 Masculino 11 Femenino
    $persona = 30707035885; // CENTRO ACADEMICO DE SALUD
    if($tipo_doc == '10' or $tipo_doc == '11'){include('../includes/calcular_cuil.php');}
    $auditar = 'CUIT solicitado = '.$persona;include('../includes/auditar.php');
    
    define ("WSDL", "wsaa.wsdl");     # The WSDL corresponding to WSAA
    //define ("CERT", "claves/swci/ghf.crt");       # The X.509 certificate in PEM format
    //define ("PRIVATEKEY", "claves/swci/ghf.key"); # The private key correspoding to CERT (PEM)
    define ("PASSPHRASE", "xxxxx"); # The passphrase (if any) to sign
    if($modo == 'H'){echo('homologacion');echo('</br>');
    				 define ("URL", "https://wsaahomo.afip.gov.ar/ws/services/LoginCms");
    				 define ("CERT", "certificado.crt");       
    				 define ("PRIVATEKEY", "clave.key");}
    				else
    				{echo('produccion');echo('</br>');
    				 define ("URL", "https://wsaa.afip.gov.ar/ws/services/LoginCms");
    				 define ("CERT", "certificado.crt");       
    				 define ("PRIVATEKEY", "clave.key");}
    define ("CUIT", "20138815081");
    #**********************************************
    #** No hay que cambiar nada en estas lineas ***
    #**********************************************
    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')-10));
      $TRA->header->addChild('expirationTime',date('c',date('U')+10));
      $TRA->addChild('service',$SERVICE);
      $TRA->asXML('TRA.xml');
    }
    #**************************************************************************************
    #** Esta función hace que la firma PKCS # 7 use TRA como archivo de entrada, CERT y ***
    #** PRIVATEKEY para firmar. Genera un archivo intermedio y finalmente ajusta el     ***
    #** Encabezado MIME dejando el CMS final requerido por WSAA                         ***
    #**************************************************************************************
    
    function SignTRA()
    {
    	$currentPath = getcwd() . "/";
    	if (!file_exists("TRA.xml")) {exit("Failed to open TRA.xml\n");}
    
      $STATUS=openssl_pkcs7_sign($currentPath ."TRA.xml", $currentPath ."TRA.tmp", "file://". $currentPath . CERT,
        array("file://". $currentPath . PRIVATEKEY, PASSPHRASE),
        array(),
        !PKCS7_DETACHED
        );
      if (!$STATUS) {exit("ERROR generating PKCS#7 signature ". $currentPath . CERT."\n" );}
      $inf=fopen($currentPath ."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(WSDL, 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;
    }
    #==============================================================================
    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 ".$certificado."\n");}
    if (!file_exists(PRIVATEKEY)) {exit("Failed to open ".$clave."\n");}
    if (!file_exists(WSDL)) {exit("Failed to open ".WSDL."\n");}
    $SERVICE = 'ws_sr_padron_a5';
    CreateTRA($SERVICE);
    $CMS=SignTRA();
    $TA = simplexml_load_string(CallWSAA($CMS));
    #var_dump($TA);
    #************************************
    #*** Invocar al metodo getPersona ***
    #************************************
    #testing 
    if($modo == 'H'){$wservice = "https://awshomo.afip.gov.ar/sr-padron/webservices/personaServiceA5";
    				 $wsdl_p4 = "https://awshomo.afip.gov.ar/sr-padron/webservices/personaServiceA5?WSDL";}
    				 else
    				{$wservice = "https://aws.afip.gov.ar/sr-padron/webservices/personaServiceA5";
    				 $wsdl_p4 = "https://aws.afip.gov.ar/sr-padron/webservices/personaServiceA5?WSDL";}
    
    #echo('======================================= padron=======================================');echo('</br>');
    
    $padron = new SoapClient($wsdl_p4, array( 
                  'soap_version' => SOAP_1_1,
                  'location'     => $wservice,
                  'exceptions'   => 0,
                  'trace'        => 1)
        );
    
    #echo('======================================= resultado=======================================');echo('</br>');
    
    $resultado = $padron->getPersona(
            array(
    		'token' => $TA->credentials->token,
    		'sign' => $TA->credentials->sign,
    		'cuitRepresentada' => 20138815081, // es el cuit con el que pedi el certificao
    		'idPersona' => $persona
    		)
            );
    #var_dump($resultado);
    #echo('</br>');
    // {"personaReturn":{"errorConstancia":{"apellido":"DI LULLO MARTIN NICOL","error":"La clave ingresada no es una CUIT","idPersona":20283716407},"metadata":{"fechaHora":"2018-08-28T14:47:36.847-03:00","servidor":"aws.afip.gov.ar"}}}
    #echo('=======================================Datos en json=======================================');echo('</br>');
    $datos = json_encode($resultado);
    echo(json_encode($resultado));echo('</br>'); // Muestra el resultado de la consulta
    $auditar='Resultado = '.json_encode($resultado);include('../includes/auditar.php');
    echo('*******************************************************************************************************************************************');echo('</br>'); 
    #echo('=======================================Desgloce de datos=======================================');echo('</br>');
    $recibo = json_decode($datos);
    
    $apellido = $recibo->personaReturn->datosGenerales->apellido.'; '.$recibo->personaReturn->datosGenerales->nombre;
    $razonsocial = $recibo->personaReturn->datosGenerales->razonSocial;
    $tipoclave = $recibo->personaReturn->datosGenerales->tipoClave;
    if($tipoclave == 'CUIT'){
    	$direccion = $recibo->personaReturn->datosGenerales->domicilioFiscal->direccion;
    	$localidad = $recibo->personaReturn->datosGenerales->domicilioFiscal->localidad;
    	$cp = $recibo->personaReturn->datosGenerales->domicilioFiscal->codPostal;
    	$provincia = $recibo->personaReturn->datosGenerales->domicilioFiscal->descripcionProvincia;
    	$IDProvincia = $recibo->personaReturn->datosGenerales->domicilioFiscal->idProvincia;
    	$telefono = $recibo->personaReturn->datosGenerales->telefono->numero.' '.$recibo->personaReturn->persona->telefono->tipoLinea;
    	$mail = $recibo->personaReturn->datosGenerales->email->direccion;
    	}else{
    	$direccion = $recibo->personaReturn->persona->domicilio->direccion;
    	$localidad = $recibo->personaReturn->persona->domicilio->localidad;
    	$cp = $recibo->personaReturn->persona->domicilio->codPostal;
    	$provincia = $recibo->personaReturn->persona->domicilio->descripcionProvincia;
    	$IDProvincia = $recibo->personaReturn->persona->domicilio->idProvincia;
    	$telefono = '';
    	$mail = '';
    	}
    
    if(strlen(trim($razonsocial)) > 0){$nombre = $razonsocial;}else{$nombre = $apellido;}
    if(strlen(trim($localidad)) > 0){$localidad = $localidad;}else{$localidad = $provincia;}
    include('../includes/conexion.php');
    
    $consul_prov = "select * from provincias where pr_afip = '$IDProvincia'";
    $resul_prov = mysql_query($consul_prov);
    $cant_prov = mysql_num_rows($resul_prov);
    $auditar=$consul_prov;include('../includes/auditar.php');
    $fila_prov = mysql_fetch_array($resul_prov);
    mysql_close($con_php);
    
    
    echo('Apellido  y Nombre= '.$apellido);echo('</br>');
    echo('Razon Social = '.$razonsocial);echo('</br>');
    echo('Nombre a Mostar  = '.$nombre);echo('</br>');
    echo('Tipo clave = '.$tipoclave);echo('</br>');
    echo('direccion = '.$direccion);echo('</br>');
    echo('Localidad = '.$localidad);echo('</br>');
    echo('C.P. = '.$cp);echo('</br>');
    echo('TelefonoP. = '.$telefono);echo('</br>');
    echo('Mail = '.$mail);echo('</br>');
    echo('Provincia = '.$provincia.' ==>  '.$fila_prov[pr_nombre]);echo('</br>');
    echo('ID Provincia = '.$IDProvincia.' ==>  '.$fila_prov[pr_id]);echo('</br>');
    #################
    ### Impuestos ###
    #################
    $tabla = $recibo->personaReturn->datosRegimenGeneral->impuesto;
    $tabla_mono = $recibo->personaReturn->datosMonotributo->impuesto;
    if($tabla > 0){$elementos = count ($tabla);}else{$elementos = count ($tabla_mono);}
    $elementos = count ($tabla);
    $iva = 99;
    if($tabla >0){
    	if($elementos < 2){
    		if($recibo->personaReturn->datosRegimenGeneral->impuesto->idImpuesto == '30'){$iva = '30';}
    		if($recibo->personaReturn->datosRegimenGeneral->impuesto->idImpuesto == '20'){$iva = '20';}
    		if($recibo->personaReturn->datosRegimenGeneral->impuesto->idImpuesto == '21'){$iva = '20';}
    		if($recibo->personaReturn->datosRegimenGeneral->impuesto->idImpuesto == '33'){$iva = '32';}
    		}else{
    		for($i=0;$i<$elementos;$i++){
    				echo('Impuesto. = '.$recibo->personaReturn->datosRegimenGeneral->impuesto[$i]->idImpuesto);echo('</br>');
    				if($recibo->personaReturn->datosRegimenGeneral->impuesto[$i]->idImpuesto == '30'){$iva = '30';}
    				if($recibo->personaReturn->datosRegimenGeneral->impuesto[$i]->idImpuesto == '20'){$iva = '20';}
    				if($recibo->personaReturn->datosRegimenGeneral->impuesto[$i]->idImpuesto == '21'){$iva = '20';}
    				if($recibo->personaReturn->datosRegimenGeneral->impuesto[$i]->idImpuesto == '33'){$iva = '32';}
    				}
    		}
    }else{
    	if($elementos < 2){
    		if($recibo->personaReturn->datosMonotributo->impuesto->idImpuesto == '30'){$iva = '30';}
    		if($recibo->personaReturn->datosMonotributo->impuesto->idImpuesto == '20'){$iva = '20';}
    		if($recibo->personaReturn->datosMonotributo->impuesto->idImpuesto == '21'){$iva = '20';}
    		if($recibo->personaReturn->datosMonotributo->impuesto->idImpuesto == '33'){$iva = '32';}
    		}else{
    		for($i=0;$i<$elementos;$i++){
    				echo('Impuesto. = '.$recibo->personaReturn->datosMonotributo->impuesto[$i]->idImpuesto);echo('</br>');
    				if($recibo->personaReturn->datosMonotributo->impuesto[$i]->idImpuesto == '30'){$iva = '30';}
    				if($recibo->personaReturn->datosMonotributo->impuesto[$i]->idImpuesto == '20'){$iva = '20';}
    				if($recibo->personaReturn->datosMonotributo->impuesto[$i]->idImpuesto == '21'){$iva = '20';}
    				if($recibo->personaReturn->datosMonotributo->impuesto[$i]->idImpuesto == '33'){$iva = '32';}
    				}
    		}
    	
    }
    // LeerIVA en base al codigo fiscarl.
    include('../includes/conexion.php');
    $consul_iva = "select * from iva where iv_afip = '$iva'";
    $resul_iva = mysql_query($consul_iva);
    $cant_iva = mysql_num_rows($resul_iva);
    $auditar=$consul_iva;include('../includes/auditar.php');
    $fila_iva = mysql_fetch_array($resul_iva);
    mysql_close($con_php);
    
    
    echo('ID Impuesto. = '.$iva.'  ==>  '.$fila_iva[iv_id]);echo('</br>');
    echo('Impuesto. = '.$descripcion.'  ==>  '.$fila_iva[iv_nombre]);echo('</br>');
    # si es monotributo
    echo('ID Impuesto. = '.$recibo->personaReturn->datosMonotributo->categoriaMonotributo->idImpuesto);echo('</br>');
    echo('Categoria. = '.$recibo->personaReturn->datosMonotributo->categoriaMonotributo->descripcionCategoria);echo('</br>');
    echo('ID Categoria. = '.$recibo->personaReturn->datosMonotributo->categoriaMonotributo->idCategoria);echo('</br>');
    echo('*******************************************************************************************************************************************');echo('</br>'); 
    $ok = 0;
    if($recibo->personaReturn->errorConstancia->idPersona > 0){$nombre = $recibo->personaReturn->errorConstancia->apellido.'; '.$recibo->personaReturn->errorConstancia->nombre;
    														   $direccion = $recibo->personaReturn->errorConstancia->error;
    														   $ok = 9;
    														   $tipoclave = 'CUIL';
    														  } // Si el dato ingresado no tiene datos en la afip
    
    if($recibo->faultstring){$ok=9;$direccion='No existe persona con ese Id';}
    
    $datos_afip = array("ok"=>0,"nombre"=>$nombre,"direccion"=>$direccion,"cp"=>$cp,"prov"=>$fila_prov[pr_id],"iva"=>$fila_iva[iv_id],"localidad"=>$localidad,"telefono"=>$telefono,"mail"=>$mail,"persona"=>$persona,"tipoclave"=>$tipoclave);
    echo(json_encode($datos_afip));
    $auditar='Devuelto = '.json_encode($datos_afip);include('../includes/auditar.php');
    ?>
      Votos: 1 - Link respuesta
     
  • Fecha: 20-09-2018 03:45:37 Buenos dias..y que diferencia hay entre usar consulta al padron nivel 5 o nivel 10?   Votos: 0 - Link respuesta
     
  • Fecha: 20-09-2018 04:53:20 Los datos que trae.
    No me acuerdo exactamente cuales son las diferencias pero creo que la 5 a nivel de datos para facturar es mas completa. Creo que la 10 no trae impuestos pero si trae actividades.
      Votos: 1 - Link respuesta
     
  • Fecha: 20-09-2018 05:49:02 Y para hacer la factura que corresponde (A,B,C), hay que saber si es responsable inscripto(Factura A), y para eso dentro de los impuestos tiene que figurar el IVA q es el codigo 30 creo. En cualquier otro caso es Factura B si el emisor es responsable inscripto o C si es monotributista   Votos: 0 - Link respuesta
     
  • Fecha: 20-09-2018 07:55:59 La respuesta de getPersona es un JSON? Por que obtengo:Requested JSON parse failed, en Jquery.
    <?php
    
     
    
    include_once ($_SERVER['DOCUMENT_ROOT'].'/gestionweb/includes/afip/wsaa-client.php');
    
     
    
    define ("URLS", "https://awshomo.afip.gov.ar/sr-padron/webservices/personaServiceA4?WSDL");
    
    $CUIT=$_POST['CUIT'];
    
    $CUITI=(float)$CUIT;
    
     
    
    if (isset($_POST['CUIT'])){
    
        $wsdl_p5="https://awshomo.afip.gov.ar/sr-padron/webservices/personaServiceA4?WSDL";
    
        $padron = new SoapClient($wsdl_p5, array(
    
    'soap_version' => SOAP_1_1,
    
    'location' => URLS,
    
    'exceptions' => 0,
    
    'trace' => 1)
    
    );
    
    $TA = simplexml_load_file("C:\\xampp\htdocs\gestionweb\includes\afip\TA.xml");
    
     
    
     
    
    $resultado = $padron->getPersona(
    
    array(
    
    'token' => $TA->credentials->token,
    
    'sign' => $TA->credentials->sign,
    
    'cuitRepresentada' => 20357161178, // es el cuit con el que pedi el certificao
    
    'idPersona' =>$CUITI,
    
    )
    
    );
    
     
    
     
    
    echo json_encode($resultado);
    
    }
    
     
    
    ?>


    Ademas..como se podria capturar el error de AFIP para mostrarlo por pantalla
      Votos: 0 - Link respuesta
     
  • Fecha: 20-09-2018 10:37:52 Afip me respondio esto:

    Estimado.
    A través de la presente se informa que el Servicio Web de Consulta de Padrón denominado A4 ha quedado limitado para Organismos Públicos.

    Próximamente se habilitará un nuevo Servicio Web de Padrón para consulta de datos referidos a CUIT/CUIL/CDI al que podrá tener acceso.
      Votos: 1 - Link respuesta
     
  • Fecha: 21-09-2018 03:02:39 Muchas gracias @Marcela, me confundi y puse la url del nivel 4.

    Igualmente como hago para leer la respuesta, porque no es un json. Muchas gracias
      Votos: 0 - Link respuesta
     
  • Fecha: 25-09-2018 16:58:52 Matias, leyendo tu código vi que llamas a "calcular_cuil.php" Yo quería agregarlo para poder buscar en el padron y nunca pude hacerlo, hay varios ejemplos y son distintos. Vos podrás compartir ese script?

    Saludos.
      Votos: 0 - Link respuesta
     
  • Fecha: 26-09-2018 04:39:13 Hola Gustavo, te paso mi código.
    los dos primeros dígitos so 20 o 27 dependiendo del sexo

    <?php
    if($tipo_doc == 10){$a1= 2;$a2 = 0;}else{$a1= 2;$a2 = 7;} // si es 10 el dni pertenece a un masculino
    $doc = substr('00000000'.trim($persona),-8); // Lo completo con ceros por las dudas que no tenga los 8 digitos. 
    
    $a3 = substr($doc,0,1);
    $a4 = substr($doc,1,1);
    $a5 = substr($doc,2,1);
    $a6 = substr($doc,3,1);
    $a7 = substr($doc,4,1);
    $a8 = substr($doc,5,1);
    $a9 = substr($doc,6,1);
    $a0 = substr($doc,7,1);
    $cuil_total = ($a1*5)+($a2*4)+($a3*3)+($a4*2)+($a5*7)+($a6*6)+($a7*5)+($a8*4)+($a9*3)+($a0*2);
    $cuil_divido = floor($cuil_total / 11);
    $cuil_resto = $cuil_total - ($cuil_divido * 11);
    if($cuil_resto == 0){$digito = '0';$xy=$a1.$a2;}
    
    // Si el resto es 1, dependiendo del sexo el dígito es distinto y se le cambian los dos primeros dígitos
    
    if($cuil_resto == 1 and $tipo_doc == 10){$digito = '9';$xy='23';}
    if($cuil_resto == 1 and $tipo_doc == 11){$digito = '4';$xy='23';}
    if($cuil_resto > 1){$digito = 11-$cuil_resto ;$xy=$a1.$a2;}
    //echo('Entrada = '.$tipo_doc.'   '.$persona);echo('<br>');
    //echo('Salida = '.$xy.'-'.$persona.'-'.$digito);echo('<br>');
    $cuil = $xy.$doc.$digito;
    $persona = (double) $cuil;
    ?>


    Saludos
      Votos: 0 - Link respuesta
     
  • Fecha: 26-09-2018 05:09:16 Hola Matias, podrías subir el resto de los includes para que el código quede completo. Soy novato en PHP.

    Muchas gracias. Saludos.
      Votos: 0 - Link respuesta
     
  • Fecha: 26-09-2018 05:37:14 No hay includes en este código.

    $tipo_doc 10 es sexo masculino y 11 es femenino
    $persona = el numero de documento
      Votos: 0 - Link respuesta
     
  • Fecha: 26-09-2018 06:20:59 Me refiero al código de mas arriba. El de conexión me imagino que hace, los otros

    include("../includes/versesion.php");
    include('../includes/auditar.php')
    include('../includes/conexion.php');
      Votos: 0 - Link respuesta
     
  • Fecha: 26-09-2018 06:55:16 Son de uso interno.
    El de conexcion.php ==> se conecta a la base de daos.

    El de auditar.php ==> graba un txt con lo que esta haciendo el sistema, es la forma que tengo de ver después si hay algún problema.

    el de versesion.php ==> son datos del entorno de trabajo que no tienen relación con la función de factura electronica. Quien se conecto, si esta autorizado a trabajar con esa parte del sistema.

    Podes borrar esos tres que no debería cambiarte la lógica.

    El de conexión tendrás que ver como obtenes tu información
      Votos: 0 - Link respuesta
     
  • Fecha: 26-09-2018 07:16:53 Excelente, muchas gracias por tu tiempo. Saludos.   Votos: 0 - Link respuesta
     
  • Fecha: 26-09-2018 12:36:26 Buenas, me sale el siguiente error:
    homologacion
    SOAP Fault: ns1:coe.notAuthorized Computador no autorizado a acceder al servicio

    Ya habilité en Afip para ws Padrón5 para mi cuit de pruebas

    Estoy probando con estos parámetros, esta ok? :

    modo = 'H'; // valores posibles H = Homologacion -- P = Produccion
    $certificado = "certificado.crt"; // es el certificado obtendio de administrador del webservice a conectarse
    $clave = "clave.key"; // Es la clave generada an el open_ssl
    $persona = 27184742859;// (double) $_POST[cuit]; // Es el cuit que busco
    $tipo_doc = 27184742859; //$_POST[tipo_doc]; // Es el cuit que busco
    $tipo_doc = 11; // 10 Masculino 11 Femenino
    $persona = 27184742859; // CENTRO ACADEMICO DE SALUD

    define ("CUIT", "20150659???"); //Aquí puse mi cuit de prueba

    'cuitRepresentada' => 20150659???, // es el cuit con el que pedi el certificao Acá puse mi cuit de prueba


    Desde ya muchas gracias. Saludos.
      Votos: 0 - Link respuesta
     
  • Fecha: 26-09-2018 13:19:37 el certificado es el de prueba.
    Habilitaste el certificado en el computador para pruebas......

    No se los pasos de memoria en la afip. siempre doy tres millones de vueltas hasta que sale
      Votos: 0 - Link respuesta
     
  • Fecha: 27-09-2018 03:10:22 Disculpen.. el servicio personaServiceA5 esta funcionando?   Votos: 0 - Link respuesta
     
  • Fecha: 27-09-2018 03:54:09 Lo acabo de probar y funciona   Votos: 0 - Link respuesta
     
  • Fecha: 28-09-2018 14:50:38 Buenas, Ya logré que me devuelva los datos. Disculpen mi ignorancia. En el caso que les paso cual es la condición de IVA. Este por ejemplo es Responsable inscripto pero no lo dice en ningún campo. Solo IVA Idimpuesto=30 pero en la tabla que tengo el 30 no existe. Si el 1. Gracias. Saludos.

    {"personaReturn":{"datosGenerales":{"domicilioFiscal":{"codPostal":"1431","descripcionProvincia":"CIUDAD AUTONOMA BUENOS AIRES","direccion":"MENDOZA 5073 Piso:3","idProvincia":0,"tipoDomicilio":"FISCAL"},"estadoClave":"ACTIVO","fechaContratoSocial":"2016-04-04T12:00:00-03:00","idPersona":30715324349,"mesCierre":1,"razonSocial":"GENERACION MAS S.R.L.","tipoClave":"CUIT","tipoPersona":"JURIDICA"},"datosRegimenGeneral":{"actividad":{"descripcionActividad":"SERVICIOS DE ENSE\u00d1ANZA N.C.P.","idActividad":854990,"nomenclador":883,"orden":1,"periodo":201608},"impuesto":[{"descripcionImpuesto":"GANANCIAS SOCIEDADES","idImpuesto":10,"periodo":201608},{"descripcionImpuesto":"IVA","idImpuesto":30,"periodo":201608},{"descripcionImpuesto":"REGIMENES DE INFORMACI\u00d3N","idImpuesto":103,"periodo":201608},{"descripcionImpuesto":"EMPLEADOR-APORTES SEG. SOCIAL","idImpuesto":301,"periodo":201707}]},"metadata":{"fechaHora":"2018-09-28T20:19:25.064-03:00","servidor":"aws.afip.gov.ar"}}}{"personaReturn":{"datosGenerales":{"domicilioFiscal":{"codPostal":"1431","descripcionProvincia":"CIUDAD AUTONOMA BUENOS AIRES","direccion":"MENDOZA 5073 Piso:3","idProvincia":0,"tipoDomicilio":"FISCAL"},"estadoClave":"ACTIVO","fechaContratoSocial":"2016-04-04T12:00:00-03:00","idPersona":30715324349,"mesCierre":1,"razonSocial":"GENERACION MAS S.R.L.","tipoClave":"CUIT","tipoPersona":"JURIDICA"},"datosRegimenGeneral":{"actividad":{"descripcionActividad":"SERVICIOS DE ENSE\u00d1ANZA N.C.P.","idActividad":854990,"nomenclador":883,"orden":1,"periodo":201608},"impuesto":[{"descripcionImpuesto":"GANANCIAS SOCIEDADES","idImpuesto":10,"periodo":201608},{"descripcionImpuesto":"IVA","idImpuesto":30,"periodo":201608},{"descripcionImpuesto":"REGIMENES DE INFORMACI\u00d3N","idImpuesto":103,"periodo":201608},{"descripcionImpuesto":"EMPLEADOR-APORTES SEG. SOCIAL","idImpuesto":301,"periodo":201707}]},"metadata":{"fechaHora":"2018-09-28T20:19:25.064-03:00","servidor":"aws.afip.gov.ar"}}}
      Votos: 0 - Link respuesta
     
  • Fecha: 28-09-2018 16:33:33 El 30 es inscrito en IVA .

    https://www.afip.gob.ar/genericos/conceptosSubconceptosValidos/listadoImpuestos.asp
      Votos: 0 - Link respuesta
     
  • Fecha: 01-10-2018 04:43:55 Muchas gracias por tu respuesta Matías. Busqué un exento en IVA y me devuelve código 32. En esa lista no existe. Hay otra de IVA? Gracias. Saludos.   Votos: 0 - Link respuesta
     
  • Fecha: 22-11-2018 15:11:08 Buenas noches, debo aclarar que soy novato en php, he venido programando en vfp, pero ahora estoy necesitando migran hacia php, y lo q no interpreto del código es esta linea:

    define ("WSDL", "wsaa.wsdl");
    me da este error
    produccion
    Failed to open wsaa.wsdl
    gracias
      Votos: 0 - Link respuesta
     
  • Fecha: 27-12-2018 09:52:46 Hola, una cuestion: esta funcionando en php 5 o 7?
    Porque actualice php a su version 7.2 el XAMPP digamos y no encuentra la clase soapclient, y la libreria no aparece en el phpinfo() ni en el ini..que se puede hacer?
      Votos: 0 - Link respuesta
     
  • Fecha: 28-12-2018 09:01:08 Yo lo tengo funcionando en 5.6
    Debe haber algún instalador de la libreria.
    Proba con
    sudo apt-get install php7.2-soap
    sudo service apache2 restart
      Votos: 1 - Link respuesta
     
  • Fecha: 29-12-2018 07:33:11 Bueno encontre la solucion:

    Cambio el archivo php.ini aparentemente. Hay una linea de la siguiente forma:

    ;extension=soap

    Se debe borra el ; (punto y coma) y listo.-
      Votos: 0 - Link respuesta
     
  • Fecha: 06-01-2019 14:12:19 Muy buenas tardes disculpen, para obtener los datos de una persona con el DNI existe algo parecido? el padrón solo anda con CUIT no? y con el CUIL? gracias!   Votos: 0 - Link respuesta
     
  • Fecha: 07-01-2019 02:36:48 Si, solo anda con el CUIT/CUIL.
    Ha un forma de calcularl el CUIT/CUIL segun el DNI y el sexo

    https://maurobernal.com.ar/cuil/calcular-el-cuil/
      Votos: 0 - Link respuesta
     
  • Fecha: 07-01-2019 03:02:15 Y la autorizacion del dispositivo en sistemas online como es?

    Es decir a un cliente le voy a vender un sistema hosteado en la web. Como debo autorizar el dispositivo?

    Por otro lado generaria su key y crt y los tengo en una carpeta y la ruta en un. Ini
      Votos: 0 - Link respuesta
     
  • Fecha: 07-01-2019 13:55:06 Me registré en AFIP pero no me deja tener otro nivel de autorización que el primero como puedo subir de nivel? Gracias!!!!   Votos: 0 - Link respuesta
     
  • Fecha: 08-01-2019 02:24:56 Tenes que presentarte en la AFIP.   Votos: 0 - Link respuesta
     
  • Fecha: 08-01-2019 02:26:27 La autorizan para los sistemas online es igual que para los sistemas en una PC   Votos: 0 - Link respuesta
     
  • Fecha: 18-01-2019 02:33:05 Buen dia obtengo esta respuesta desde php
    ["personaReturn"]=> object(stdClass)#8 (3) { ["datosGenerales"]=> object(stdClass)#9 (8) { ["apellido"]=> string(6) "ANSWER" ["domicilioFiscal"]=> object(stdClass)#10 (6) { ["codPostal"]=> string(4) "3228" ["descripcionProvincia"]=> string(10) "ENTRE RIOS" ["direccion"]=> string(27) "2000 MTS. AL ESTE ESCUELA 7" ["idProvincia"]=> int(5) ["localidad"]=> string(22) "COLONIA VILLA LIBERTAD" ["tipoDomicilio"]=> string(6) "FISCAL" } ["estadoClave"]=> string(6) "ACTIVO" ["idPersona"]=> float(20224962070) ["mesCierre"]=> int(12) ["nombre"]=> string(7) "WOLFRAM" ["tipoClave"]=> string(4) "CUIT" ["tipoPersona"]=> string(6) "FISICA" }

    Pero trabajo con JQUERY entonces hago:

    $resultado = $padron->getPersona(
    array(
    'token' => $TA->credentials->token,
    'sign' => $TA->credentials->sign,
    'cuitRepresentada' => 20357161178, // es el cuit con el que pedi el certificao
    'idPersona' =>$CUITI,
    )
    );
    
    echo json_encode($resultado);
    }


    Pero en la llamada Ajax no me lo toma:

    $.ajax({
                type: "POST",
                url: "//localhost/gestionweb/includes/afip/consultaPadron.php",
                data: {"CUIT":CUIT}, 
         dataType:'json',
      
                error: function(){
                    alert("error petición ajax");
                   
                },
                
                success: function(cli){
                
                   		$.each(cli, function(i,item){
                           
    			 datosgrales=cli[i].datosGenerales;
                 datosRegimen=cli[i].datosRegimenGeneral;
             
                
    	});


    Dice Requested JSON parse failed y me da error en la peticion.
      Votos: 0 - Link respuesta
     
Para participar activamente de la comunidad primero debes autenticarte, ingresa al sistema.Iniciar Sesión
 
frjcbbae garagebible.com