fortiz escribió:Hola,
Ya estoy un poco mas contento con los resultados de mi validador en PHP.
Todavia no llega ni a los tobillos del validacfd de
dado pero les mando la liga
http://www.lacorona.com.mx/fortiz/sat/cfdcvali.php
Como siempre, estoy abierto a cualquier sugerencia para mejorar el programa.
Saludos
Que tal fortiz, tu siempre con tus excelentes aportes. Yo desarrollé un validador para una empresa, pero me anticipé a los problemas de validación cuando un sello es generado con un certificado erroneo. Hoy precisamente me tocó descubrir que uno de los proveedores de esta empresa se encuentra en este caso. Me tomo casi una semana darme cuenta de ello. Y he aqui el resultado:
NO UTILIZEN EL CERTIFICADO QUE VIENE EN EL CFD!!!!!
La caldera esta por explotar, ya que esta empresa no le ha pagado a su proveedor desde Enero por que no pasan los CFD la validación en el software que desarrollé, pero si en el validador del SAT. El problema es que no se seleccionó la opción de descargar CSD. Cuando se selecciona esta opción, el validador oficial la marca como inválida. El veredicto fué que el proveedor está usando un CSD incorrecto.
En el caso del validador de fortiz, si utiliza el certificado que viene en el CFD, por eso si pasaba la validación ahi. Pero realmente era inválido.
Dejo a continuación mi granito de arena con el código para descarga del CSD del FTP de hacienda:
Código: Seleccionar todo
<?php
$noCertificado = '00001000000112345678'; // Este deben reemplazarlo con el valor del atributo noCertificado del nodo Comprobante
$rutaFtp = '/Certificados/FEA/' . substr($noCertificado, 0, 6) . '/' . substr($noCertificado, 6, 6) . '/' . substr($noCertificado, 12, 2) . '/' . substr($noCertificado, 14, 2) . '/' . substr($noCertificado, 16, 2) . '/' . $noCertificado . '.cer';
$conn = ftp_connect('ftp2.sat.gob.mx');
ftp_login($conn, 'anonymous', 'test@ejemplo.com');
ftp_get($conn, "/tmp/{$noCertificado}.cer", $rutaFtp, FTP_BINARY); // Aqui estamos descargando el certificado en una ruta temporal, ya que viene en formato DER
ftp_close($conn);
$publica = array();
exec("openssl x509 -inform DER -outform PEM -in /tmp/{$noCertificado}.cer -pubkey", $publica); // Hay que convertir el certificado de formato DER a PEM para poder ser usado en PHP. En este caso, esto se ejecuta en un servidor Linux.
$certificado = implode("\n", $publica);
$pubkeyid = openssl_get_publickey($certificado); // Y aqui ya tienen su llave publica lista para iniciar a validar CFD
Espero sea de ayuda para quien esté haciendo esta clase de implementaciones.
Saludos!!