Hola a todos:
Al fin pude generar una factura electrónica válida con PHP.
Tengo que agradecer a esta página http://www.lacorona.com.mx/fortiz/sat/codigo.php por haberme ayudado en mucho, verifíquenla si están haciendo el desarrollo con PHP.
Estas pruebas se están realizando en:
- PC con Windows 7 32 bits en Español
- OpenSSL versión 0.9.8g.
También tengo los siguientes datos y archivos:
- Archivo "aaa010101aaa_csd_06.key" obtenido desde la página de SAT
- Archivo "aaa010101aaa_csd_06.cer" obtenido desde la página de SAT
- Contraseña "a0123456789" obtenida desde la página de SAT
- Cadena original:
Código:
||2.0|A|1|2009-08-16T16:30:00|1|2009|ingreso|Una sola exhibición|350.00|5.25|397.25|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.00|200|1|pieza|Charola metálica|150.00|150|IVA|15.00|52.50||
Pasos que realizo para hacer pruebas:
- Abro MS-DOS
- Ejecuto el comando "openssl x509 -inform DER -outform PEM -in aaa010101aaa_csd_06.cer -pubkey > aaa010101aaa_csd_06.cer.pem"
Me genera el archivo "aaa010101aaa_csd_06.cer.pem" con el siguiente contenido:
Código:
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDy2Ukb2/n7DNA4uD81rWC4gvFK
3l8FSYkcbSpiJluEFgEWKZwTxX++fot3BcE2mb1U+eoom5nua9PwaXEG7Xd8QsbW
bJy41N97qr6TXswAG6BprMzleX4Jx7IAWOWHy6bT3sukWUTeazMEWwFx0YJP9lW5
18J9HZff5Wy3OXHTgQIDAQAB
-----END PUBLIC KEY-----
-----BEGIN CERTIFICATE-----
MIIE/TCCA+WgAwIBAgIUMzAwMDEwMDAwMDAxMDAwMDA4MDUwDQYJKoZIhvcNAQEF
BQAwggFvMRgwFgYDVQQDDA9BLkMuIGRlIHBydWViYXMxLzAtBgNVBAoMJlNlcnZp
Y2lvIGRlIEFkbWluaXN0cmFjacOzbiBUcmlidXRhcmlhMTgwNgYDVQQLDC9BZG1p
bmlzdHJhY2nDs24gZGUgU2VndXJpZGFkIGRlIGxhIEluZm9ybWFjacOzbjEpMCcG
CSqGSIb3DQEJARYaYXNpc25ldEBwcnVlYmFzLnNhdC5nb2IubXgxJjAkBgNVBAkM
HUF2LiBIaWRhbGdvIDc3LCBDb2wuIEd1ZXJyZXJvMQ4wDAYDVQQRDAUwNjMwMDEL
MAkGA1UEBhMCTVgxGTAXBgNVBAgMEERpc3RyaXRvIEZlZGVyYWwxEjAQBgNVBAcM
CUNveW9hY8OhbjEVMBMGA1UELRMMU0FUOTcwNzAxTk4zMTIwMAYJKoZIhvcNAQkC
DCNSZXNwb25zYWJsZTogSMOpY3RvciBPcm5lbGFzIEFyY2lnYTAeFw0xMDA3MzAx
NjU4NDRaFw0xMjA3MjkxNjU4NDRaMIGWMRIwEAYDVQQDDAlNYXRyaXogU0ExEjAQ
BgNVBCkMCU1hdHJpeiBTQTESMBAGA1UECgwJTWF0cml6IFNBMSUwIwYDVQQtExxB
QUEwMTAxMDFBQUEgLyBBQUFBMDEwMTAxQUFBMR4wHAYDVQQFExUgLyBBQUFBMDEw
MTAxSERGUlhYMDExETAPBgNVBAsMCFVuaWRhZCA2MIGfMA0GCSqGSIb3DQEBAQUA
A4GNADCBiQKBgQDy2Ukb2/n7DNA4uD81rWC4gvFK3l8FSYkcbSpiJluEFgEWKZwT
xX++fot3BcE2mb1U+eoom5nua9PwaXEG7Xd8QsbWbJy41N97qr6TXswAG6BprMzl
eX4Jx7IAWOWHy6bT3sukWUTeazMEWwFx0YJP9lW518J9HZff5Wy3OXHTgQIDAQAB
o4HqMIHnMAwGA1UdEwEB/wQCMAAwCwYDVR0PBAQDAgbAMB0GA1UdDgQWBBSsOuAy
vEFZHt+J3qB77jRF7c81bzAuBgNVHR8EJzAlMCOgIaAfhh1odHRwOi8vcGtpLnNh
dC5nb2IubXgvc2F0LmNybDAzBggrBgEFBQcBAQQnMCUwIwYIKwYBBQUHMAGGF2h0
dHA6Ly9vY3NwLnNhdC5nb2IubXgvMB8GA1UdIwQYMBaAFOtZfQQimlONnnEaoFiW
KfU54KDFMBAGA1UdIAQJMAcwBQYDKgMEMBMGA1UdJQQMMAoGCCsGAQUFBwMCMA0G
CSqGSIb3DQEBBQUAA4IBAQCFiWG7tluLDmTLC3EmPPWaMuR4u6pugXet9VZGG5QQ
efU8CTA5+0NpHTJSXqDYdzGRo4tMPCO9BM+955/L0s+6/G2QKYvj7cSF8gWAAllO
V65x9k5bRhyBJfFcqvXDcvPGLlM/WyJQ8FK3LGH6mT/XEHOEBPTl1TAxt/T8xYL0
/PJEPyxIuaF3Vdp357XxvyQGScsnXWoL32oafQES5w8fEn47ybNoeCuNb0jCb/y3
FHJpI9hbzGmOXXk6MXk3Udk+qk9Ix5ETb/LYm6IcGzA7WoGschOUOVdLoJryfuO4
XldNFi+MaXxzocbiU9PpQ6gX3WnENxRFNJ9XKSYo6V3p
-----END CERTIFICATE-----
- Ejecuto el comando "openssl pkcs8 -inform DER -in aaa010101aaa_csd_06.key -out aaa010101aaa_csd_06.key.pem -passin pass:a0123456789"
Me genera el archivo "aaa010101aaa_csd_06_key.pem" con el siguiente contenido:
Código:
-----BEGIN RSA PRIVATE KEY-----
MIICWwIBAAKBgQDy2Ukb2/n7DNA4uD81rWC4gvFK3l8FSYkcbSpiJluEFgEWKZwT
xX++fot3BcE2mb1U+eoom5nua9PwaXEG7Xd8QsbWbJy41N97qr6TXswAG6BprMzl
eX4Jx7IAWOWHy6bT3sukWUTeazMEWwFx0YJP9lW518J9HZff5Wy3OXHTgQIDAQAB
AoGAbYFtZhKbdokgm3L5jcrQgmMJSylaz5eJLDhNlFSXj8gcVVIN/xxfrhaB7Pm7
VlOc/GR1IjqH/urAdvgU73rFFXJpP8M9n1qLRWI66EIyZfxT89DdwwN0JGjd4WHz
+KoYidrejdZ49S21yuX7/FSWzSE9jp4XILX2godOoiMElQECQQD5XTjBE1lrcXAQ
6GHmcIFTN+0loTTC/TTr0BmeAIcbLj46k3Yw1ymtBDRboSauJ33g2AlEDYWJ2DbH
Bho9/RIFAkEA+U+to8woLVKaPsWbzciBSep+tDP5DZ9lCDcxKVCa+Kw/0Q3UtyGD
ELH+vk/HmUdmvEbN3CWF8qEYKKW8A9pITQJAH9X9+/BrdyMpao8wiIoOiMBYH3jA
UrCfBAgybRCmLxstSK8w5LVjlbo2sQgW9x8FnCIYtL6BMQMQo0ItMYLQvQJAf3zg
NVeL4AlSePECCEwU2SCBpFLDc9TjjDz09cSTSsCCbbvd37vSUvJCaz1OuzII9hRa
5s2FXppESVze9TVlLQJAZzupMvaOozLhf/ve8BxKKCYfgG496E6IJnMU+Msb1v8r
hR18I1VZchu2jqMouhlppSxNgAWpnba+SARmdOHllA==
-----END RSA PRIVATE KEY-----
- En un archivo PHP (yo le llamé genera.php) colocan el siguiente código:
Código:
<?php
$cadenaOriginal = '||2.0|A|1|2011-08-16T16:30:00|1|2009|ingreso|Una sola exhibición|350.00|5.25|397.25|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.00|200|1|pieza|Charola metálica|150.00|150|IVA|15.00|52.50||';
$llavePrivada = openssl_get_privatekey(file_get_contents('aaa010101aaa_csd_06.key.pem'));
openssl_sign($cadenaOriginal, $sello, $llavePrivada, OPENSSL_ALGO_SHA1);
//openssl_sign($cadenaOriginal, $sello, $llavePrivada, OPENSSL_ALGO_MD5);
openssl_free_key($llavePrivada);
$sello = base64_encode($sello);
echo $sello . '<br /><br />';
$certificado = '';
$archivo = file('aaa010101aaa_csd_06.cer.pem');
$carga = false;
foreach($archivo as $linea) {
if(strstr($linea, 'END CERTIFICATE')) {
$carga = false;
}
if($carga) {
$certificado.= trim($linea);
}
if(strstr($linea, 'BEGIN CERTIFICATE')) {
$carga = true;
}
}
echo $certificado;
El código les desplegará 2 líneas, la primera es el Sello y la segunda es Certificado
- En el XML final coloquen las 2 líneas en su sección correspondiente para que les quede de la siguiente forma:
Código:
<?xml version="1.0" encoding="UTF-8"?>
<Comprobante xmlns="http://www.sat.gob.mx/cfd/2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sat.gob.mx/cfd/2 http://www.sat.gob.mx/sitio_internet/cfd/2/cfdv2.xsd" version="2.0" serie="A" folio="1" fecha="2011-08-16T16:30:00" noAprobacion="1" anoAprobacion="2009" formaDePago="Una sola exhibición" subTotal="350.00" descuento="5.25" total="397.25" tipoDeComprobante="ingreso" noCertificado="00001000000000823747" certificado="MIIE/TCCA+WgAwIBAgIUMzAwMDEwMDAwMDAxMDAwMDA4MDUwDQYJKoZIhvcNAQEFBQAwggFvMRgwFgYDVQQDDA9BLkMuIGRlIHBydWViYXMxLzAtBgNVBAoMJlNlcnZpY2lvIGRlIEFkbWluaXN0cmFjacOzbiBUcmlidXRhcmlhMTgwNgYDVQQLDC9BZG1pbmlzdHJhY2nDs24gZGUgU2VndXJpZGFkIGRlIGxhIEluZm9ybWFjacOzbjEpMCcGCSqGSIb3DQEJARYaYXNpc25ldEBwcnVlYmFzLnNhdC5nb2IubXgxJjAkBgNVBAkMHUF2LiBIaWRhbGdvIDc3LCBDb2wuIEd1ZXJyZXJvMQ4wDAYDVQQRDAUwNjMwMDELMAkGA1UEBhMCTVgxGTAXBgNVBAgMEERpc3RyaXRvIEZlZGVyYWwxEjAQBgNVBAcMCUNveW9hY8OhbjEVMBMGA1UELRMMU0FUOTcwNzAxTk4zMTIwMAYJKoZIhvcNAQkCDCNSZXNwb25zYWJsZTogSMOpY3RvciBPcm5lbGFzIEFyY2lnYTAeFw0xMDA3MzAxNjU4NDRaFw0xMjA3MjkxNjU4NDRaMIGWMRIwEAYDVQQDDAlNYXRyaXogU0ExEjAQBgNVBCkMCU1hdHJpeiBTQTESMBAGA1UECgwJTWF0cml6IFNBMSUwIwYDVQQtExxBQUEwMTAxMDFBQUEgLyBBQUFBMDEwMTAxQUFBMR4wHAYDVQQFExUgLyBBQUFBMDEwMTAxSERGUlhYMDExETAPBgNVBAsMCFVuaWRhZCA2MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDy2Ukb2/n7DNA4uD81rWC4gvFK3l8FSYkcbSpiJluEFgEWKZwTxX++fot3BcE2mb1U+eoom5nua9PwaXEG7Xd8QsbWbJy41N97qr6TXswAG6BprMzleX4Jx7IAWOWHy6bT3sukWUTeazMEWwFx0YJP9lW518J9HZff5Wy3OXHTgQIDAQABo4HqMIHnMAwGA1UdEwEB/wQCMAAwCwYDVR0PBAQDAgbAMB0GA1UdDgQWBBSsOuAyvEFZHt+J3qB77jRF7c81bzAuBgNVHR8EJzAlMCOgIaAfhh1odHRwOi8vcGtpLnNhdC5nb2IubXgvc2F0LmNybDAzBggrBgEFBQcBAQQnMCUwIwYIKwYBBQUHMAGGF2h0dHA6Ly9vY3NwLnNhdC5nb2IubXgvMB8GA1UdIwQYMBaAFOtZfQQimlONnnEaoFiWKfU54KDFMBAGA1UdIAQJMAcwBQYDKgMEMBMGA1UdJQQMMAoGCCsGAQUFBwMCMA0GCSqGSIb3DQEBBQUAA4IBAQCFiWG7tluLDmTLC3EmPPWaMuR4u6pugXet9VZGG5QQefU8CTA5+0NpHTJSXqDYdzGRo4tMPCO9BM+955/L0s+6/G2QKYvj7cSF8gWAAllOV65x9k5bRhyBJfFcqvXDcvPGLlM/WyJQ8FK3LGH6mT/XEHOEBPTl1TAxt/T8xYL0/PJEPyxIuaF3Vdp357XxvyQGScsnXWoL32oafQES5w8fEn47ybNoeCuNb0jCb/y3FHJpI9hbzGmOXXk6MXk3Udk+qk9Ix5ETb/LYm6IcGzA7WoGschOUOVdLoJryfuO4XldNFi+MaXxzocbiU9PpQ6gX3WnENxRFNJ9XKSYo6V3p" sello="m7A/spolgLfRoWe//+yHdUmtRb6sD7XfJdwfIG5axM1+iQ2PXIwj1quZ/RrTcnmmuqQ6ihX4M4QIT+hStPpCcXRs26dDF86mSPY0v7kXMtmc4VQmU96jK3lqbIpOm6PlCMieuxWIN6pZbVfgjNI8WWJK40uXUmR/TMotI3EYOao=">
<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"></DomicilioFiscal>
<ExpedidoEn calle="Pino Suarez" codigoPostal="95460" colonia="Centro" estado="Nuevo Léon" localidad="Monterrey" municipio="Monterrey" noExterior="23" pais="México"></ExpedidoEn>
</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"></Domicilio>
</Receptor>
<Conceptos>
<Concepto cantidad="10" descripcion="Vasos decorados" importe="200" unidad="Caja" valorUnitario="20.00"></Concepto>
<Concepto cantidad="1" descripcion="Charola metálica" importe="150" unidad="pieza" valorUnitario="150.00"></Concepto>
</Conceptos>
<Impuestos>
<Traslados>
<Traslado impuesto="IVA" tasa="15.00" importe="52.50"></Traslado>
</Traslados>
</Impuestos>
</Comprobante>
- Entren al validador y les debe de funcionar.