Ver Mensaje Individual
  #351 (permalink)  
Antiguo 06/04/2011, 10:49
prueba230683
 
Fecha de Ingreso: abril-2011
Mensajes: 170
Antigüedad: 13 años
Puntos: 68
Sonrisa Respuesta: Factura electroncia sat mexico

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:
  1. Abro MS-DOS
  2. 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-----
    
  3. 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-----
    
  4. 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
  5. 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>
    
  6. Entren al validador y les debe de funcionar.