Lo que quiero es: GENERAR SELLO DIGITAL EN PHP PARA FACTURA ELECTRÓNICA EN MÉXICO CON LOS REQUERIMIENTOS DEL SAT
Para ello contamos con:
INFORMACIÓN SOBRE COMO HACER LA FACTURA ELECTRÓNICA SEGÚN EL SAT:
Anexo 20:
http://www.sat.gob.mx/sitio_internet...s/15_3445.html
Los archivos de ejemplo se encuentran en:
http://www.sat.gob.mx/sitio_internet...s/15_6522.html
Dentro trae:
ftp://ftp2.sat.gob.mx/asistencia_ser...uestra_xml.zip
- Un xml de muestra (Muestra.xml) del CFD (Comprobante Fiscal Digital)
ftp://ftp2.sat.gob.mx/asistencia_ser.../Cer_Sello.zip
- Certificados de muestra Cer_Sellos.zip y dentro trae:
- Certificados de muestra pero quiero que hagan enfasis en:
- aaa010101aaa_CSD_01.cer (El primer certificado solo necesitamos 1)
- aaa010101aaa_CSD_01.key (La primera key y solo necesitamos 1)
- Contraseña de Clave Privada.txt (Pass para abrir el key)
Nos facilita también una cadena original:
||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||
Y su digestión MD5:
8aa2b617944427353697e694a2e35a07
PROBLEMA CON ARCHIVOS DE EJEMPLO EN EL SAT
Hasta aquí todo va bien, tenemos todo claro y suficiente información de muestra, pero... al pasar el xml de muestra esta mal, pueden constatarlo en:
https://www.consulta.sat.gob.mx/SICO...Validador.html
Según el marco teórico mostrado en el Anexo 20, y otros recursos, podemos ver que es un proceso extremadamente sencillo, sin embargo, cuando validamos nos arroja que el sello no es válido.
DESARROLLO DE SELLO DIGITAL EN PHP
Voy a documentar el ensayo que hice para ver si ustedes me pueden auxiliar en ver que parte esta mal:
Como referencia usare Muestra.xml que tiene una estructura válida, y cuya cadena esta provista y pasa el validador como correcta y también la digestión MD5 que también es correcta, entonces lo que haré es generar un sello para dicho xml y posteriormente pegarlo para intentar pasar el validador, lo cual debería darme un resultado correcto pero no es así, pero bueno ahora puntualizo el procedimiento que seguí:
1. Primero generamos el PEM en base al key:
pem.php
Código php:
Ver original
<? /* Introducimos el nombre del key provisto por hacienda y su respectivo password, al igual que el nombre del archivo de salida PEM */ shell_exec('openssl pkcs8 -inform DER -in aaa010101aaa_CSD_01.key -passin pass:a0123456789 -out aaa010101aaa_CSD_01.key.pem'); ?>
En este punto generamos: aaa010101aaa_CSD_01.key.pem
2. Posteriormente lo usaremos en:
seal.php
Código php:
Ver original
<? /* 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 */ /* 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 */ 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 */ /* Aquí sellamos con el MD5 con el key para obtener el sello y guardarlo en sello.txt */ /* Aquí mostramos el sello que en teoría debería ser el correcto */ echo "<h5>Seal</h5>"; ?>
Hasta aqui el sello que obtengo es:
cLBps3/cBUFelW/uxxNmKGvxThUva3AjvppfCxioTBlgqttkrV0yjPvRmA2592l7W QfwN1iXCQT4eyRtblXQre37a+EV4+vGuJD5Oah6ED1U/sVP2ak53nH31RhnQQeQN8NV2TtpjKQaNn64doKwVg9SGDn8Ppk pzlPBiqH5164=
Ahora lo que hice para checarlo es pegar dicho sello a Muestra.xml, quedando así:
Código xml:
Ver original
<?xml version="1.0" encoding="UTF-8"?> <Comprobante fecha="2005-09-02T16:30:00" folio="1" noAprobacion="1" noCertificado="00001000000000000114" sello="[B]cLBps3/cBUFelW/uxxNmKGvxThUva3AjvppfCxioTBlgqttkrV0yjPvRmA2592l7WQfwN1iXCQT4eyRtblXQre37a+EV4+vGuJD5Oah6ED1U/sVP2ak53nH31RhnQQeQN8NV2TtpjKQaNn64doKwVg9SGDn8PpkpzlPBiqH5164=[/B]" serie="A" version="1.0"> <Emisor nombre="Industrias del Sur Poniente, S.A. de C.V." rfc="ISP900909Q88"> <DomicilioFiscal calle="Alvaro Obregón" codigoPostal="06700" colonia="Col. Roma Norte" estado="Distrito Federal" localidad="México" municipio="Cuauhtémoc" noExterior="37" noInterior="3" pais="México"/> <ExpedidoEn calle="Pino Suarez" codigoPostal="95460" colonia="Centro" estado="Nuevo Léon" localidad="Monterrey" municipio="Monterrey" noExterior="23" pais="México"/> </Emisor> <Receptor nombre="Rosa María Calderón Uriegas" rfc="CAUR390312S87"> <Domicilio calle="Topochico" codigoPostal="95465" colonia="Jardines del Valle" estado="Nuevo León" localidad="Monterrey" municipio="Monterrey" noExterior="52" pais="México"/> </Receptor> <Conceptos> <Concepto cantidad="10" descripcion="Vasos decorados" importe="200" unidad="Caja" valorUnitario="20"/> <Concepto cantidad="1" descripcion="Charola metálica" importe="150" unidad="pieza" valorUnitario="150"/> </Conceptos> <Impuestos> <Traslados> <Traslado importe="52.5" impuesto="IVA"/> </Traslados> </Impuestos> </Comprobante>
RESULTADO
Pero a la hora de validarlo con el certificado de ejemplo (aaa010101aaa_CSD_01.cer) en:
https://www.consulta.sat.gob.mx/SICO...Validador.html
Este sello no es válido.
Me gustaría saber si alguien lo obtiene de manera diferente, no puse validaciones ni como generar el xml ya que lo que básicamente me interesa es que el sello sea válido y espero que también les sea de utilidad.
Saludos a todos.