Facturación Electrónica
Bueno, me tope con el lío de poder realizar la facturación electrónica segun las reglas del SAT, algo que en realidad hay muy poca información para java, casi todos utilizan php con sus mods para ssl. Pero bueno, independientemente de como lo utilize cada quien, este es el procedimiento general a seguir. Si alguien me corrige, o tiene mejoras o dudas, no duden en publicarlas.
Para poder realizar la facturacion electronica, es necesario primero que el patron se de de alta en el SAT, donde despues de seguir un proceso engorroso (queda fuera del alcance de este blog) el SAT entrega una llave privada para firmar y un certificado, ambos archivos estan cifrados con una contraseña.
Una vez teniendo esos archivos, ya se puede generar facturas electrónicas a los clientes. Como en papel, una factura electrónica lleva muchos datos, como nombre del cliente, del vendedor, productos, costos, etc. La facturación electrónica comienza con la creación de una cadena informativa o mensaje,que contiene los datos de la factura, esta cadena se debe generar en base a la documentación establecida en el Anexo 20. Una vez teniendo el mensaje, debemos codificarlo a utf-8 y aplicarle una función hash o de digestion, esa función es la MD5. Enseguida firmarlo con la llave privada que nos entregó el SAT. Al resultado lo convertimos a base64 y listo. Ya generamos nuestra cadena de facturación electrónica.
Ahora a grandes rasgos en java se implementa algo así:
String clave = "pancho"; //esta es la clave de la llave privada
//este metodo lee el archivo de llave privada y regresa los bytes del mismo. Aqui no hay nada raro, es una simple lectura completa del archivo
byte[] llavePrivadaBytes = leerArchivo(llavePrivadaArchivo);
//ahora obtenemos la llave privada. Aqui es donde esta lo truculento. La api de sun esta bien para leer un archivo de llave privada, sin embargo
//si la llave privada tiene password, hay que hacer algun otro proceso que sinceramente no entendí ni supe como hacerlo, por lo tanto busque
//otras alternativas y me encontre con esta clase, que se encuentra en el paquete commons-ssl.jar de apache <a href="http://juliusdavies.ca/commons-ssl/
//a" title="http://juliusdavies.ca/commons-ssl/
//a">http://juliusdavies.ca/commons-ssl/
//a</a> la cual se le pasan los bytes leidos del archivo de la llave privada y un array de chars del password. Esta clase además nos evita tener que saber
//cual formato se utilizo para la llave privada ya que lo detecta automático. (solo por saber el formato que utiliza el sat para sus llaves es el DER )
PKCS8Key pkcs8 = new PKCS8Key(privateKeyBytes, clave.toCharArray());
//obtenemos la llave privada
PrivateKey privateKey = pkcs8.getPrivateKey();
//creamos un firmador con el algortimo RSA, que es el que utiliza el SAT. Aqui estamos matando dos pajaros de un tiro, ya que como lo indica
//el SAT, debemos obtener el hash del mensaje, pero el firmador que estamos obteniendo lo hace por nosotros, si no quisieramos que aplicara
//la funcion hash antes, solo dejamos "RSA"
Signature rsa = Signature.getInstance("MD5withRSA", "SunRsaSign");
//le indicamos la llave privada a utilizar
rsa.initSign(privateKey);
//le indicamos el mensaje a firmar
rsa.update(mensaje);
//obtenemos la firma digital
byte[] firmaDigital = rsa.sign();
//convertimos la salida de firma digital a base64. Aqui hay varias clases para hacer esta chamba, esta la BASE64Encoder de sun o la de apache
String resultado = new String(encodeBase64(firmaDigital));
//listo, esta es la cadena de la facturacion electronica
System.out.println("FacElect: " + resultado);
Esta es la clase que utilizo para la codificacion base 64
//www.source-code.biz, <a href="http://www.inventec.ch/chdh
//
//This" title="www.inventec.ch/chdh
//
//This">www.inventec.ch/chdh
//
//This</a> module is multi-licensed and may be used under the terms
//of any of the following licenses:
//
//EPL, Eclipse Public License, <a href="http://www.eclipse.org/legal
//LGPL" title="http://www.eclipse.org/legal
//LGPL">http://www.eclipse.org/legal
//LGPL</a>, GNU Lesser General Public License, <a href="http://www.gnu.org/licenses/lgpl.html
//AL" title="http://www.gnu.org/licenses/lgpl.html
//AL">http://www.gnu.org/licenses/lgpl.html
//AL</a>, Apache License, <a href="http://www.apache.org/licenses
//BSD" title="http://www.apache.org/licenses
//BSD">http://www.apache.org/licenses
//BSD</a>, BSD License, <a href="http://www.opensource.org/licenses/bsd-license.php
//
//Please" title="http://www.opensource.org/licenses/bsd-license.php
//
//Please">http://www.opensource.org/licenses/bsd-license.php
//
//Please</a> contact the author if you need another license.
//This module is provided "as is", without warranties of any kind.
package org.javamexico;
/**
* A Base64 Encoder/Decoder.
*
* <p>
* This class is used to encode and decode data in Base64 format as described in
* RFC 1521.
*
* <p>
* Home page: <a href="http://www.source-code.biz">www.source-code.biz</a><br>
* Author: Christian d'Heureuse, Inventec Informatik AG, Zurich, Switzerland<br>
* Multi-licensed: EPL/LGPL/AL/BSD.
*
* <p>
* Version history:<br>
* 2003-07-22 Christian d'Heureuse (chdh): Module created.<br>
* 2005-08-11 chdh: Lincense changed from GPL to LGPL.<br>
* 2006-11-21 chdh:<br>
* Method encode(String) renamed to encodeString(String).<br>
* Method decode(String) renamed to decodeString(String).<br>
* New method encode(byte[],int) added.<br>
* New method decode(String) added.<br>
* 2009-07-16: Additional licenses (EPL/AL) added.<br>
* 2009-09-16: Additional license (BSD) added.<br>
* 2009-09-16: Additional license (BSD) added.<br>
* 2010-01-27: Package name added.<br>
*/
public class Base64Coder {
// Mapping table from 6-bit nibbles to Base64 characters.
private static char[] map1 = new char[64];
static {
int i = 0;
for (char c = 'A'; c <= 'Z'; c++)
map1[i++] = c;
for (char c = 'a'; c <= 'z'; c++)
map1[i++] = c;
for (char c = '0'; c <= '9'; c++)
map1[i++] = c;
map1[i++] = '+';
map1[i++] = '/';
}
// Mapping table from Base64 characters to 6-bit nibbles.
private static byte[] map2 = new byte[128];
static {
for (int i = 0; i < map2.length; i++)
map2[i] = -1;
for (int i = 0; i < 64; i++)
map2[map1[i]] = (byte) i;
}
/**
* Encodes a string into Base64 format. No blanks or line breaks are
* inserted.
*
* @param s
* a String to be encoded.
* @return A String with the Base64 encoded data.
*/
public static String encodeString(String s) {
return new String(encode(s.getBytes()));
}
/**
* Encodes a byte array into Base64 format. No blanks or line breaks are
* inserted.
*
* @param in
* an array containing the data bytes to be encoded.
* @return A character array with the Base64 encoded data.
*/
public static char[] encode(byte[] in) {
return encode(in, in.length);
}
/**
* Encodes a byte array into Base64 format. No blanks or line breaks are
* inserted.
*
* @param in
* an array containing the data bytes to be encoded.
* @param iLen
* number of bytes to process in <code>in</code>.
* @return A character array with the Base64 encoded data.
*/
public static char[] encode(byte[] in, int iLen) {
int oDataLen = (iLen * 4 + 2) / 3; // output length without padding
int oLen = ((iLen + 2) / 3) * 4; // output length including padding
char[] out = new char[oLen];
int ip = 0;
int op = 0;
while (ip < iLen) {
int i0 = in[ip++] & 0xff;
int i1 = ip < iLen ? in[ip++] & 0xff : 0;
int i2 = ip < iLen ? in[ip++] & 0xff : 0;
int o0 = i0 >>> 2;
int o1 = ((i0 & 3) << 4) | (i1 >>> 4);
int o2 = ((i1 & 0xf) << 2) | (i2 >>> 6);
int o3 = i2 & 0x3F;
out[op++] = map1[o0];
out[op++] = map1[o1];
out[op] = op < oDataLen ? map1[o2] : '=';
op++;
out[op] = op < oDataLen ? map1[o3] : '=';
op++;
}
return out;
}
/**
* Decodes a string from Base64 format.
*
* @param s
* a Base64 String to be decoded.
* @return A String containing the decoded data.
* @throws IllegalArgumentException
* if the input is not valid Base64 encoded data.
*/
public static String decodeString(String s) {
return new String(decode(s));
}
/**
* Decodes a byte array from Base64 format.
*
* @param s
* a Base64 String to be decoded.
* @return An array containing the decoded data bytes.
* @throws IllegalArgumentException
* if the input is not valid Base64 encoded data.
*/
public static byte[] decode(String s) {
return decode(s.toCharArray());
}
/**
* Decodes a byte array from Base64 format. No blanks or line breaks are
* allowed within the Base64 encoded data.
*
* @param in
* a character array containing the Base64 encoded data.
* @return An array containing the decoded data bytes.
* @throws IllegalArgumentException
* if the input is not valid Base64 encoded data.
*/
public static byte[] decode(char[] in) {
int iLen = in.length;
if (iLen % 4 != 0)
throw new IllegalArgumentException(
"Length of Base64 encoded input string is not a multiple of 4.");
while (iLen > 0 && in[iLen - 1] == '=')
iLen--;
int oLen = (iLen * 3) / 4;
byte[] out = new byte[oLen];
int ip = 0;
int op = 0;
while (ip < iLen) {
int i0 = in[ip++];
int i1 = in[ip++];
int i2 = ip < iLen ? in[ip++] : 'A';
int i3 = ip < iLen ? in[ip++] : 'A';
if (i0 > 127 || i1 > 127 || i2 > 127 || i3 > 127)
throw new IllegalArgumentException(
"Illegal character in Base64 encoded data.");
int b0 = map2[i0];
int b1 = map2[i1];
int b2 = map2[i2];
int b3 = map2[i3];
if (b0 < 0 || b1 < 0 || b2 < 0 || b3 < 0)
throw new IllegalArgumentException(
"Illegal character in Base64 encoded data.");
int o0 = (b0 << 2) | (b1 >>> 4);
int o1 = ((b1 & 0xf) << 4) | (b2 >>> 2);
int o2 = ((b2 & 3) << 6) | b3;
out[op++] = (byte) o0;
if (op < oLen)
out[op++] = (byte) o1;
if (op < oLen)
out[op++] = (byte) o2;
}
return out;
}
// Dummy constructor.
private Base64Coder() {
}
} // end class Base64Coder
Saludos
- Nopalin's blog
- Inicie sesión o regístrese para enviar comentarios
Comentarios
Base64
Ya tenemos generics, thread pools, retornos covalentes en los métodos y próximamente hasta closures... pero no hay un codificador de base64 en las clases estándar de Java. Odio tener que copiar el mismo código para codificar a base64 en cada proyecto que lo necesito.
Por lo demás se ve bien; ya te validaron que la firma está OK? yo hice una vez un sistema para pago de impuestos y el SAT no me validaba las firmas que hice con las clases estándar, porque resulta que el padding para el MD5 tenía que ser 1, puros ceros, 1 y luego el MD5 (eso para encriptarlo con la llave privada); por lo que tuve que utilizar una librería externa, Cryptix en aquel entonces que todavía era Java 1.3 o 1.4, y sacar el MD5, luego ponerle el padding, encriptarlo con la llave privada (un paso adicional pero por ese paso, tuve que utilizar varias clases internas y fue un rollo).
Base64: commons.codec
Usa la clase Base64 de commons-codec.
(Para comodidad extra, ponle el IvyDE plugin a tu Eclipse para que te descarge el .jar automaticamente de ibiblo (o de tu repositorio Ivy privado) )
clase base64
Gracias por el aporte lux, voy a checarlo luego.
y ezamudio, aunque no es opensource, la jre si incluye una clase de codificacion base64, se llama BASE64Encoder, pero esta en el package de sun.misc y por lo tanto es privada, ademas de que antes de enterarme que existia encontre la que puse aqui, y pus es realmente pequeña y funciona, asi que ps me da lo mismo.
sobres
Validador de Facturas Electrónicas
Si quieren validar las facturas electrónicas pueden entrar al sitio:
http://validacfd.com.mx
Base64Encoder sun.misc, privado, open source?
Nopalin, no entendi muy bien tu post, mezclaste muchos conceptos. Qué cosa no es open source? la JRE o la clase que mencionas? y qué importa si es open source o no, si viene en las clases estándar de Java? El problema es que como dices, es una clase privada. Se recomienda no usar clases privadas porque las pueden quitar o modificar sin avisarle a nadie y si tu aplicación depende de una de esas clases, corres el riesgo de que en la siguiente versión de Java ya no venga el método como lo estás invocando (o la clase misma haya cambiado de nombre, etc) y entonces tu aplicación de repente ya no funciona cuando cambian la versión de Java.
como generan el xml?
hola a todos soy nuevo en el foro, el contenido esta muy interesante, en cuanto a la facturación electronica en java tengo una duda, como generean el archivo en xml?, se basan en un xslt? agradeceria mucho me pudieran aportar información sobre el tema.
Validador
La pagina www.validacfd.com.mx ya no esta funcionando como validador.
Pero hay otra opcion, www.validacfd.com (sin el .mx) es otro tipo de validador, es una aplicacion de escritorio. Tambien ahi mismo hay un foro dedicado exclusivamente a factura electronica
Codificar en base 64
Se puede usar directamente de java usando sun.misc.BASE64Encoder
String firmab64CAECode = new BASE64Encoder().encode( toHexString(firma).getBytes());
tuve que editar esta respuesta y bueno no lei todas las respuestas y ya estaba contestado, de todas formas lo dejo por si algo funciona para alguien (procurare leer todo antes de arrebatarme a contestar y para variar una entrada de hace meses)
Librería de Código Abierto
http://code.google.com/p/factura-electronica/ es una librería de código abierto (open source) escrita en Java, para el desarrollo de aplicaciones de Factura Electrónica (Comprobantes Fiscales Digitales por Internet), de acuerdo a los nuevos lineamientos publicados por el Servicio de Administración Tributaria en septiembre de 2010.
La librería tiene capacidades para generar el XML, sellarlo, verificar el sello, realizar el timbrado y verificar el timbre.
La librería se distribuye bajo la Apache Licence 2.0, por lo que puede ser usada libremente en aplicaciones comerciales .
Problema con el sello
Que tal hago exactamente lo que aparece en el codigo de arriba, pero al momento de validar mi selo en la pagina del sat me sale que el sello no es valido, y no me explico por que, por otro lado tomo la cadena original que el sat me da en ese validador y es igual a la que yo genero, asi es que no se que me puede estar fallando, alguna idea? el tipo de ecriptacion que uso es Sha1withRSA
Número de certificado
Alguien sabe como o de donde obtengo los datos: número / año de aprobación y Número de certificado
Numero de certificado
Yo tambien andaba buscando esos datos y parece ser que el SAT al tramitar el certificado de sello te da un acuse donde vienen esos datos por cada certificado emitido.
Sitio Open Source de Facturación Electronica
Hola.
La referencia de BigData sobre http://code.google.com/p/factura-electronica/ se me hizo bastante interesante, actualmente tengo algunos meses dando el brinco de Java a Groovy y Grails, y soy el propietario de http://www.factware.com.mx, el sitio aun no ofrece CDF pero gracias a las aportaciones de BigData es relativamente muy sencillo implementar el CDF, lo que estoy buscando es socios administradores y/o desarrolladores para llevar el factware.com.mx a ser una aplicación web en Grails con CDF y seguramente implementando las librerias de BigData y desde luego dejarla con dos esquemas:
Uno el del open source comunity (La versión para la comunidad que quiza sea el mas importante)
y dos el proveer el servicio como ASP (Aplication Service Provider) o SaaS (Software as a service).
Si alguine tiene ideas o esta interesado en colaborar , participar por favor contactenme.
Saludos.
saludos
Lo hice pero no me funcionò, pueden ayudarme con esto por favor, les agrdezco mucho .
Si no es mucha molestia pueden enviarmelo a mi correo. sofia_torres32@hotmail.com.
saludos
no por mail
Por favor si alguien le contesta a esta persona, no lo haga por mail. Pongan la respuesta aquí, porque esto es un foro público donde se hizo una pregunta y al poner aquí mismo la respuesta, queda para la posteridad, si alguien más tiene la misma duda podrá leer toda la discusión y ver la respuesta.
Si le envían la respuesta por mail se pierde esa información.
Listado de elementos
Hola.
Disculpen estoy tratando de entender paso a paso cada una de las partes de la facturacion electronica:
Aparte de la cadena que mas lleva.
Tengo que empezar a realizar un software de propueste no terminado claro y necesito saber que y que presentar al menos en mi interfaz.
Muchas gracias,
AYUDA
hola, mira necesito saber q aplicaciones se estan ejecutando en windows, quiero listarlas como hago, por fa ayudenm
Necesitas asesoria fiscal antes de la técnica
01800-INFOSAT ellos saben bien que debe llevar... La factura electronica no lleva cadena original (eso lo lleva la representacion impresa de la factura original)
CFD o CFDI solo es el XML
sobre los CFD y CFDI
Tengo entendido que las CFDI solo pueden ser generadas por los proveedores PAC certificados de Facturacion electronica
Ustedes la estan generando por cuenta propia?
Saludos
Tengo entendido que las PAC
Tengo entendido que las PAC son las unicas obligadas a emitir CFDI con timbrado pero en un momento será obligatorio para los que emiten por medios propios o por un tercero autorizado... ahorita solo pueden emitir CFD 2.0 quienes facturen por medios propios
ayuda
hola, tengo un problema, realice el programa como lo explican en el código de arriba, pero al momento de que se ejecuta esta instrucción:
PKCS8Key pkcs8 = new PKCS8Key(privateKeyBytes, clave.toCharArray());
me manda un error de padding, si alguien pudiera ayudarme se lo agradecería mucho..Sobre los PAC y CFDI
Para AlexSSL:
En efecto, los PACS pueden emitir CFDI's y timbrarlos, pero eso solo puede limitarte con el timbrado, esto es, que puedes trabajar con los PAC en mas de una manera:
1.- No tienes software propio de facturacion, pides que ellos te hagan todo: formularios de captura (via web), xml, sello, timbrado, generacion de PDF y almacenamiento, envio de emails.
2.- Tienes tu propio software y generas las interfaces que ellos te pidan para que te realicen sello y XML, pudiendo ellos almacenar el XML y enviando ellos o tu el email (via webservice te hacen el servicio de timbrado y sellado)
3.- Tienes tu propio software, generas tu el XML, sellas tu (con tus CSD sin necesidad de entregarselos) la cadena original, luego les pudes que ellos TIMBREN, te regresan el XML ya timbrado (solo le agregan los nodos con el timbrado), almacenas tu el XML, generas tu el PDF y envias tu por email al cliente. Por supuesto, en este caso, pagas por cada timbre.
Aunque los PAC tienen obligacion de prestar un servicio gratuito, regularmente ese servicio es limitado, incluso debes capturar en sus formularios de captura cada factura, pero si contratas el servicio por rango de timbres o algo asi puedes seguir usando tu sistema propio.
Sobre "Ustedes la estan generando por cuenta propia?"
En mi caso, mi aplicacion desarrollada con .NET la usaba para generar CFD's y ahora la he modificado para generar CFDI's, pero contratando el servicio de timbrado con un PAC.
Saludos
"jasistemas@hotmail.com"
TENGO UN PROBLEMA AL MOMENTO DE VALIDAR MI XML
Saludos a todos espero puedan ayudarme estoy haciendo pruebas de para generar el XML
que pide el SAT para cfdi. mi problema es que al validar en el validador del sat me pone el sig. resultado:
Validando encoding
Comprobante expresado en UTF-8
Cadena original:
||3.0|2012-01-19T19:16:50|ingreso|Pago en una sola exibicion|81.03|94.0|LOVF471120SBA|NUEVA WALMART DE MEXICO S.A. DE C.V.|NEXTENGO No. 78|35|135|COLONIA|LOCALIDAD|SANTA ANA, CHIAUTEMPAN|MEXICO D.F.|MEXICO|02770|AVE. ANTONIO DIAZ VARELA|35|135|COLONIA|COL. CENTRO|SANTA ANA, CHIAUTEMPAN|TLAXCALA|MEXICO|90800|PEMA470726988|PEREZ MORALES ANGEL|PRIMERA SECCION|13|0|SANTA MARIA ACULTLAPILCO|SANTA MARIA ACULTLAPILCO|u|TLAXCALA|MEXICO|90110|1.0|BULTO|MPCAL0109|CAL PORTER 25 KG|30.17|30.17|2.0|BULTO|MPCAL108-2|CAL APASCO 25 KG.|21.12|42.24|0.5|BULTO|MPCAL0108|CAL CALIDRA 25 KG|17.24|8.62|IVA|16|4.83|IVA|16|6.76|IVA|16|1.38||
Digestión SHA-1 de cadena como HEX:
8620fa755f3458db3a97e7ec0c69ba552cab8727
Realizando validación del sello con un certificado externo
El sello no pudo ser verificado
==La verdad espero que me ayuden no se en donde esta el error si al generar la cadena o es otra cosa
use el archivo: aaa010101aaa_csd_05.cer
use el archivo: aaa010101aaa_csd_05.key
qeue proporciona el sat para hacer pruebas espero me puedan ayudar.
ESTE ES EL XML DE EJEMPLO
este es el xml de ejemplo. espero les sirva para encontrar el error
<?xml version="1.0" encoding="UTF-8"?>
use estas dos digestiones y me da el mismo error
//Signature firma = Signature.getInstance("SHA1withRSA");
//Signature firma = Signature.getInstance("MD5withRSA");
espero me puedan ayudar.
xml
<#?xml version="1.0" encoding="UTF-8"?>
<#cfdi:Comprobante xmlns:cfdi="http://www.sat.gob.mx/cfd/3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sat.gob.mx/cfd/3 cfdv3.xsd" version="3.0" fecha="2012-01-19T19:16:50" sello="pc0Daem8mZoTIO5Y9fX7ARHH2PzpRb6vUQ/wYTIs7WM4pmxo5q3fkMBOqHkvP2ZSgFrWBaRxspk2
U+tn7eWrPANhdjuHVEr4nh0d07AdzPN4I93LagOD9wPFMh2T24cOzbOo3sRGgbcoxofgx3GOq0IZ
QD65NT6jznM1g9HfnzU=" formaDePago="Pago en una sola exibicion" noCertificado="30001000000100000804" certificado="MIIE/TCCA+WgAwIBAgIUMzAwMDEwMDAwMDAxMDAwMDA4MDQwDQYJKoZIhvcNAQEFBQAwggFvMRgw
FgYDVQQDDA9BLkMuIGRlIHBydWViYXMxLzAtBgNVBAoMJlNlcnZpY2lvIGRlIEFkbWluaXN0cmFj
acOzbiBUcmlidXRhcmlhMTgwNgYDVQQLDC9BZG1pbmlzdHJhY2nDs24gZGUgU2VndXJpZGFkIGRl
IGxhIEluZm9ybWFjacOzbjEpMCcGCSqGSIb3DQEJARYaYXNpc25ldEBwcnVlYmFzLnNhdC5nb2Iu
bXgxJjAkBgNVBAkMHUF2LiBIaWRhbGdvIDc3LCBDb2wuIEd1ZXJyZXJvMQ4wDAYDVQQRDAUwNjMw
MDELMAkGA1UEBhMCTVgxGTAXBgNVBAgMEERpc3RyaXRvIEZlZGVyYWwxEjAQBgNVBAcMCUNveW9h
Y8OhbjEVMBMGA1UELRMMU0FUOTcwNzAxTk4zMTIwMAYJKoZIhvcNAQkCDCNSZXNwb25zYWJsZTog
SMOpY3RvciBPcm5lbGFzIEFyY2lnYTAeFw0xMDA3MzAxNjU4NDNaFw0xMjA3MjkxNjU4NDNaMIGW
MRIwEAYDVQQDDAlNYXRyaXogU0ExEjAQBgNVBCkMCU1hdHJpeiBTQTESMBAGA1UECgwJTWF0cml6
IFNBMSUwIwYDVQQtExxBQUEwMTAxMDFBQUEgLyBBQUFBMDEwMTAxQUFBMR4wHAYDVQQFExUgLyBB
QUFBMDEwMTAxSERGUlhYMDExETAPBgNVBAsMCFVuaWRhZCA1MIGfMA0GCSqGSIb3DQEBAQUAA4GN
ADCBiQKBgQDUSF/1rQXloxD7ng3QDlR8lL46nWGHOQQlh/OIUTldon+Fe47GvTwjE0aiyUeRuXMV
kU/aSwSWixlzlprhkMx5Sds0LYSX+TXv5ag2q7Iz" subTotal="81.03" total="94.0" tipoDeComprobante="ingreso" metodoDePago="EFECTIVO"#>
<#cfdi:Emisor rfc="LOVF471120SBA" nombre="NUEVA WALMART DE MEXICO S.A. DE C.V."#>
<#cfdi:DomicilioFiscal calle="NEXTENGO No. 78" noExterior="35" noInterior="135" colonia="COLONIA" localidad="LOCALIDAD" municipio="SANTA ANA, CHIAUTEMPAN" estado="MEXICO D.F." pais="MEXICO" codigoPostal="02770" /#>
<#cfdi:ExpedidoEn calle="AVE. ANTONIO DIAZ VARELA" noExterior="35" noInterior="135" colonia="COLONIA" localidad="COL. CENTRO" municipio="SANTA ANA, CHIAUTEMPAN" estado="TLAXCALA" pais="MEXICO" codigoPostal="90800" /#>
<#/cfdi:Emisor#>
<#cfdi:Receptor rfc="PEMA470726988" nombre="PEREZ MORALES ANGEL"#>
<#/cfdi:Receptor#>
<#cfdi:Conceptos#>
<#cfdi:Concepto cantidad="1.0" unidad="BULTO" noIdentificacion="MPCAL0109" descripcion="CAL PORTER 25 KG" valorUnitario="30.17" importe="30.17" /#>
<#cfdi:Concepto cantidad="2.0" unidad="BULTO" noIdentificacion="MPCAL108-2" descripcion="CAL APASCO 25 KG." valorUnitario="21.12" importe="42.24" /#>
<#cfdi:Concepto cantidad="0.5" unidad="BULTO" noIdentificacion="MPCAL0108" descripcion="CAL CALIDRA 25 KG" valorUnitario="17.24" importe="8.62" /#>
<#/cfdi:Conceptos#>
<#cfdi:Impuestos#>
<#cfdi:Traslados#>
<#cfdi:Traslado tasa="16" importe="4.83" impuesto="IVA" /#>
<#cfdi:Traslado tasa="16" importe="6.76" impuesto="IVA" /#>
<#cfdi:Traslado tasa="16" importe="1.38" impuesto="IVA" /#>
<#/cfdi:Traslados#>
<#/cfdi:Impuestos#>
<#cfdi:Addenda /#>
<#/cfdi:Comprobante#>
comentario
le puse # por que no lo aparecia si lo dejaba tal cual solo no consideren los #
Y el certificado
Si no agregas el certificado al xml en base64 dentro de tu CFDI debes indicarle al validador cual es la llave publica del cretificado que usaste en la firma.
¿Lo hiciste?
el certificado
si esta el certificado en el xml solo que como esta muy junto no se nota pero si esta.
esta despues de noCertificado.
gracis por su respuesta
Valida tu certificado
Copia la cadena de tu certificado y pegala en un editor de texto y guardalo con la extension .cer y despues dale doble click. Eso debe abrirte en una ventana la informacion del certificado.
Esto te sirve para verificar si realmente tu certificado es legible o no. Si te marca un error que indique que no se puede abrir el certificado entonces sabrás que algo en tu conversion a base 64 está fallando
verificando certificado
le agradezco por su ayuda voy a relizar la comprobacion y comento como me fue saludos!!!
Implementar Libreria de BigData
Disculpen he intentado utilizar la libreria de BigData pero por mas que he intentado no lo he logrado, alguien podria poner la forma correcta de integrarla a un proyecto en NetBeans o en Eclipse..
Saludos!
Diseñador visual de formatos de impresion de factura electronica
Buenas noches.
Les paso el link de una utileria que permite integrar en nuestras aplicaciones en JAVA un diseñador visual de formatos de impresion de facturas electronicas.
http://facturaxml.blogspot.mx/
saludos
facturacion electronica
Que tal buenas tardes, tengo una duda con lo que estan hablando del sat , si yo tengo mi sistema de caja y el mismo genera las facturas, ahorita ya solo las pac son las autorizadas por el sat para generar facturas electronicas, mi duda es como facilitarle al cliente para que desde el sistema genere la factura electronica con el proveedor que tiene ya que veo q muchas te hacen meterse a su pagina y generarla desde ahi, lo cual seria que el cliente trabaje doble.
Veo que algunas pacs te venden licencia de distribuidor, eso ayuda?
Tengo una situación similar
Tengo una situación similar con un cliente, acá lo que haremos será desarrollarle a su propio sistema la facultad de expedir factura electrónica pero hablando solamente de que genere el XML que se le entrega al PAC para timbrarlo, una vez timbrado se regresa al cliente junto con el pdf impreso...

El PAC está obligado a entregarte todos los medios necesarios para que puedas realizar la facturación electrónica, si no tuvieras sistema que genere la factura el te proporciona una herramienta para hacerlo, si ya tuvieras un sistema que hace la factura, el te proporciona un WEBSERVICE al cual deberás enviar el XML que genere tu aplicación para timbrarlo y regresartelo... si tu aplicación no genera precisamente el XML deberás lograr eso o en su defecto el PAC tambien te proporciona un LAYOUT que deberás entregarle con la información de la factura para que el pueda generarlo, en varios casos ese Layout viene siendo el mismo XML.
El PAC esta OBLIGADO a asesorarte y a brindarte toda la información que requieras para lograr el CFDI.
Te dejo la liga a mi entrada publicada referente a esto también AQUI
Ojalá te sirva saludos!!
Resp
Gracias nomarlegnar !! has aclarado mi duda! ya entendi el procedimiento, de hecho mi sistema genera el xml solo sera ver el mejor pac para q le convenga al cliente ! saludos
Ayuda
Hola comunidad, esperando se encuentren excelente, me gustaría si me pueden ayudar con una duda que tengo.
Para empezar, actualmente me encuentro realizando mis residencias profesionales o el equivalente a prácticas profesionales para poder titularme en Ing. en Sistemas. Ahora bien, la empresa en la que realizo dichas prácticas, me ha solicitado que realice una aplicación que se encargue de generar CFDI´s para que estos sean enviados a un PAC y los timbre y me retorne lo que me tenga que retornar. Es por ello que, mi duda es la siguiente.
El código proporcionado inicialmente en este foro me puede servir para dicha tarea?. Si es correcto, podrían proporcionar todo el code source para analizarlo y buscar la manera de implementarlo en mi proyecto?. De antemano agradezco las atenciones prestadas...
Rafael Arceo.
Re: ayuda
Hola, Rafael. Puedes descargar el código de
https://github.com/bigdata-mx/factura-electronica
. ¡Saludos!