Software Guru Conference & Expo 2014

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 mensaje = "".getBytes("UTF-8"); //supongamos que aqui va nuestra cadena formada segun Anexo 20
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

//Copyright 2003-2009 Christian d'Heureuse, Inventec Informatik AG, Zurich, Switzerland
//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>
 * &nbsp; Method encode(String) renamed to encodeString(String).<br>
 * &nbsp; Method decode(String) renamed to decodeString(String).<br>
 * &nbsp; New method encode(byte[],int) added.<br>
 * &nbsp; 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

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

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).

Imagen de luxspes

Base64: commons.codec

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.

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) )

Imagen de Nopalin

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

Imagen de ezamudio

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

    byte[] firma = sig.sign();
    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.

Imagen de karl

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

Imagen de ezamudio

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.

Imagen de Lalitros

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..

Imagen de jasistemas

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"

Imagen de july

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.

Imagen de july

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.

Imagen de july

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&#xD;&#xA;U+tn7eWrPANhdjuHVEr4nh0d07AdzPN4I93LagOD9wPFMh2T24cOzbOo3sRGgbcoxofgx3GOq0IZ&#xD;&#xA;QD65NT6jznM1g9HfnzU=" formaDePago="Pago en una sola exibicion" noCertificado="30001000000100000804" certificado="MIIE/TCCA+WgAwIBAgIUMzAwMDEwMDAwMDAxMDAwMDA4MDQwDQYJKoZIhvcNAQEFBQAwggFvMRgw&#xD;&#xA;FgYDVQQDDA9BLkMuIGRlIHBydWViYXMxLzAtBgNVBAoMJlNlcnZpY2lvIGRlIEFkbWluaXN0cmFj&#xD;&#xA;acOzbiBUcmlidXRhcmlhMTgwNgYDVQQLDC9BZG1pbmlzdHJhY2nDs24gZGUgU2VndXJpZGFkIGRl&#xD;&#xA;IGxhIEluZm9ybWFjacOzbjEpMCcGCSqGSIb3DQEJARYaYXNpc25ldEBwcnVlYmFzLnNhdC5nb2Iu&#xD;&#xA;bXgxJjAkBgNVBAkMHUF2LiBIaWRhbGdvIDc3LCBDb2wuIEd1ZXJyZXJvMQ4wDAYDVQQRDAUwNjMw&#xD;&#xA;MDELMAkGA1UEBhMCTVgxGTAXBgNVBAgMEERpc3RyaXRvIEZlZGVyYWwxEjAQBgNVBAcMCUNveW9h&#xD;&#xA;Y8OhbjEVMBMGA1UELRMMU0FUOTcwNzAxTk4zMTIwMAYJKoZIhvcNAQkCDCNSZXNwb25zYWJsZTog&#xD;&#xA;SMOpY3RvciBPcm5lbGFzIEFyY2lnYTAeFw0xMDA3MzAxNjU4NDNaFw0xMjA3MjkxNjU4NDNaMIGW&#xD;&#xA;MRIwEAYDVQQDDAlNYXRyaXogU0ExEjAQBgNVBCkMCU1hdHJpeiBTQTESMBAGA1UECgwJTWF0cml6&#xD;&#xA;IFNBMSUwIwYDVQQtExxBQUEwMTAxMDFBQUEgLyBBQUFBMDEwMTAxQUFBMR4wHAYDVQQFExUgLyBB&#xD;&#xA;QUFBMDEwMTAxSERGUlhYMDExETAPBgNVBAsMCFVuaWRhZCA1MIGfMA0GCSqGSIb3DQEBAQUAA4GN&#xD;&#xA;ADCBiQKBgQDUSF/1rQXloxD7ng3QDlR8lL46nWGHOQQlh/OIUTldon+Fe47GvTwjE0aiyUeRuXMV&#xD;&#xA;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#>

Imagen de july

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?

Imagen de july

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

Imagen de july

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?

Imagen de nomarlegnar

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