![]() |
![]() |
| 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
|
|||
|
|||
|
Muchas gracias, lo voy a revisar!
__________________
Alejandro Jourdan |
|
#2
|
||||
|
||||
|
Ya había puesto el link en otro post. Pero aquí te dejo el componente LockBox de TurboPower, no solo maneja RSA sino MD5, Blowfish y otros métodos de encriptado. Tiene un ejemplo que hace precisamente lo que se requiere para la factura electrónica: se le mete una cadena original, se le proporciona la clave de encryptado y arroja un resultado ya encriptado correctamente.
__________________
AKA "El animalito" ||Cordobés a mucha honra|| |
|
#3
|
||||
|
||||
|
uamero, por favor, recuerda poner el código entre etiquetas para que se pueda leer mejor, gracias.
Aquí tienes una referencia. De momento, este último te lo voy a editar para que veas la diferencia, ok?
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
|
#4
|
||||
|
||||
|
Que casualidad buscando como usar los xml para esto de los cfd di con este post, yo acabo de publicar un ejemplo aquí de como usar las librerias openssl para generar el sello usando una biblioteca que me recomendo Hector Randolph tal vez te pueda servir para que no tengas que usar tanto bat.
Saludos |
|
#5
|
||||
|
||||
|
Si tienes razon solo funciona la primera vez. Estoy viendo si con este otro codigo que encontre se corrije si quieres puedes probarlo tambien.
http://stackoverflow.com/questions/1...ning-to-delphi Saludos |
|
#6
|
|||
|
|||
|
Anexo una modificación al código enviado en donde puedes obtener varias veces el sello al limpiar bien la memoria y puedes también obtener los datos del certificado.
Ojalá sea de utilidad |
|
#7
|
||||
|
||||
|
Factura digital traerá problemas para contribuyentes: AMECE
A partir del primer minuto del próximo año todas las empresas y personas físicas que realicen una transacción superior a los 2 mil pesos tendrán que expedir facturas digitales. Más información aquí |
|
#8
|
||||
|
||||
|
Que tal uamero, me llama la atención la manera en que generas la cadena original. Mira, con C# la genero con la siguiente función:
Código:
public string GeneraCadenaOriginal(string nombreArchivo)
{
string cadenaOriginal = "";
string fileXSLT = System.IO.Path.Combine(Directory.GetCurrentDirectory(), "cadenaoriginal_2_0.xslt"); // @"http://www.sat.gob.mx/sitio_internet/cfd/2/cadenaoriginal_2_0/cadenaoriginal_2_0.xslt";
string newFile = System.IO.Path.GetTempFileName();
try
{
XslCompiledTransform xsl = new XslCompiledTransform();
xsl.Load(fileXSLT);
xsl.Transform(nombreArchivo, newFile);
xsl = null;
StreamReader streamReader = new StreamReader(newFile);
cadenaOriginal = streamReader.ReadToEnd();
streamReader.Close();
}
catch (Exception)
{
throw;
}
finally
{
// Eliminamos el archivo
System.IO.File.Delete(newFile);
}
return cadenaOriginal;
}
Bueno, la pregunta es ¿de puritita casualidad no has encontrado algo acerca de como transformar el XML en la cadena original utilizando el archivo XSLT para ello? Por cierto, lo que expones acerca de como el componente TXMLDcument te genera las entidades ya lo comprobé y si que te saca de apurototote. ![]() Aún así me gustaría encontrar la manera de generar la cadena original con una transformación ¿Alguien sabe como hacer esta transformación? Saludos y excelente trabajo uamero.
__________________
Tiempo y ocasión acontecen a todos! |
|
#9
|
|||
|
|||
|
Podrias poner un ejemplo de como utilizar las funciones
Cita:
Gracias de antemano |
|
#10
|
|||
|
|||
|
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;
|
|
#11
|
|||
|
|||
|
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... |
|
#12
|
|||
|
|||
|
Hola wallamx
Bienvenido a estos foros. Solo te comento que no por repetir tu mensaje vas a hacer que te contesten más rapido... Te recomiendo que le des una leida a la Guía de Estilo de los foros... Saludos... |
|
#13
|
|||
|
|||
|
Hola,
una vez obtenida la cadena, simplemente tienes que ejecutar las siguientes funciones: //Obtiene el sello a partir de la cadena Sello := SelloDigital('aaa010101aaa_CSD_01.key.pem',cadena); //Obtiene el certificado (clave pública) Certificado := LoadPublicKey('aaa010101aaa_CSD_01.cer.pem'); //Obtiene la serie del certificado NoCertificado := GetNoCertificado('aaa010101aaa_CSD_01.cer.pem'); Todas las funciones están declaradas en el archivo que subí. Saludos |
![]() |
| 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 |
|