Página 1 de 1

Saber que PAC timbro un CFDi (XML)

Publicado: Mié Dic 18, 2013 6:04 pm
por isantosp
Que tal..

Si tengo un XML de un CFDi para validar, como puedo saber que PAC timbro dicho CFDi???

Tengo un codigo para validar la estructura del XML, el sello del CFDi asi como el sello del Timbre Fiscal Digital, pero necesito además de ese mismo XML saber que PAC fue el que lo timbro..

NOTA: Yo no genero ese XML, puede ser cualquier XML correctamente timbrado.
Estoy desarrollando en PHP

Espero alguien me pueda ayudar con esto..

Gracias de Antemano.. ;)

Re: Saber que PAC timbro un CFDi (XML)

Publicado: Sab Dic 21, 2013 3:25 pm
por vivanchox
Hola:

Puedes extraer el valor del certificado del SATy compararlo con una lista de todos los PACs que existen...

Saludos

Re: Saber que PAC timbro un CFDi (XML)

Publicado: Jue Dic 26, 2013 12:26 pm
por isantosp
Hola vivanchox, gracias por responder..

Donde puedo encontrar esa lista?? y en esa lista esta el numero del certificado o como encuentro ahí a que PAC pertenece el .cer??

Porque también no mencione que el certificado en si del PAC, el archivo .cer, lo descargo directamente del ftp del SAT pero no encuentro por ningún lado, en mismo cer con OpenSSL, a que PAC pertenece..

Te agradecería si tuvieras algún ejemplo de como hacerlo.. o_O

Re: Saber que PAC timbro un CFDi (XML) [SOLUCION]

Publicado: Mar Ene 07, 2014 1:08 pm
por isantosp
Pues finalmente he podido saber que PAC timbro un CFDi y les comparto la info esperando le sirva a alguien mas:

Primero hay que tener la lista del SAT de los PAC's, que se puede encontrar aqui http://www.sat.gob.mx/sitio_internet/as ... 19264.html
Teniendo esta lista en alguna BD podemos simplemente extraer el noCertificadoSAT del nodo TimbreFiscalDigital del XML en cuestion y buscando ese CSD en nuestra BD.

Pero si esto no es suficiente y/o queremos ir mas alla podemos acceder al CSD en los servidores del SAT de la siguiente manera:
Si tenemos por ejemplo el CSD en una variable de PHP $noCert generamos la URL del archivo .cer segmentando el mismo $noCert como sigue:

Código: Seleccionar todo

$dir1 = substr($noCert,0,6);
$dir2 = substr($noCert,6,6);
$dir3 = substr($noCert,12,2);
$dir4 = substr($noCert,14,2);
$dir5 = substr($noCert,16,2);
$url = "ftp://ftp2.sat.gob.mx/certificados/FEA/$dir1/$dir2/$dir3/$dir4/$dir5/$noCert.cer";
Ya que tenemos la URL podemos leer el archivo y leer la info del certificado con openssl_x509_parse:

Código: Seleccionar todo

$der = file_get_contents($url);
$pem = base64_encode($der);
$cert = "-----BEGIN CERTIFICATE-----\n".chunk_split($pem,64)."-----END CERTIFICATE-----\n";

$arrInfo = openssl_x509_parse($cert);
Por ultimo, en el array generado, si entramos a subject/OU encontramos una cadena de 20 caracteres que nos dice tanto el RFC del PAC como el Número de Autorización del SAT, con la estructura PAC{RFC(12 caracteres)}{NoAUT(5 caracteres)}
Sabiendo esto podemos obtener estos valores como sigue:

Código: Seleccionar todo

$pac= $arrInfo['subject']['OU'];
$rfcPAC = substr($pac, 3, 12);
$noAut = substr($pac, -5);
Y ya podremos buscar en nuestra BD por Número de Certificado, RFC o Número de Autorización.


Espero esta info le sirva a alguien más ;)

Saludos..

Re: Saber que PAC timbro un CFDi (XML) [SOLUCION]

Publicado: Jue Jul 31, 2014 6:31 pm
por meximaster
Wow isantosp, muchas gracias por la información, en serio que ayudo!
Si necesitas ayuda en algo no dudes en preguntar..

Creo que el webservice del SAT para validar facturas también puede devolver información importante, comparto el código para PHP:

Código: Seleccionar todo

	public static function validacion_sat($rfc_emisor, $rfc_receptor, $importe_total, $uuid) {
		$output = '';
		try {
			ini_set('default_socket_timeout', 20);
			$url = 'https://consultaqr.facturaelectronica.sat.gob.mx/ConsultaCFDIService.svc?wsdl';
			$client = new SoapClient($url, array(
				'soap_version'=>SOAP_1_1,
				'encoding'=>'UTF-8',
				'connection_timeout'=>4
			));
			$uuid = strtoupper($uuid);
			$cadena = "re={$rfc_emisor}&rr={$rfc_receptor}&tt={$importe_total}&id={$uuid}";
			$parameters = array(
				'expresionImpresa' => $cadena
			);
			$result = $client->Consulta($parameters);
			html_append_doublespace($output, 'Resultado: '.$result->ConsultaResult->CodigoEstatus);
			html_append_doublespace($output, 'Estado: '.$result->ConsultaResult->Estado);
		} catch (Exception $e) {
			$output = false;
		}
		return $output;
	}

Si quieren ver como funciona en producción pueden entrar a erp1.taokaizen.mx con usuario demo y password demo