Programación Específica > Diseño de Algoritmos
[Utilidad] Facturacion electronica Mexico
adiposin:
Muchas gracias Francisco Tanori por tan buen aporte obtuve la ayuda que me faltaba para la obtención del sello digital después de haber batallado cerca de 15 hrs... ¡Gracias!
adiposin:
Como agradecimiento a la ayuda que he recibido de toda la comunidad en estey otros foros con gusto les puedo compartir info de cómo generar el sello digital con PHP
adiposin:
Amigo plussmx<br><br>
te comparto el código PHP para la generación del sello digital:
<?php
/* Definimos donde esta el key en formato PEM */
$key=\'aaa010101aaa_CSD_01.key.pem\';
/* Introducimos la cadena original provista por el SAT */
$cadenaoriginal=\'||A|1|2005-09-02T16:30:00|1|ISP900909Q88|Industrias del Sur Poniente S.A. de C.V.|Alvaro Obregón|37|3|Col. Roma Norte|México|Cuauhtémoc|Distrito Federal|México|06700|Pino Suarez|23|Centro|Monterrey|Monterrey|Nuevo Léon|México|95460|CAUR390312S87|Rosa María Calderón Uriegas|Topochico|52|Jardines del Valle|Monterrey|Monterrey|Nuevo León|México|95465|10|Caja|Vasos decorados|20|200|1|pieza|Charola metálica|150|150|IVA|52.5||\';
/* Transformamos la cadena a UTF8 */
$cadena = utf8_encode($cadenaoriginal) ;
/* Hacemos un echo para ver la cadena en UTF8 (no es necesario pero es para ir paso por paso) */
echo \'<h5>UTF8</h5>\'.$cadena;
/* Hacemos un echo para ver la cadena en MD5 aquí obtenemos el mismo resultado que el SAT */
$cadena=md5($cadena);
echo \'<h5>MD5</h2>\'.$cadena;
/* Aquí lo que hacemos es escribir un txt (md5.txt) con la digestión MD5 para usarlo en el sellado */
$fp = fopen (\"md5.txt\" \"w+\");
fwrite($fp $cadena);
fclose($fp);
/* Aquí sellamos con el MD5 con el key para obtener el sello y guardarlo en sello.txt */
$hola1=shell_exec(\'\"C:\\Archivos de programa\\GnuWin32\\bin\\openssl.exe\" dgst -out C:\\wamp\\www\\en-trega\\fiscal-soft\\Firma.binario -sign C:\\wamp\\www\\en-trega\\fiscal-soft\\aaa010101aaa_CSD_01.key.pem C:\\wamp\\www\\en-trega\\fiscal-soft\\md5.txt\');
$hola2=shell_exec(\'\"C:\\Archivos de programa\\GnuWin32\\bin\\openssl.exe\" enc -in C:\\wamp\\www\\en-trega\\fiscal-soft\\Firma.binario -a -A -out C:\\wamp\\www\\en-trega\\fiscal-soft\\Firma.base64\');
/* Aquí mostramos el sello que en teoría debería ser el correcto */
echo \"<h5>Seal</h5>\";
//$hello=readfile(\"sello.txt\");
$hello=readfile(\"Firma.base64\");
echo \"<br>\".$hola1.\" \".$hola2.\" \".$hello.\"<br>\";
?>
Saludos!!
mauriciobaeza:
Hola Francisco:
Antes que nada agradezco tu aporte me a aclarado algunas dudas.
Respecto al archivo si voy a la página de validación del SAT: https://www.consulta.sat.gob.mx/SICOFI_WEB/ModuloECFD_Plus/ValidadorComprobantes/Validador.html
Con el archivo xml y el archivo CER me dice que el sello es valido. El sello que tiene este archivo xml es el siguiente:
UlUSwGNEicfigV6i4RhTy0eb2RYWFYyFatJFcM/u5Wlkb5XRxXiCizTGw5Yxz9oZNk8msAgO4C5Gevjh+S2TJPZueYhaQeZlo6k0rE3CQexkOGVRpHkvAoAgOM5kGKzYe24DKZbTgjNL+ai+tbhEHmRAFcpv2rDpehbL3w6BnYU=
Ahora al intentar generar este sello con el archivo KEY y el MD5.txt de tus archivos muestra me genera el siguiente sello:
GrO5fVxXDbmHbjrELI1j2OsVZqSLt4GLcESB8r4lprASJ/jrNWzsL4HyUMFMQQMUdDIBUuqqlam0+yZLstMC3n0G8Cl1clepXcjUJhzPnlKdjRGoCE5KiSKBUiEeXlOjwVdnhnIKdNnHtZUbfQhzRrsrN40UzAH1lrnqLLdbFjI=
El comando que uso:
openssl dgst -sign archivo.pem md5.txt | openssl enc -base64 -a -A > sello.txt
Lo curioso es que este sello lo generaba en Linux al tratar de hacerlo en Windows(XP/7) con los archivos que proporcionas me daba otro totalmente diferente:
2XZhPGVaS4h0xx5AGBOrTgpaGmnBJ16+jkDgD1vD+TvOKxSdJNTHATtr4F38Lr0GRJA5KbJq5UEiSRXSKeUJaIOG8BLTQmDNsVbsEqD5bk97LABVIaGZor8i8HaF1qdV3ymV1Dz15rGeWWcuUyQQLI1tuOpi6se8EBRLMYVWNz4=
Después caí en la cuenta de que estaba usando la versión 1.0.0a del openssl en Linux y tu tienes la 0.9.8 para Windows probe la 1.0.0a para Windows y ahora si obtengo los mismos sellos tanto en Linux como en Windows solo que no es el mismo de tu archivos xml de muestra.
¿Tendrás alguna idea de por que?
Agradezco cualquier comentario.
Un abrazo
mauriciobaeza:
Hola de nuevo...
Por fin he obtenido un sello digital valido. El secreto esta en al forma en que se pasan los parámetros:
xsltproc cadenaoriginal_2_0.xslt factura.xml | openssl dgst -md5 -sign archivo.pem | openssl enc -base64 -A > sello.txt
cadenaoriginal_2_0.xslt = archivo descargado de la página del SAT que sirve para extraer la cadena original http://www.sat.gob.mx/sitio_internet/cfd/2/cadenaoriginal_2_0/cadenaoriginal_2_0.xslt
factura.xml = archivo de la factura ya en formato xml en este momento no es necesario que contenga los datos del certificado o el sello estos se pueden agregar después.
archivo.pem = archivo con la clave privada para firmar en formato PEM
sello.txt = el sello digital
PENDIENTES:
Encontrar la forma de hacer los pasos separados y nos de el mismo resultado
Poder usar los XSLT sin conexión a Internet
Ojala les sirva.
Saludos
Navegación
[#] Página Siguiente
[*] Página Anterior
Ir a la versión completa