![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
|
|
#1
|
|||
|
|||
|
Problemas con el Sello
Cita:
Ya revisé la cadena y está correcta, de hecho me genera el mismo MD5 que genera el validador del SAT. Alguien ha validado los .xml con el Sello?? . Las rutinas que utilizo son las siguientes... Código:
function SelloDigital(llaveprivada, cadenaoriginal: widestring): String;
var
Len : cardinal;
mdctx : EVP_MD_CTX;
inbuf : array [0..8192] of char;
outbuf : array [0..1023] of char;
key: pEVP_PKEY;
begin
cadenaoriginal := AnsiReplaceStr(cadenaoriginal,#13,'');
cadenaoriginal := AnsiReplaceStr(cadenaoriginal,#10,'');
cadenaoriginal := AnsiReplaceStr(cadenaoriginal,#8,'');
cadenaoriginal := AnsiReplaceStr(cadenaoriginal,' ','');
cadenaoriginal := AnsiReplaceStr(cadenaoriginal,' |','|');
cadenaoriginal := AnsiReplaceStr(cadenaoriginal,'| ','|');
cadenaoriginal := UTF8Encode(cadenaoriginal);
StrPCopy(inbuf,cadenaoriginal);
InitOpenSSL;
key:=LoadPrivateKey(llaveprivada,'');
// EVP_MD_CTX_init(@mdctx);
EVP_SignInit(@mdctx,EVP_md5());
EVP_SignUpdate(@mdctx,@inbuf,Length(inbuf));
EVP_SignFinal(@mdctx,@outbuf,Len,key);
// EVP_MD_CTX_cleanup(@mdctx);
EVP_PKEY_free(key);
FreeOpenSSL;
result := bintobase64(@outbuf,Len);
end;
|
|
#2
|
|||
|
|||
|
Factura Electronica Validada en SAT
Cita:
Ya pude validar el XML completo en el Validador del SAT, la rutina que está mal es: Código:
EVP_SignUpdate(@mdctx,@inbuf,Length(inbuf));
debe ser
EVP_SignUpdate(@mdctx,@inbuf,StrLen(inbuf));
Les comento que use el XML Data Binding con Delphi 7 generandolo a partir el archivo cfdv2.xsd del SAT solo requiere un truco para dar de alta los nameSpace adicionales, ya que el XML Data Binding solo puede dar de alta uno. Claro que se puede generar el XML a mano a través del XMLDocument directamente. El truco es : Código:
const
// Esta cabecera es necesaria como primer renglón del archivo XML
// y no se da de alta a traves del XML Data Binding.
CabezaXML = '<?xml version="1.0" encoding="UTF-8"?>';
var
Nodo : IXMLNode;
S : String;
i : integer;
Cadena : wideString;
begin
// donde esté nuestra llave privada ya en formato .pem....
PuKey := 'C:\...\Factura Electronica\...\aaa010101aaa.cer.pem';
XMLFactura := GetComprobante(XML1);
// Alta de los nameSpace faltantes...
Nodo := XML1.DocumentElement;
Nodo.Attributes['xmlns:xsi'] := 'http://www.w3.org/2001/XMLSchema-instance';
Nodo.Attributes['xsi:schemaLocation'] := 'http://www.sat.gob.mx/cfd/2 http://www.sat.gob.mx/sitio_internet/cfd/2/cfdv2.xsd';
with XMLFactura do begin
Version := '2.0';
...
// Generar la Cadena y luego el Sello
XMLFactura.Sello := SelloDigital(PrKey,Cadena);
XML1.XML.Insert(0,CabezaXML);
// Generamos el archivo Fact1.XML -- cambiar el nombra al necesario.
// así com el directorio de datos donde guardamos los XML
XML1.Active := True;
XML1.SaveToFile('C:\...\Factura Electronica\XML\Fact1.xml');
end;
Saludos y mucha suerte... |
|
#3
|
|||
|
|||
|
Hola ifarias, mi solucion es muy parecida a la tuya y me permito hacerte una recomendacion.
El Data Binding del cfdv2.xsl se genera muy bien pero aveces resulta que, por ejemplo, el cliente NO tiene "Numero Interior" o "Colonia" es por eso que en la unidad cfdv2.pas te recomiendo hacer una busqueda y remplazo de : Buscar : SetAttribute( Remplazar por : if Value <> '' then SetAttribute( entonces, por ejemplo, la rutina que graba el "Numero Exterior" quedaria asi :
Eso te garantiza que no se vayan a grabar datos nulos o vacios, algo que por cierto no le gusta al validador...... Hay dos valores tipo integer, noAprobacion y anoAprobacion (sic), esos tienes que usar
Tambien me permito mostrar como yo solucione los namespace extra, algo que no me deja muy convencido de tu solucion es que creas otro nodo, rompiendo un poco con el pragma del encapsulado que te da el data binding.
|
|
#4
|
|||
|
|||
|
En el mensaje anterior estaba tratando de introducir el siguiente codigo :
XMLDoc.XML.Text := '<?xml version="1.0" encoding="UTF-8" ?><Comprobante xmlns="http://www.sat.gob.mx/cfd/2"></Comprobante>'; XMLDoc.Active := True; CFD := GetComprobante(XMLDoc); with CFD do begin SetAttribute('xmlns:xsi','http://www.w3.org/2001/XMLSchema-instance'); SetAttribute('xsi:schemaLocation','http://www.sat.gob.mx/cfd/2 http://www.sat.gob.mx/sitio_internet/cfd/2/cfdv2.xsd'); Version := '2.0'; Serie := ...........etc.................. Pero parece que el parser no lo interpreto bien........Saludos |
|
#5
|
|||
|
|||
|
dado
Gracias por los comentarios, los tomaré en cuenta. En cuanto a generar un Nodo adicional, la realidad es que me estoy posicionando en el nodo <Comprobante> que es el raíz en ese momento, (para mi desarrollo), y agrego atributos adicionales. Esto da como resultado el siguiente código XML Código:
<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= .... En cuanto al XML Data Binding, tienes toda la razón, es buena idea prevenir el que se generen datos nulos, y que fácil es que cometamos errores al codificar y tener problemas posteriores. |
|
#6
|
|||
|
|||
|
Facturación eléctronica
Hola compañeros foristas
Al igual que ustedes tengo el mismo problema, ya que he desarrollado un sistema de punto de venta y algunos programas para facturación (para comercializadoras, agentes aduanales, etc.), el caso es que parece muy complicado el asunto. Entre mis desarrollos he hecho un sistema de pedimentos (sirve para elaborar documentos para importar y exportar mercancias) desde hace varios años y antes de que se presente el pedimento ante la aduana, se debe validar, para lo cual genero un archivo y este hay que firmarlo electronicamente, para lo cual en las paginas de aduana se usa un programa llamado SIFEP o se puede optar por usar unas librerias para firmalos desde tu propio programa. No sé si esto sea similar a las facturas eléctronicas, el proceso en el sistema de pedimentos es el siguiente: Pedimentos - se captura el pedimento - se genera un archivo de texto con cos datos del pedimento, importador, mercancias, etc. - Se firmar el archivo utilizando el achivo de certificado .cer y el archivo llave .key que se le ha proporcionado al agente aduanal por el SAT - La cadena resultante (firma) se agrega al final del archivo de texto que se va a validar y se imprime en el pedimento Facturación - Se captura la factura - Se genera un archivo XML con los datos del vendedor, cliente, mercancias, etc. - Se firma el archivo - Se imprime en la factura (se hace algo mas?) Al final de todo esto no sé si sea lo mismo (se puedan firmar las facturas del mismo modo) aunque sospecho que aunque se parezca no tiene nada que ver. Por lo pronto voy a empezar por estudiar como generar el XML y todo el proceso.
__________________
Cancun, Q.Roo, México |
|
#7
|
||||
|
||||
|
Que tal cancun (jeje, que nicks tan originales
),Segun lo que comentas, el proceso es casi casi lo mismo. Adicionalmente a lo que tienes solo te restaría generar el xml y obtener su cadena de digestión y lo demás es pan comido pars ti según lo que tienes. ¿Que librerías son esas de las que dispones? Son gratis o de paga?
__________________
Tiempo y ocasión acontecen a todos! |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
Temas Similares
|
||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| Mexico - Como crear sellos en FACTURA ELECTRONICA.. | pcicom | API de Windows | 12 | 10-11-2012 18:46:55 |
| Factura Electrónica | aig | Varios | 13 | 10-12-2010 17:12:44 |
| factura electronica | cmm07 | Varios | 4 | 02-04-2009 17:46:03 |
| factura electronica | spia | Varios | 2 | 22-02-2009 21:30:06 |
| Factura electronica AUNA | Aprendiz | Varios | 5 | 01-09-2005 10:44:15 |
|