Nueva pregunta

Pregunta:

Fecha: 08-08-2019 10:45:02 (En Español)

No puedo obtener ticket WSAA de AFIP[Resuelta]

Buenas tardes,
Estoy teniendo problemas para generar un ticket de acceso a los WS de AFIP.
Mi idea es consultar datos de Factura electrónica de Crédito, pero no logro pasar la instancia de generación de ticket.
Los ejemplos que uso están sacados de este mismo foro pero el mensaje de error siempre es el mismo:
SOAP Fault: ns1:cms.cert.untrusted Certificado no emitido por AC de confianza

Gestioné dos certificados diferentes (de igual propósito, por si me estaba olvidando de algo), siguiendo el procedimiento de AFIP hasta obtener los archivos necesarios (.pem, .cer, .key, .csr). Pero el mensaje de error persiste.

La idea es trabajar en el ambiente de testing. Adjunto el código por si alguno ve algo que yo no estoy viendo:

<?php
    #==============================================================================
    define ("WSDL",  dirname(dirname(__FILE__))."\ws\wsaa.wsdl");     # The WSDL corresponding to WSAA
    define ("CERT", dirname(dirname(__FILE__))."\ws\certificado.crt");  # The X.509 certificate in PEM format
    define ("PRIVATEKEY", dirname(dirname(__FILE__))."\ws\certificado.key"); # The private key correspoding to CERT (PEM)
    define ("PASSPHRASE", ""); # The passphrase (if any) to sign
    define ("PROXY_HOST", ""); # Proxy IP, to reach the Internet
    define ("PROXY_PORT", ""); # Proxy TCP port
    define ("URL", "https://wsaahomo.afip.gov.ar/ws/services/LoginCms");
	#define ("URL", "https://wsaa.afip.gov.ar/ws/services/LoginCms?wsfe");
	
    #------------------------------------------------------------------------------
    # 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('destination','CN=wsaa, O=AFIP, C=AR, SERIALNUMBER=CUIT 33693450239');
      $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('TRAFE.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( "C://xampp/htdocs/ws/TRAFE.xml", 
								"C://xampp/htdocs/ws/TRAFE.tmp", 
								"file://".realpath(CERT),
        array("file://".realpath(PRIVATEKEY), PASSPHRASE),
        array(),
        !PKCS7_DETACHED
        );
      if (!$STATUS) {exit("ERROR generating PKCS#7 signature\n");}
      $inf=fopen("C://xampp/htdocs/ws/TRAFE.tmp" , "r");
      $i=0;
      $CMS="";
      while (!feof($inf)) 
        { 
          $buffer=fgets($inf);
          if ( $i++ >= 4 ) {$CMS.=$buffer;}
        }
      fclose($inf);
      unlink("C://xampp/htdocs/ws/TRAFE.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'=>base64_encode($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->loginCmsResponse;
    }
   
    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");}
    setlocale(LC_ALL,"es_RA");
    
    $SERVICE="wsfe";
    CreateTRA($SERVICE);
    $CMS=SignTRA();
		
    $TA=CallWSAA(base64_decode($CMS));

	if (!file_put_contents("TAFE.xml", $TA)); {exit();}
		
       
    ?>


Será bienvenida la ayuda.
Muchas gracias.
Etiquetas: PHP - SOAP Votos: 0 - Respuestas: 4 - Vistas: 12 Compartir en: Google Facebook Twitter LinkedIn Link
 

Respuestas:

  • Fecha: 09-08-2019 08:14:24 hola has intentado firmar de esta forma
    if (openssl_pkcs7_sign("mensaje.txt", "firmado.txt", "micert.pem",
        array("file://micert.pem", "mi_frase_de_contraseña"),
        array("Para" => "joes@example.com", // sintaxis asociativa
              "DE: C.G. <presidente@example.com>", // sintaxis indexada
              "Tema" => "Confidencial")
        )) {
        
        exec(ini_get("ruta_correo") . " < firmado.txt");
    }
    
      Votos: 0 - Link respuesta
     
  • Fecha: 09-08-2019 09:06:46 Hola Andy.
    Te agradezco la respuesta.
    Aperentemente (según estoy hablando con la gente de AFIP) el problema no está en el código sino en el modo en el que se creó el certificado.
    Cuando tenga un poco más de información, les comento.
    Muchas gracias.
    Saludos
      Votos: 0 - Link respuesta
     
  • Fecha: 12-08-2019 03:59:03 Buenos días a todos.
    Ya encontré el problema: era mío, no de AFIP (de quien destaco la buena predisposición de su soporte para asistirme).
    Al interpretar equivocadamente la forma de generar el certificado, iniciaba todo el proceso en WAASS, pero descargaba el certificado final, el .cer desde la administración de certificados digitales, por ende, los generaba como testing y los descargaba como producción.
    Lo que debía hacer, que no lo interpreté hasta último momento, es hacer un copy&paste del code64 del certificado desde WSASS y generar el archivo .cer con esta información.
    Hecho esto, el mensaje de error ahora tiene que ver con las fechas por certificado vencido y no con el entorno de ejecución del WS.
    Lamento no haberme dado cuenta antes.
    Espero que este información le resulte de utilidad a algún otro despistado como yo.
    Saludos.

    Pablo R. Fernández
      Votos: 0 - Link respuesta
     
  • Fecha: 22-09-2020 08:15:18 Hola Pablo! Buenas tardes. Cómo podriamos hacer para q me des un asesoramiento sobre el tema. Gracias.   Votos: 0 - Link respuesta
     
Para participar activamente de la comunidad primero debes autenticarte, ingresa al sistema.Iniciar Sesión