bigdata-mx / factura-electronica

Librería de componentes Java para el desarrollo de aplicaciones de Factura Electrónica (CFDI)
Apache License 2.0
94 stars 107 forks source link

Error con el Sello: CFD33102 versión 3.3 #167

Open aperezc48 opened 7 years ago

aperezc48 commented 7 years ago

Tengo un problema al generar el sello, me marca lo siguiente: CFD33102. El resultado de la digestión debe ser igual al resultado de la desencripcion del sello.

Tengo entendido que el algoritmo de generación del sello cambio de SHA1 a SHA256, para lo cual genere una clase CFDv33 que es prácticamente una copia de la clase CFDv32 y la creación del sello la tengo de la siguiente manera:

public void sellar(PrivateKey key, X509Certificate cert) throws Exception { cert.checkValidity(); String signature = getSignature(key); document.setSello(signature); byte[] bytes = cert.getEncoded(); Base64 b64 = new Base64(-1); String certStr = b64.encodeToString(bytes); document.setCertificado(certStr); BigInteger bi = cert.getSerialNumber(); document.setNoCertificado(new String(bi.toByteArray()));
}

String getSignature(PrivateKey key) throws Exception {
    byte[] bytes = getOriginalBytes();
    Signature sig = Signature.getInstance("SHA256withRSA");
    sig.initSign((PrivateKey)key);
    sig.update(bytes);
    byte[] signed = sig.sign();
    Base64 b64 = new Base64(-1);
    return b64.encodeToString(signed);
}

Y para pasarlo en mi clase desde la librería lo tengo de la siguiente manera:

final Comprobante sellado; try {
// Generacion del PrivateKey para obtener el sello digital. PKCS8Key pkcs8 = new PKCS8Key(getInputStream(fiel), passwordFiel.toCharArray()); byte[] decrypted = pkcs8.getDecryptedBytes();

        PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(decrypted);
        final PrivateKey key = KeyFactory.getInstance("RSA").generatePrivate(spec);

        // Generacion del X509Certificate para obtener el sello digital.
        CertificateFactory cf = CertificateFactory.getInstance("X.509");
        final X509Certificate cert = (X509Certificate) cf.generateCertificate(getInputStream(certificado));

        logger.info("Sella el comprobante.");
        sellado = cfdi.sellarComprobante(key, cert);
        System.out.println("Finaliza el metodo sellar");

    } catch (Exception e) {
        System.out.println("Error: "+e.getMessage());
        return false;
    }

No se donde podría estar el error :( si alguien me podría ayudar.

miguel2309 commented 7 years ago

Tengo el mismo problema, en mi caso es que al generar la cadena original no reconoce los elementos de impuestos por lo cual el sello no coincide con la factura y al timbrar me marca ese error

SAAVER commented 7 years ago

buenas tardes, yo tengo tambien el mismo problema. CFDI33102 : El resultado de la digestión debe ser igual al resultado de la desencripción del sello. Alguna sugerencia?

hortegag91 commented 7 years ago

Ya hay un branch llamado version33 en donde se encuentran los cambios de la siguiente versión. por lo que comenta @aperezc48 no estan usando este branch, les pido me confirme si lo usan o no, y si usandolo se corrigió su problema

aperezc48 commented 7 years ago

Buen día, yo lo pude solucionar de la siguiente manera:

Valide con mi PAC que me proporcionaran la cadenaoriginal_3_3.xslt que ellos están usando, ya que al parecer la que esta en la página del SAT no es del todo correcto.

Después sustituí el método getSignature(PrivateKey key) por el siguiente método que agregue:

public String getSello(PrivateKey key, String strCadenaOriginal) throws Exception { Signature signature = Signature.getInstance("SHA256withRSA"); signature.initSign(key); byte[] bytesCadenaOriginal = strCadenaOriginal.getBytes("UTF-8"); signature.update(bytesCadenaOriginal); byte[] bytesSigned = signature.sign(); Base64 b64 = new Base64(-1); byte[] bytesEncoded = b64.encodeBase64(bytesSigned); return new String(bytesEncoded); }

A continuación cambie el orden del seteo del sello en el método sellar(PrivateKey key, X509Certificate cert) ya que me di cuenta que en el momento en el que lo creaba con la cadena original no estaba incluyendo el número de certificado, por lo cual la cadena original era incorrecta y se creaba el sello sin tomar en cuenta el número de certificado. Deje el método de la siguiente manera, espero y le sirva a alguien.

public void sellar(PrivateKey key, X509Certificate cert) throws Exception { cert.checkValidity(); byte[] bytes = cert.getEncoded(); Base64 b64 = new Base64(-1); String certStr = b64.encodeToString(bytes); document.setCertificado(certStr); BigInteger bi = cert.getSerialNumber(); document.setNoCertificado(new String(bi.toByteArray())); String signature = getSello(key, getCadenaOriginal()); document.setSello(signature);

}

Saludos!

Disculpa @hortegag91 me podrías explicar eso del branch por favor? No comprendo a que te refiere, si me podrías iluminar por favor

hortegag91 commented 7 years ago

image

Si te fijas, en el código hay una parte donde dice "branch: Master" si le das clic, te despliegfa las diferentes "ramas" que tiene el proyecto en git, una de estas ramas (la única a demás de la master) dice "version33", cuando selecciones est, TODO el código cambiará a esta nueva rama, en donde en teoría ya estan implementados todos los cambios necesarios. Tienes que volver a darle pull. y si usando esto te marca errores, te agradecería los reportes para revisarlos.

camarillo commented 7 years ago

Hola @aperezc48 con que PAC trabajas tu?

Como comenta @hortegag91 con la version33 me funciona bien, solo tramitando unos documentos con mi PAC que segun para la versión 33 son obligatorios que los tenga.

hortegag91 commented 7 years ago

disculpa @camarillo , cuales son estos documentos que comentas? No estoy enterado de ningún tramite nuevo que se deba hacer para la versión 3.3

aperezc48 commented 7 years ago

Hola @camarillo el pac con el que estoy timbrado es FINKOK y a mi no me han pedido tramitar ningún documento en especifico para la versión 3.3

camarillo commented 7 years ago

@hortegag91 @aperezc48 en la pagina de las obligaciones del PAC es tener un contrato por cada emisor (en el ultimo punto) según tengo que realizar ese tramite para poder hacer pruebas de sellado de la versión 3.3.

Puede ser que sea mi PAC el que se esta poniendo especial.

@hortegag91 tu ya realizaste el timbrado con un PAC?

http://www.sat.gob.mx/informacion_fiscal/factura_electronica/Paginas/obligaciones_pac.aspx

hortegag91 commented 7 years ago

@camarillo , ese es el contrato de adhesión, fue una jugada que quiso hacer el SAT e implementarlo al iniciar el 2017, Básicamente dice que la venta debe hacerse entre el contribuyente y el cliente final, dejando de lado a cualquier intermediario que estuviese. El problema fue que todos los desarrolladores de software se molestaron, y dejaron de actualizar los sistemas (en cuestión de factura electrónica) o subieron exageradamente sus precios (pues ya no iban a tener utilidad de la Factura Electrónica). Debido a esto, el SAT tuvo que poner una prorroga y cuenta la leyenda que primero va a lanzar todos los cambios que se haran (complementos, nuevas versiones, etc...) y una vez que ya no vayan a haber cambios en un buen tiempo, lanzara este contrato para que los desarrolladores no pueda imponer el mismo tipo de presión. Como te comenté, este contrato se derogó, te anexo el comunicado que me hizo llegar mi PAC: http://www.facturarenlinea.com.mx/descargas/ComunicadoSATaplazamientodeaplicacioondeContratotipodeprestaciondeserviciosdecertificacioondeCFDIyserviciosadicionales.pdf

PD: aprovechando la recta, si alguien está teniendo problemas con su PAC, nosotros somo distribuidores y estamos mejorando cualquier precio

hortegag91 commented 7 years ago

@camarillo , si hemos probado el 3.3 pero obviamente solo en ambiente de pruebas (un ambiente proporcionado por el PAC), ya que de manera oficial no se puede timbrar un cfdi v3.3 hasta el primero de Julio

camarillo commented 7 years ago

gracias @hortegag91 si mi pac no me da respuesta por que como bien comentas ya quieren cobrar de manera exagerada, lo cambiare.

Me podras mandar de favor de los planes que manejas?. Yo básicamente utilizo el servicio de timbrado, lo realizo por webservices, envio xml formado, y me regresan el xml completo timbrado. Tengo varios clientes con la misma aplicación.

hortegag91 commented 7 years ago

@camarillo , seguro, si me proporcionas tu correo o tu número telefónico nos ponemos en contacto. Saludos

jjjimenez commented 7 years ago

@Heriberto : El PAC con el que estoy trabajando me ha dado muy buen resultado, pero me gustaria tener una 2da opcion, principalmente en el caso en el que mi PAC tenga algun problema tecnico.


Jaime Joel Jiménez Sánchez

Celular

+52 (55) 2690 6194

Oficina

+52 (55) 1103 0914

+52 (871) 690 3232

On Thursday, June 8, 2017, 10:46:22 AM CDT, Heriberto Ortega Gonzalez notifications@github.com wrote:

@camarillo , ese es el contrato de adhesión, fue una jugada que quiso hacer el SAT e implementarlo al iniciar el 2017, Básicamente dice que la venta debe hacerse entre el contribuyente y el cliente final, dejando de lado a cualquier intermediario que estuviese. El problema fue que todos los desarrolladores de software se molestaron, y dejaron de actualizar los sistemas (en cuestión de factura electrónica) o subieron exageradamente sus precios (pues ya no iban a tener utilidad de la Factura Electrónica). Debido a esto, el SAT tuvo que poner una prorroga y cuenta la leyenda que primero va a lanzar todos los cambios que se haran (complementos, nuevas versiones, etc...) y una vez que ya no vayan a haber cambios en un buen tiempo, lanzara este contrato para que los desarrolladores no pueda imponer el mismo tipo de presión. Como te comenté, este contrato se derogó, te anexo el comunicado que me hizo llegar mi PAC: http://www.facturarenlinea.com.mx/descargas/ComunicadoSATaplazamientodeaplicacioondeContratotipodeprestaciondeserviciosdecertificacioondeCFDIyserviciosadicionales.pdf

PD: aprovechando la recta, si alguien está teniendo problemas con su PAC, nosotros somo distribuidores y estamos mejorando cualquier precio

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub, or mute the thread.

camarillo commented 7 years ago

@hortegag91 este es mi correo camarillo.ivan@gmail.com

danielfigueroaj commented 7 years ago

Creo que no aplicaron éste cambio el branch de la version 33. Hice el chekcout de dicho branch y estoy recibiendo el mismo error

danielfigueroaj commented 7 years ago

@aperezc48 implemente tu fix pero sigo recibiendo el mismo error, podrias compartir tu cadenaoriginal_3_3.xslt para ver que sea la misma que esta en el branch de la version 33 del proyecto?

aperezc48 commented 7 years ago

Que tal @danielfigueroaj esta es la cadena original que yo utilice, espero y te sirva.

Saludos.!

cadenaoriginal_3_3.docx

danielfigueroaj commented 7 years ago

Gracias @aperezc48 voy a probar con tu xml a ver si cambia el resultado

danielfigueroaj commented 7 years ago

@aperezc48 ya logre superar el error del sello, funciono el fix que hiciste y use tambien el xsd de la cadena original que me compartiste. Ahora estoy recibiendo este error:

CFDI33161 Mensaje de incidencia en factura 1: El valor del campo Importe o que corresponde a Traslado no se encuentra entre el limite inferior y superior permitido

Estoy usando el ExampleCFDv33Factory tal cual con los datos que vienen de ejemplo. Alguna idea de que puede estar pasando?

camarillo commented 7 years ago

Debe ser por los importes y/o porcentajes de los impuestos. Cambiaron de 16 a .16 hablando de los porcentajes.

danielfigueroaj commented 7 years ago

@camarillo checa, asi estoy generando los impuestos conceptos

tr.setBase(new BigDecimal("0.16")); tr.setImpuesto("002"); tr.setTipoFactor(CTipoFactor.TASA); tr.setTasaOCuota("0.16000"); tr.setImporte(new BigDecimal("124.00")); trs.getTraslado().add(tr); imp.setTraslados(trs);

Y asi los impuestos traslados

it.setImpuesto("002"); it.setTipoFactor(CTipoFactor.TASA); it.setTasaOCuota("0.16000"); it.setImporte(new BigDecimal("248.00")); its.getTraslado().add(it);

Es tal cual como el CFDv33Factory del branch, tienes algun ejemplo de tus instancias de estos componentes?

camarillo commented 7 years ago

Prueba a que la tasa tenga 6 decimales en lugar de 5.

bennsandoval commented 7 years ago

@hortegag91 yo también estoy en busca de un PAC bennsandoval@gmail.com

danielfigueroaj commented 7 years ago

@BennSandoval donde trabajo usamos Finkok. En otro proyecto de otro cliente he usado ProFact. Con los dos proveedores he trabajado bien.

MariaDev12 commented 7 years ago

@danielfigueroaj ya hice las modificaciones de @aperezc48 pero me sigue marcando el mismo error, incluso le pedi a mi PAC me enviara el xslt de la cadena original y lo reemplace en el proyecto pero me lo siguio formando igual :S

danielfigueroaj commented 7 years ago

@MariaDev12 checa que el replace del metodo getSignature lo hagas en todos lados donde se usa (creo que es en 2 archivos) solo haz una busqueda en todo el proyecto donde se usa dicho metodo. El xslt de la cadena original al final no recuerdo si use tal cual la que viene en el proyecto o si use la que me proporcionaron aqui, pero ésto ultimo segun lo que vi no es problema.

korntotti commented 7 years ago

Tengo el mismo problema alguien ya pudo solucionarlo ?

MariaDev12 commented 7 years ago

@danielfigueroaj de hecho esta el método en varias clases de los comprobantes, pero donde lo modifique fue en la clase CFDv33, incluso implemente el método para mandar sellar el comprobante como lo usa aperezc48; El detalle esta raro, porque cuando genero comprobantes de tipo nomina, si me los timbra el pac, porque el sello si esta bien formado, cuando hago comprobantes de tipo pago tambien los puedo timbrar, pero cuando genero un comprobante con conceptos que tienen impuestos no me los timbra el PAC porque me indica que el sello y por lo tanto la cadena no estan bien formados. No se que mas hacerle :S

IselaPMtz commented 7 years ago

Hola, yo tambien tengo ese error pero en mi caso me di cuenta que cuando tengo agregada la libreria xalan-2.7.2.jar , me muestra el error y cuando la quito de mi proyecto puedo timbrar correctamente con mi PAC, alguna idea por que sera?

hortegag91 commented 6 years ago

Ya está disponible la nueva actualización, hay que importar clases distintas en los proyectos donde lo tengamos impementados, pero no debería representar mayor problema. Les agradeceré lo prueben para que bote lo que esté mal