Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
aperezc48 opened this issue Jun 5, 2017 · 31 comments
Open

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

aperezc48 opened this issue Jun 5, 2017 · 31 comments

Comments

@aperezc48
Copy link

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
Copy link

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
Copy link

SAAVER commented Jun 7, 2017

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
Copy link
Collaborator

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
Copy link
Author

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
Copy link
Collaborator

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
Copy link
Collaborator

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
Copy link
Collaborator

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
Copy link
Author

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
Copy link
Collaborator

camarillo commented Jun 8, 2017

@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
Copy link
Collaborator

@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
Copy link
Collaborator

@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
Copy link
Collaborator

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
Copy link
Collaborator

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

@jjjimenez
Copy link

jjjimenez commented Jun 9, 2017 via email

@camarillo
Copy link
Collaborator

@hortegag91 este es mi correo [email protected]

@danielfigueroaj
Copy link

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
Copy link

@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
Copy link
Author

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

Saludos.!

cadenaoriginal_3_3.docx

@danielfigueroaj
Copy link

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

@danielfigueroaj
Copy link

@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
Copy link
Collaborator

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

@danielfigueroaj
Copy link

@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
Copy link
Collaborator

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

@bennsandoval
Copy link

@hortegag91 yo también estoy en busca de un PAC [email protected]

@danielfigueroaj
Copy link

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

@MariaDev12
Copy link

@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
Copy link

@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
Copy link

Tengo el mismo problema alguien ya pudo solucionarlo ?

@MariaDev12
Copy link

@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
Copy link

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
Copy link
Collaborator

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests