OT. Firma electrónica Costa Rica

2,899 views
Skip to first unread message

Jose Carlos Aguilar

unread,
Jan 16, 2018, 8:11:54 AM1/16/18
to Comunidad de Visual Foxpro en Español
Les adjunto una librería para el firmado electrónico de facturas en Costa Rica acorde a lo que pide Hacienda.

Primero registrar la libreria luego ejecutar desde Foxpro de la sgt manera:
 ol = CREATEOBJECT("firmadoxadescr")

MESSAGEBOX(ol.FirmarXAdes("E:\Ivancr\", ;
                           "xml_sinfirma.xml",;
                           "E:\IvanCr\" , ;
                           "firmadocr.xml","E:\IvanCr\certificado.p12","clacecertificado"))

Espero les sea de utilidad.

Saludos
firmadocr._rar

Diana sanchez

unread,
Jan 16, 2018, 8:29:16 AM1/16/18
to Comunidad de Visual Foxpro en Español
Toca Probar para ver si cumple los requisitos de Hacienda.
Gracias por compartir

Hernan Serrano

unread,
Jan 16, 2018, 8:31:46 AM1/16/18
to publice...@googlegroups.com
Gracias Hermano, justo yo estoy trabajando en los XML, segun los requisitos de hacienda.
Pero esto ayudara montones.

Gracias de verdad.



--
Tico Support S. A.
Tel. (506)8772-6170

Hernan Serrano

unread,
Jan 18, 2018, 8:47:16 AM1/18/18
to publice...@googlegroups.com
Ante todo muchas gracias por la ayuda brindada.

Te comento que ya supere la creacion del XML.En VFP.
Anoche mismo, ahora lo que estoy haciendo es llenando con datos de prueba.
Para su posterior encriptacion y envio a site de pruebas de hacienda.

ATTE

Hernan Serrano M.

Hernan Serrano

unread,
Jan 19, 2018, 8:41:01 AM1/19/18
to publice...@googlegroups.com
Esta libreira solo realiza el firmado?
Pasa a array byte y encripta en Base64?


Daniel Sánchez

unread,
Jan 19, 2018, 9:32:06 AM1/19/18
to Comunidad de Visual Foxpro en Español
Para que pases un dato a array base 64 (en otras palabras un string de vfp), solo debes convertir en vfp con strconv, lo pasa de 64 a 32 y viceversa, revisa las opciones disponibles.

Jose Carlos Aguilar

unread,
Jan 19, 2018, 4:23:16 PM1/19/18
to Comunidad de Visual Foxpro en Español
Solo el firmado en formato XADES - EPEs, .
Saludos

Hernan Serrano

unread,
Jan 20, 2018, 10:03:41 AM1/20/18
to publice...@googlegroups.com
Cuando trato de utilizarla me indica un error en la contraseña de la red.

Eso es por que no esta instalado el certificado del cliente en la computadora?
o a que se debe el error.

Otra si se trata de instalar el certificado. Me indica error en la contraseña.

Jose Carlos Aguilar

unread,
Jan 20, 2018, 10:05:41 AM1/20/18
to Comunidad de Visual Foxpro en Español
Primero q nada la libreria debe registrarse,  no hay que instalar nada, la libreria recibe los parametros, xml, certificado y clave.
Saludos

Hernan Serrano

unread,
Jan 20, 2018, 11:04:52 AM1/20/18
to publice...@googlegroups.com
Gracias Mi error. No habia instalado el certificado..


Gracias.
Message has been deleted

Geovanni Solís Perez

unread,
Jan 22, 2018, 10:38:29 AM1/22/18
to Comunidad de Visual Foxpro en Español
Saludos Jose Carlos, una pregunta pues aca no tenemos mucha experiencia,  esta libreria de la firma es una libreria "universal" o tiene algo específico para Costa Rica que si en algún momento hacienda cambiara algun detalle debamos depender de tu ayuda para realizar el ajuste en dicha librería, o con tu experiencia con  esto de la firma, es difícil que cambie?

Muchas Gracias por tu gran aporte.

Saludos

Geovanni Solis


Geovanni Solís Perez

unread,
Jan 22, 2018, 10:44:49 AM1/22/18
to Comunidad de Visual Foxpro en Español
Compañero, nosotros no hemos probado la dll, pero, en determinado momento, para enviar un xml a un proveedor (tercero), que es una salida momentánea mientas hacemos la comunicación directa, los caracteres especiales reventaban el envio del XML,  la Ñ y la ñ y las vocales tildadas, nos dan problema al generar el XML,  por lo tanto realizamos una rutina para eliminar dichos caracteres. Lo comento por aquello que sea esto tu problema,

Saludos
Geovanni Solis
Solisoft de Costa Rica.
 

El lunes, 22 de enero de 2018, 9:30:50 (UTC-6), Gregorik Domador escribió:
Saludos, Muchas Gracias a Jose Carlos Aguilar por su ayuda con este tema de la firma que de verdad ya me tiene aturdido.

Sin embargo, el web service aun me sigue respondiendo "La Firma no es válida".

¿Ya alguien mas probó la dll de forma definitiva y puede confirmar que Hacienda acepta la firma generada?

Yo la prueba que hice fue firmar el XML con la dll de Jose Carlos, convertir a base64 el xml final resultante (probe tanto manualmente via una pagina web de conversion como tmabien desde foxpro, mismo resultado), incrustar el Base64 obtenido dentro de la estructura del JSON y enviarlo al web service y me sigue respondiendo "La firma no es válida", asi quedo mi json resultante:

{"clave": "50622011800310112345600100001010000000001100000001",
"fecha": "2018-01-22T11:15:58-0600",
"emisor": {"tipoIdentificacion": "02",
"numeroIdentificacion": "3101123456"},
"receptor": {"tipoIdentificacion": "01",
"numeroIdentificacion": "123465789"},
"comprobanteXml": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RmFjdHVyYUVsZWN0cm9uaWNhIHhtbG5zPSJodHRwczovL3RyaWJ1bmV0LmhhY2llbmRhLmdvLmNyL2RvY3MvZXNxdWVtYXMvMjAxNy92NC4yL2ZhY3R1cmFFbGVjdHJvbmljYSI+DQo8Q2xhdmU+NTA2MjIwMTE4MDAzMTAxMTIzNDU2MDAxMDAwMDEwMTAwMDAwMDAwMDExMDAwMDAwMDE8L0NsYXZlPg0KPE51bWVyb0NvbnNlY3V0aXZvPjAwMTAwMDAxMDEwMDAwMDAwMDAxPC9OdW1lcm9Db25zZWN1dGl2bz4NCjxGZWNoYUVtaXNpb24+MjAxNy0xMS0yN1QxMTozMTozNS0wNjAwPC9GZWNoYUVtaXNpb24+DQo8RW1pc29yPg0KPE5vbWJyZT5FTVBSRVNBIERFIENPU1RBIFJJQ0E8L05vbWJyZT4NCjxJZGVudGlmaWNhY2lvbj4NCjxUaXBvPjAyPC9UaXBvPg0KPE51bWVybz4zMTAxMTIzNDU2PC9OdW1lcm8+DQo8L0lkZW50aWZpY2FjaW9uPg0KPE5vbWJyZUNvbWVyY2lhbD5FTVBSRVNBIERFIENPU1RBIFJJQ0E8L05vbWJyZUNvbWVyY2lhbD4NCjxVYmljYWNpb24+DQo8UHJvdmluY2lhPjI8L1Byb3ZpbmNpYT4NCjxDYW50b24+MDM8L0NhbnRvbj4NCjxEaXN0cml0bz4wNDwvRGlzdHJpdG8+DQo8QmFycmlvPjAwPC9CYXJyaW8+DQo8T3RyYXNTZW5hcz5DT1NUQSBSSUNBPC9PdHJhc1NlbmFzPg0KPC9VYmljYWNpb24+DQo8VGVsZWZvbm8+DQo8Q29kaWdvUGFpcz4xMjM8L0NvZGlnb1BhaXM+DQo8TnVtVGVsZWZvbm8+NDU2Nzg5MDEyMzQ1PC9OdW1UZWxlZm9ubz4NCjwvVGVsZWZvbm8+DQo8Q29ycmVvRWxlY3Ryb25pY28+R0RPTUFET1JASE9UTUFJTC5DT008L0NvcnJlb0VsZWN0cm9uaWNvPg0KPC9FbWlzb3I+DQo8UmVjZXB0b3I+DQo8Tm9tYnJlPkNMSUVOVEUgREVNTzwvTm9tYnJlPg0KPElkZW50aWZpY2FjaW9uPg0KPFRpcG8+MDE8L1RpcG8+DQo8TnVtZXJvPjEyMzQ2NTc4OTwvTnVtZXJvPg0KPC9JZGVudGlmaWNhY2lvbj4NCjxJZGVudGlmaWNhY2lvbkV4dHJhbmplcm8+Ti9BPC9JZGVudGlmaWNhY2lvbkV4dHJhbmplcm8+DQo8Tm9tYnJlQ29tZXJjaWFsPkNMSUVOVEUgREVNTzwvTm9tYnJlQ29tZXJjaWFsPg0KPFViaWNhY2lvbj4NCjxQcm92aW5jaWE+MTwvUHJvdmluY2lhPg0KPENhbnRvbj4wMTwvQ2FudG9uPg0KPERpc3RyaXRvPjAyPC9EaXN0cml0bz4NCjxCYXJyaW8+MDI8L0JhcnJpbz4NCjxPdHJhc1NlbmFzPkRJUkVDQ0lPTiBERU1PU1RSQVRJVkE8L090cmFzU2VuYXM+DQo8L1ViaWNhY2lvbj4NCjxDb3JyZW9FbGVjdHJvbmljbz48L0NvcnJlb0VsZWN0cm9uaWNvPg0KPC9SZWNlcHRvcj4NCjxDb25kaWNpb25WZW50YT4wMTwvQ29uZGljaW9uVmVudGE+DQo8UGxhem9DcmVkaXRvPjwvUGxhem9DcmVkaXRvPg0KPE1lZGlvUGFnbz4wMTwvTWVkaW9QYWdvPg0KPERldGFsbGVTZXJ2aWNpbz4NCjxMaW5lYURldGFsbGU+DQo8TnVtZXJvTGluZWE+MTwvTnVtZXJvTGluZWE+DQo8Q29kaWdvPg0KPFRpcG8+MDQ8L1RpcG8+DQo8Q29kaWdvPjAxPC9Db2RpZ28+DQo8L0NvZGlnbz4NCjxDYW50aWRhZD4yLjAwMDwvQ2FudGlkYWQ+DQo8VW5pZGFkTWVkaWRhPlVuZDwvVW5pZGFkTWVkaWRhPg0KPERldGFsbGU+QVJUSUNVTE8gU0VSVklDSU8gREVNT1NUUkFUSVZPIElNUFVFU1RPIDAxPC9EZXRhbGxlPg0KPFByZWNpb1VuaXRhcmlvPjEwLjAwMDAwPC9QcmVjaW9Vbml0YXJpbz4NCjxNb250b1RvdGFsPjIwLjAwMDAwPC9Nb250b1RvdGFsPg0KPE1vbnRvRGVzY3VlbnRvPjAuMDAwMDA8L01vbnRvRGVzY3VlbnRvPg0KPFN1YlRvdGFsPjIwLjAwMDAwPC9TdWJUb3RhbD4NCjxJbXB1ZXN0bz4NCjxDb2RpZ28+MDE8L0NvZGlnbz4NCjxUYXJpZmE+MTMuMDAwMDA8L1RhcmlmYT4NCjxNb250bz4yLjYwMDAwPC9Nb250bz4NCjwvSW1wdWVzdG8+DQo8TW9udG9Ub3RhbExpbmVhPjIyLjYwMDAwPC9Nb250b1RvdGFsTGluZWE+DQo8L0xpbmVhRGV0YWxsZT4NCjxMaW5lYURldGFsbGU+DQo8TnVtZXJvTGluZWE+MjwvTnVtZXJvTGluZWE+DQo8Q29kaWdvPg0KPFRpcG8+MDQ8L1RpcG8+DQo8Q29kaWdvPjAyPC9Db2RpZ28+DQo8L0NvZGlnbz4NCjxDYW50aWRhZD4zLjAwMDwvQ2FudGlkYWQ+DQo8VW5pZGFkTWVkaWRhPjwvVW5pZGFkTWVkaWRhPg0KPERldGFsbGU+QVJUSUNVTE8gREUgU0VSVklDSU8gREVNT1NUUkFUSVZPIElNUFVFU1RPIDAyPC9EZXRhbGxlPg0KPFByZWNpb1VuaXRhcmlvPjIwLjAwMDAwPC9QcmVjaW9Vbml0YXJpbz4NCjxNb250b1RvdGFsPjYwLjAwMDAwPC9Nb250b1RvdGFsPg0KPE1vbnRvRGVzY3VlbnRvPjAuMDAwMDA8L01vbnRvRGVzY3VlbnRvPg0KPFN1YlRvdGFsPjYwLjAwMDAwPC9TdWJUb3RhbD4NCjxJbXB1ZXN0bz4NCjxDb2RpZ28+MDI8L0NvZGlnbz4NCjxUYXJpZmE+MTAuMDAwMDA8L1RhcmlmYT4NCjxNb250bz42LjAwMDAwPC9Nb250bz4NCjwvSW1wdWVzdG8+DQo8TW9udG9Ub3RhbExpbmVhPjY2LjAwMDAwPC9Nb250b1RvdGFsTGluZWE+DQo8L0xpbmVhRGV0YWxsZT4NCjwvRGV0YWxsZVNlcnZpY2lvPg0KPFJlc3VtZW5GYWN0dXJhPg0KPENvZGlnb01vbmVkYT5DUkM8L0NvZGlnb01vbmVkYT4NCjxUaXBvQ2FtYmlvPjAuMDA8L1RpcG9DYW1iaW8+DQo8VG90YWxTZXJ2R3JhdmFkb3M+ODAuMDAwMDA8L1RvdGFsU2VydkdyYXZhZG9zPg0KPFRvdGFsU2VydkV4ZW50b3M+MC4wMDAwMDwvVG90YWxTZXJ2RXhlbnRvcz4NCjxUb3RhbE1lcmNhbmNpYXNHcmF2YWRhcz4wLjAwMDAwPC9Ub3RhbE1lcmNhbmNpYXNHcmF2YWRhcz4NCjxUb3RhbE1lcmNhbmNpYXNFeGVudGFzPjAuMDAwMDA8L1RvdGFsTWVyY2FuY2lhc0V4ZW50YXM+DQo8VG90YWxHcmF2YWRvPjgwLjAwMDAwPC9Ub3RhbEdyYXZhZG8+DQo8VG90YWxFeGVudG8+MC4wMDAwMDwvVG90YWxFeGVudG8+DQo8VG90YWxWZW50YT44MC4wMDAwMDwvVG90YWxWZW50YT4NCjxUb3RhbERlc2N1ZW50b3M+MC4wMDAwMDwvVG90YWxEZXNjdWVudG9zPg0KPFRvdGFsVmVudGFOZXRhPjgwLjAwMDAwPC9Ub3RhbFZlbnRhTmV0YT4NCjxUb3RhbEltcHVlc3RvPjguNjAwMDA8L1RvdGFsSW1wdWVzdG8+DQo8VG90YWxDb21wcm9iYW50ZT44OC42MDAwMDwvVG90YWxDb21wcm9iYW50ZT4NCjwvUmVzdW1lbkZhY3R1cmE+DQo8Tm9ybWF0aXZhPg0KPE51bWVyb1Jlc29sdWNpb24+REdULVItNDgtMjAxNjwvTnVtZXJvUmVzb2x1Y2lvbj4NCjxGZWNoYVJlc29sdWNpb24+MjAtMDItMjAxNyAxMzoyMjoyMjwvRmVjaGFSZXNvbHVjaW9uPg0KPC9Ob3JtYXRpdmE+DQo8ZHM6U2lnbmF0dXJlIHhtbG5zOmRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIiBJZD0iU2lnbmF0dXJlLTY4OTQ4ZjkwLWNjOGQtNDRiMS1iNDkwLWIyNzllNjc3MDFkYSI+PGRzOlNpZ25lZEluZm8+PGRzOkNhbm9uaWNhbGl6YXRpb25NZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy14bWwtYzE0bi0yMDAxMDMxNSIgLz48ZHM6U2lnbmF0dXJlTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8wNC94bWxkc2lnLW1vcmUjcnNhLXNoYTI1NiIgLz48ZHM6UmVmZXJlbmNlIElkPSJSZWZlcmVuY2UtOTg4M2EyYjktODUwZC00OWFmLWE3NGItYjgzNDM2YzJlMTk4IiBVUkk9IiI+PGRzOlRyYW5zZm9ybXM+PGRzOlRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNlbnZlbG9wZWQtc2lnbmF0dXJlIiAvPjwvZHM6VHJhbnNmb3Jtcz48ZHM6RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8wNC94bWxlbmMjc2hhMjU2IiAvPjxkczpEaWdlc3RWYWx1ZT5pVmVjWDArTXRZNTVQZ1pVYUM4RUlzK2d4anBnSGxudkVNMEZUUFh0VnRrPTwvZHM6RGlnZXN0VmFsdWU+PC9kczpSZWZlcmVuY2U+PGRzOlJlZmVyZW5jZSBJZD0iUmVmZXJlbmNlS2V5SW5mbyIgVVJJPSIjS2V5SW5mb0lkLVNpZ25hdHVyZS02ODk0OGY5MC1jYzhkLTQ0YjEtYjQ5MC1iMjc5ZTY3NzAxZGEiPjxkczpEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGVuYyNzaGEyNTYiIC8+PGRzOkRpZ2VzdFZhbHVlPi9MSXZFc2FRMVRiOVZDaGNZWW5paE5iR09xeUluZVgvRFRTbTRiRVdKVDA9PC9kczpEaWdlc3RWYWx1ZT48L2RzOlJlZmVyZW5jZT48ZHM6UmVmZXJlbmNlIFR5cGU9Imh0dHA6Ly91cmkuZXRzaS5vcmcvMDE5MDMjU2lnbmVkUHJvcGVydGllcyIgVVJJPSIjU2lnbmVkUHJvcGVydGllcy1TaWduYXR1cmUtNjg5NDhmOTAtY2M4ZC00NGIxLWI0OTAtYjI3OWU2NzcwMWRhIj48ZHM6RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8wNC94bWxlbmMjc2hhMjU2IiAvPjxkczpEaWdlc3RWYWx1ZT4yeE40U0RxeWJtSnFnYzZlT09vVDVad1Bmd1RudkhNWEVOS0FGSSs5U2JvPTwvZHM6RGlnZXN0VmFsdWU+PC9kczpSZWZlcmVuY2U+PC9kczpTaWduZWRJbmZvPjxkczpTaWduYXR1cmVWYWx1ZSBJZD0iU2lnbmF0dXJlVmFsdWUtNjg5NDhmOTAtY2M4ZC00NGIxLWI0OTAtYjI3OWU2NzcwMWRhIj5TR2hTN08xZElFdWM0Q2ViRTlacThCZU8rakVUelloVVFtVTI4K0grSGdaN2lJVnlQREI3cHBFMm85YTRGYTBIMUExcFZ1UkwrMy90YUJVTURidFI4TzdUU0hDa0h2azlkaklsYTI0b2lYYTNoSmVrVENEWWEyT3NsbUlheXJyS2hpWnFaWUg5YWRjNlIrbXkwaytmRGdla24rZmhIUkhxejY0cVZtc1o0T1pQZEZGOEVqbzVFWEE0bUx1TFZYdmpiN0VWTUN0K0ZOdmJnVW5lYjdnZ1B6YWZkUkVSVENpU2VLQWU1TDh2U2MxNXNHZ2hOZmNuYXFmcFhJOWZZaU9CazRUZ2VaY20ycjFaQTZKbW43UUVZaUVTajVoRnpZdG8wL01VV0R4Tm9xeW9yQ1hDQ3lRSmMrakNGQmlBOFJTZSs4MFRsUitPNkF2Q2RIdEsyeSs4MXc9PTwvZHM6U2lnbmF0dXJlVmFsdWU+PGRzOktleUluZm8gSWQ9IktleUluZm9JZC1TaWduYXR1cmUtNjg5NDhmOTAtY2M4ZC00NGIxLWI0OTAtYjI3OWU2NzcwMWRhIj48ZHM6WDUwOURhdGE+PGRzOlg1MDlDZXJ0aWZpY2F0ZT5NSUlGYkRDQ0ExU2dBd0lCQWdJR0FXQkd3dEhqTUEwR0NTcUdTSWIzRFFFQkN3VUFNRzR4Q3pBSkJnTlZCQVlUQWtOU01Ta3dKd1lEVlFRS0RDQk5TVTVKVTFSRlVrbFBJRVJGSUVoQlEwbEZUa1JCSUMwZ1UwRk9SRUpQV0RFTU1Bb0dBMVVFQ3d3RFJFZFVNU1l3SkFZRFZRUUREQjFEUVNCUVJWSlRUMDVCSUVwVlVrbEVTVU5CSUMwZ1UwRk9SRUpQV0RBZUZ3MHhOekV5TVRFeE9EQTNOREZhRncweE9URXlNVEV4T0RBM05ERmFNSUd5TVJrd0Z3WURWUVFGRXhCRFVFb3RNeTB4TURFdE56STFOalU1TVFrd0J3WURWUVFFREFBeEtUQW5CZ05WQkNvTUlGUkZRMGhPVDB4UFIxa2dRMDlTUlNCVFQwTkpSVVJCUkNCQlRrOU9TVTFCTVFzd0NRWURWUVFHRXdKRFVqRVpNQmNHQTFVRUNnd1FVRVZTVTA5T1FTQktWVkpKUkVsRFFURU1NQW9HQTFVRUN3d0RRMUJLTVNrd0p3WURWUVFERENCVVJVTklUazlNVDBkWklFTlBVa1VnVTA5RFNVVkVRVVFnUVU1UFRrbE5RVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFLb3pPQXU5bWVYdzI4OEp3Z3k4N2N1aGVBcExYVzdPazdnQXNIQllkVWpaNmhZVmZOMFVlZ3psLzlHL25XUXVTSU1mdHNGSDYxazVVanVFUnJYenF6dG1FdmRyS3M0bk1UYkZsZm9UM3lXOFVRMUltY0NSSGRGRGlvNGlVU0t5N1AwblNjZnM4T0hjQlB1UFdsTGMrZmsrQUdxdXhVdE5mL2UwcUZWMHkwWHNFL254NG8wb3p3YVQzcy80eVpXNHlqT2VibVN5N0Z5VDN0RGc5T0lCdk91c2RwclVFbkJSZ1JhYWVEMmUwcVV5UUUwc1d6OHNBWEM3dXhydzRnZzVicGJkQVZ2T1c2ODd6NzYzUUJOaHJmSm16dWJyT3FJTEpGQUhtR29vT09IM0ZESUVXWG1wTDRNUjhwUVpHcmwzZ21Ed1JoUVZ3bmVBbVl3eXVBMUlZbVVDQXdFQUFhT0J5akNCeHpBZkJnTlZIU01FR0RBV2dCU3NLRVg0TDUxSVh5d2ZBSkRyTXNXakIxT0E0VEFkQmdOVkhRNEVGZ1FVYm1wRkR1dE5EbGx5K3h6NnJjU2FsbC9TOG00d0N3WURWUjBQQkFRREFnYkFNQk1HQTFVZEpRUU1NQW9HQ0NzR0FRVUZCd01FTUdNR0NDc0dBUVVGQndFQkJGY3dWVEJUQmdnckJnRUZCUWN3QW9aSGFIUjBjSE02THk5d2Eya3VZMjl0Y0hKdlltRnVkR1Z6Wld4bFkzUnliMjVwWTI5ekxtZHZMbU55TDNOMFlXY3ZhVzUwWlhKdFpXUnBZWFJsTFhCcUxYQmxiUzVqY25Rd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dJQkFKRWhqZFZxRVlXVEhUSzc0bThhMjE3T20xbi9zejZoQnJkZ1hvYWVzejkrZ2UyNXJCY3d5N2dnS0lZd0sybFpiK05sZ0VWY0Vnc1VRMDJKVlBHSFY0SXc2c1dLaXM3b0tPYXNXV2xPT09FODhPVFpyRFRlWjFaNEZNMjRIWFBQY1hCQ2huTEZTMVZZQ0xrQVhUNURUV1JLNysra2E3cU0zeHgrcWRQb2d4VnFQTlVOU0dON1psNDhYRTdFSFN1Sml1UWV4d1BJU01JRkJZbjY2OFZhMVZwaVJ5N0prVTNqemZwTzRjMkdTUFJIRnREeXFkbE5NR2VGMmdTK0tYbkUvbUtGTkdKZXNORmhhS2pxWFNnaUtVUjc0dWxBMHVVSmFTOHZhMGU5NUxkcG5ONkczSGpVb2ZYTnhuc1dGYS9UN3MzaW0xbjdFNVBDQ1VVNys5MEFNS1Rabk1DTXMzb1FqZlZqQXV6bTNKVlVQREZBUHFua2FITGRDaDdNTjZQZnhPc0pad09qZDB6S2pKWjhBWXZ5Q2JyUmMxK0hrUTZqcWkwVTFlTkh4cFh1S0hacTRjVGJWOFBHWkw2YjdtU1VHK0cxMmhtOERXaTZaN1BkSFpiUnJ1c25menFNVXhQRlNscVhycjV2ZER6a3hUTXVGOHRHbzAxVmxIbVprdzlRTkdEWnpxKzBWMkEwVmtaTStWY2t1cFJMTVkrcWtZcG96WVVoUzVTdU40UjBOSDd6NjZqWmlyRGd1N1VDU2Jzb3ZuRTM2UytRdiszNlMwdGVlY3MxaDRieVVLeE10akZGQ2ZOem1LN05tM1dXRW9mRENQRnp5K2VWV0VoclFTVzU4eVJ3RHJtTDRQcEZFMnp1cGQrcmtKcGl3RWtaL2lPVHllM3I5YUpBa2dqWTwvZHM6WDUwOUNlcnRpZmljYXRlPjwvZHM6WDUwOURhdGE+PGRzOktleVZhbHVlPjxkczpSU0FLZXlWYWx1ZT48ZHM6TW9kdWx1cz5xak00QzcyWjVmRGJ6d25DREx6dHk2RjRDa3RkYnM2VHVBQ3djRmgxU05ucUZoVjgzUlI2RE9YLzBiK2RaQzVJZ3grMndVZnJXVGxTTzRSR3RmT3JPMllTOTJzcXppY3hOc1dWK2hQZkpieFJEVWlad0pFZDBVT0tqaUpSSXJMcy9TZEp4K3p3NGR3RSs0OWFVdHo1K1Q0QWFxN0ZTMDEvOTdTb1ZYVExSZXdUK2ZIaWpTalBCcFBlei9qSmxiaktNNTV1WkxMc1hKUGUwT0QwNGdHODY2eDJtdFFTY0ZHQkZwcDRQWjdTcFRKQVRTeGJQeXdCY0x1N0d2RGlDRGx1bHQwQlc4NWJyenZQdnJkQUUyR3Q4bWJPNXVzNm9nc2tVQWVZYWlnNDRmY1VNZ1JaZWFrdmd4SHlsQmthdVhlQ1lQQkdGQlhDZDRDWmpESzREVWhpWlE9PTwvZHM6TW9kdWx1cz48ZHM6RXhwb25lbnQ+QVFBQjwvZHM6RXhwb25lbnQ+PC9kczpSU0FLZXlWYWx1ZT48L2RzOktleVZhbHVlPjwvZHM6S2V5SW5mbz48ZHM6T2JqZWN0IElkPSJYYWRlc09iamVjdElkLWRkYjAyZWZiLTViN2ItNDAxNS1hZTk2LTQwMGM5ZmRiOTgyYSI+PHhhZGVzOlF1YWxpZnlpbmdQcm9wZXJ0aWVzIHhtbG5zOnhhZGVzPSJodHRwOi8vdXJpLmV0c2kub3JnLzAxOTAzL3YxLjMuMiMiIElkPSJRdWFsaWZ5aW5nUHJvcGVydGllcy04MmMzZDU1ZC1kNGI2LTQ2ZDgtODlmZi1kOTBjNDUzMGJhZTEiIFRhcmdldD0iI1NpZ25hdHVyZS02ODk0OGY5MC1jYzhkLTQ0YjEtYjQ5MC1iMjc5ZTY3NzAxZGEiPjx4YWRlczpTaWduZWRQcm9wZXJ0aWVzIElkPSJTaWduZWRQcm9wZXJ0aWVzLVNpZ25hdHVyZS02ODk0OGY5MC1jYzhkLTQ0YjEtYjQ5MC1iMjc5ZTY3NzAxZGEiPjx4YWRlczpTaWduZWRTaWduYXR1cmVQcm9wZXJ0aWVzPjx4YWRlczpTaWduaW5nVGltZT4yMDE4LTAxLTIyVDEwOjUwOjE5LTA0OjAwPC94YWRlczpTaWduaW5nVGltZT48eGFkZXM6U2lnbmluZ0NlcnRpZmljYXRlPjx4YWRlczpDZXJ0Pjx4YWRlczpDZXJ0RGlnZXN0PjxkczpEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGVuYyNzaGEyNTYiIC8+PGRzOkRpZ2VzdFZhbHVlPktvTVYwVFE4YjdqcnVNYjhVL1FGNWNuSXB2cVZjZXpUMU5BekJEZWNUczA9PC9kczpEaWdlc3RWYWx1ZT48L3hhZGVzOkNlcnREaWdlc3Q+PHhhZGVzOklzc3VlclNlcmlhbD48ZHM6WDUwOUlzc3Vlck5hbWU+Q049Q0EgUEVSU09OQSBKVVJJRElDQSAtIFNBTkRCT1gsIE9VPURHVCwgTz1NSU5JU1RFUklPIERFIEhBQ0lFTkRBIC0gU0FOREJPWCwgQz1DUjwvZHM6WDUwOUlzc3Vlck5hbWU+PGRzOlg1MDlTZXJpYWxOdW1iZXI+MTUxMzAxNTY2MTAyNzwvZHM6WDUwOVNlcmlhbE51bWJlcj48L3hhZGVzOklzc3VlclNlcmlhbD48L3hhZGVzOkNlcnQ+PC94YWRlczpTaWduaW5nQ2VydGlmaWNhdGU+PHhhZGVzOlNpZ25hdHVyZVBvbGljeUlkZW50aWZpZXI+PHhhZGVzOlNpZ25hdHVyZVBvbGljeUlkPjx4YWRlczpTaWdQb2xpY3lJZD48eGFkZXM6SWRlbnRpZmllcj5odHRwczovL3RyaWJ1bmV0LmhhY2llbmRhLmdvLmNyL2RvY3MvZXNxdWVtYXMvMjAxNi92NC9SZXNvbHVjaW9uJTIwQ29tcHJvYmFudGVzJTIwRWxlY3Ryb25pY29zJTIwJTIwREdULVItNDgtMjAxNi5wZGY8L3hhZGVzOklkZW50aWZpZXI+PHhhZGVzOkRlc2NyaXB0aW9uIC8+PC94YWRlczpTaWdQb2xpY3lJZD48eGFkZXM6U2lnUG9saWN5SGFzaD48ZHM6RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiIC8+PGRzOkRpZ2VzdFZhbHVlPlY4bFZWTkdEQ1BlbjZWRUxSRDFKYThIQVJGaz08L2RzOkRpZ2VzdFZhbHVlPjwveGFkZXM6U2lnUG9saWN5SGFzaD48L3hhZGVzOlNpZ25hdHVyZVBvbGljeUlkPjwveGFkZXM6U2lnbmF0dXJlUG9saWN5SWRlbnRpZmllcj48L3hhZGVzOlNpZ25lZFNpZ25hdHVyZVByb3BlcnRpZXM+PHhhZGVzOlNpZ25lZERhdGFPYmplY3RQcm9wZXJ0aWVzPjx4YWRlczpEYXRhT2JqZWN0Rm9ybWF0IE9iamVjdFJlZmVyZW5jZT0iI1JlZmVyZW5jZS05ODgzYTJiOS04NTBkLTQ5YWYtYTc0Yi1iODM0MzZjMmUxOTgiPjx4YWRlczpNaW1lVHlwZT50ZXh0L3htbDwveGFkZXM6TWltZVR5cGU+PHhhZGVzOkVuY29kaW5nPlVURi04PC94YWRlczpFbmNvZGluZz48L3hhZGVzOkRhdGFPYmplY3RGb3JtYXQ+PC94YWRlczpTaWduZWREYXRhT2JqZWN0UHJvcGVydGllcz48L3hhZGVzOlNpZ25lZFByb3BlcnRpZXM+PC94YWRlczpRdWFsaWZ5aW5nUHJvcGVydGllcz48L2RzOk9iamVjdD48L2RzOlNpZ25hdHVyZT48L0ZhY3R1cmFFbGVjdHJvbmljYT4="}

Probe todo desde postman e igual obtengo el mismo mensaje.

Sera que tengo un error en otra parte?, en el Base64?, me causo curiosidad lo de que hay que convertirlo en arrray de bytes, pero en foxpro es lo mismo que lo haga directamente sobre el string, o estoy equivocado?.


Message has been deleted

Jose Carlos Aguilar

unread,
Jan 22, 2018, 11:38:01 AM1/22/18
to Comunidad de Visual Foxpro en Español
He revisado tu XML   y al ver el XSD, tengo la impresion que el problema son los namespace (en teoría estos influyen al momento de los digest) 
<?xml version="1.0" encoding="utf-8" standalone="no"?><FacturaElectronica xmlns="https://tribunet.hacienda.go.cr/docs/esquemas/2017/v4.2/facturaElectronica" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> Dale una revisada Saludos


Gregorik Domador

unread,
Jan 22, 2018, 12:47:13 PM1/22/18
to Comunidad de Visual Foxpro en Español
Saludos por aca nuevamente, ya logre pasar la etapa de validación de firma y si esta correcta, ya los errores que tengo son propiamente de los campos del xml de la factura.

Jose Carlos Aguilar

unread,
Jan 22, 2018, 12:57:00 PM1/22/18
to Comunidad de Visual Foxpro en Español
Bien, me alegra que les sirva.
Saludos 

Gregorik Domador

unread,
Jan 22, 2018, 2:17:25 PM1/22/18
to Comunidad de Visual Foxpro en Español
Saludos nuevamente amigo Jose Carlos, queria preguntarte si esta libreria es de libre distribución y si no esta condicionada a una fecha en particular y que luego vaya a dejar de funcionar o a solicitar algun tipo de contribucion o se bloquee o algo asi, tu sabes tipo shareware. Te lo pregunto porque yo tengo mi desarrollo echo completamente en FoxPro y solo me faltaba la firma y no lograba producirla, obviamente ahora me doy cuenta que el formato de firma que yo estaba manejando y que era el mismo que esta publicado en la documentación de Hacienda, esta malo, el formato no incluia el modulus ni el exponent ni el digest del nodo keyinfo, obviamente nunca me iba dar correcta la firma, sin embargo ya yo tengo todo mi codigo fuente listo para calcular los digests y armar la estructura de la firma, todo echo en foxpro y utilizando comandos con el archivo openssl.exe y archivos temporales con los cuales voy paso a paso y manualmente armando la firma, todo un trabajon, pero ya lo tengo listo y solo me queda tratar de agregar lo que me falta en mi firma para que sea igual a la tuya y probar a ver si me resulta, pero en dado caso de no lograr reproducir exactamente tu firma, podria yo utilizar tu libreria para distribuirla libremente con mi aplicación?. hasta ahora solo tengo dudas con los id de los nodos, de donde salen estos ids, son dinamicos y los puedo crear yo mismo o viene de alguna parte?, tambien tengos dudas con el digest del certificado nodo <certdigest> de donde sale este digest?

Jose Carlos Aguilar

unread,
Jan 22, 2018, 2:29:40 PM1/22/18
to Comunidad de Visual Foxpro en Español
Estimado Gregory, si mal no recuerdo, me parece visto por otro foro, preguntando si se puede hacer en VFP lo del la firma y te dije que era un camino muy largo pero no imposible. Pero respondiendo a tu pregunta, la librería que publique no tiene ningun tipo de restriccion pero como las entidades tributarias cambian la politicas de firma y otras cosas , si hubiera algún cambio de hecho que la librería dejaria de funcionar, razón por la cual publique el código en c# de esa manera lo podrían modificar y compilar nuevamente. En todo caso lo único q pediría es que al menos hagan referencia a este servidor.

En foxpro con openssl si se puede hacer como dices es investigar, pero yo opte por utilizar esta arternativa más facil y efectiva (Para otros paises como colombia lo tengo en C#, java y hasta en PHP puro), solo es cuestión de tiempo de investigación.
 

Saludos

Gregorik Domador

unread,
Jan 22, 2018, 3:09:11 PM1/22/18
to Comunidad de Visual Foxpro en Español
Si claro, recuerdo tu comentario de otro foros, como te comente ya yo tengo todo echo en foxpro, solo me queda probar que me den los digest e incluir los que me faltan, la opcion de usar .net no es factible para nosotros, en estos momentos lo estoy probando porque cablee por dentro algunas cosas y lo hice funcionar a modo de prueba, pero para el entorno de producción nuestra aplicacion no debe utilizar librerias externas de .net, ya que esto implica tener que incluir en la distribución final el .net framework y actualmente este no es un prerequisito oficial para la utilización de nuestro software, sencillamente por politicas de la empresa no podemos ahora pedirle a los clientes que para poder ejecutar nuestro software deben tener instalado el framework, siempre ha sido politica que mientras menos cosas externas necesite la aplicacion es mejor, repito que no es mi politica sino de la empresa y lamentameblemente debo apegarme a ella.

Greivin Guevara

unread,
Jan 23, 2018, 12:21:38 AM1/23/18
to Comunidad de Visual Foxpro en Español
Muchisimas gracias, Jose Carlos, soy un poco nuevo en este asunto; probé la libreria y me funciono aparentemente. Soy un poco nuevo en este asunto, las otras librerias que vienen para que son especificamente?

El lunes, 22 de enero de 2018, 9:54:10 (UTC-6), Jose Carlos Aguilar escribió:
Les comento, es una librería adaptada para costa Rica, la verdad, tengo mis propias herramientas de validación y los calculos de los digest y todo aparentemente esta correcto.
Son 3 dlls, pero la que envia los parametros a las otras dos es firmadocr.dll.
las otras dos librerias son las que distribuye Hacienda en su facturador gratuito,
el código fuente es el sgte:


using System;
using FirmaXadesNet;
using System.IO;
using FirmaXadesNet.Signature.Parameters;
using FirmaXadesNet.Crypto;
using System.Runtime.InteropServices;
using System.EnterpriseServices;
using System.Security.Cryptography.X509Certificates;
namespace FirmadoXadescr
{
    [ClassInterface(ClassInterfaceType.AutoDual)]
    [ProgId("firmadoXadescr")]
    /* Permitimos que esta clase pueda ser exportada como interfaz COM, para ser utilizada en entornos no .NET también. */
    [Synchronization(SynchronizationOption.Required),
    JustInTimeActivation(true),
    ObjectPooling(Enabled = true)]
    public class FirmaXML
    {
        [AutoComplete(true)]
        public string FirmarXAdes(string CRUTA, string XMLFILE, string CRUTASALIDA, string XMLFILESALIDA, string crutanombreCertificado, string cClavecertificado)
        {
            string rRRpta;
            rRRpta = "ERROR";
            string ficheroFactura = CRUTA + XMLFILE;
            XadesService xadesService = new XadesService();
            SignatureParameters parametros = new SignatureParameters();
            // Política de firma 
            parametros.SignaturePolicyInfo = new SignaturePolicyInfo();
            parametros.SignaturePolicyInfo.PolicyIdentifier = "https://tribunet.hacienda.go.cr/docs/esquemas/2016/v4/Resolucion%20Comprobantes%20Electronicos%20%20DGT-R-48-2016.pdf";             parametros.SignaturePolicyInfo.PolicyHash = "V8lVVNGDCPen6VELRD1Ja8HARFk="; 
            parametros.SignaturePolicyInfo.PolicyUri = "";

            parametros.SignatureMethod = SignatureMethod.RSAwithSHA256;
            parametros.SigningDate =new DateTime ? (DateTime.Now);
            parametros.SignaturePackaging = SignaturePackaging.ENVELOPED;

            string cnomcert = crutanombreCertificado; 
            X509Certificate2 MontCertificat = new X509Certificate2(cnomcert, cClavecertificado);
            using (parametros.Signer = new Signer(MontCertificat))
            {
                using (FileStream fs = new FileStream(ficheroFactura, FileMode.Open))
                {
                    var docFirmado = xadesService.Sign(fs, parametros);
                    docFirmado.Save(CRUTASALIDA + XMLFILESALIDA);
                    rRRpta = "OK - Archivo firmado correctamente por JCAguilar- jcagu...@gmail.com";
                 }
            }
            return rRRpta;
        }
    }
}


Saludos

Gregorik Domador

unread,
Jan 24, 2018, 9:01:02 AM1/24/18
to Comunidad de Visual Foxpro en Español
Saludos Jose Carlos, te informo que ya logre realizar la firma enteramente desde FoxPro usando OpenSSL.exe para calcular los digest y el signature value, te agradezco inmensamente tu ayuda, tu ejemplo me ayudo a darme cuenta que el formato de firma que utilizaba estaba incorrecto y a partir de la firma correcta que se genera con tu libreria logre reproducir la mía tal cual y listo, eso era lo que me faltaba, definitivamente si hubiese tenido el formato de firma correcta esto hubiese estado listo desde hace mas de un mes, pero finalmente gracias a ti lo logré, te repito, inmensamente agradecido.

Jose Carlos Aguilar

unread,
Jan 24, 2018, 9:10:51 AM1/24/18
to Comunidad de Visual Foxpro en Español
Que bueno q te haya servido, eso demuestra que con el zorro todo es posible. Solo es cuestión de tiempo e investigación. 

Saludos.

Hernan Serrano

unread,
Jan 24, 2018, 10:00:03 AM1/24/18
to publice...@googlegroups.com
Compañeros.
El XSD que publique. Genera el XML.
La mejor forma de obtener el XML, es con visual studio.
Hay varios conversores online, pero son malos.

Ahora, el programa que les publique solamente lo tienen que modiicar para utilizar el XML y listo.

<?xml version="1.0" encoding="utf-8"?>
  <Clave>Clave1</Clave>
  <NumeroConsecutivo>NumeroConsecutivo1</NumeroConsecutivo>
  <FechaEmision>1900-01-01T01:01:01-06:00</FechaEmision>
  <Emisor>
    <Nombre>Nombre1</Nombre>
    <Identificacion>
      <Tipo>01</Tipo>
      <Numero>Numero1</Numero>
    </Identificacion>
    <NombreComercial>NombreComercial1</NombreComercial>
    <Ubicacion>
      <Provincia>1</Provincia>
      <Canton>C1</Canton>
      <Distrito>D1</Distrito>
      <Barrio>B1</Barrio>
      <OtrasSenas>OtrasSenas1</OtrasSenas>
    </Ubicacion>
    <Telefono xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true" />
    <Fax xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true" />
    <CorreoElectronico>CorreoElectronico1</CorreoElectronico>
  </Emisor>
  <Receptor>
    <Nombre>Nombre1</Nombre>
    <Identificacion>
      <Tipo>01</Tipo>
      <Numero>Numero1</Numero>
    </Identificacion>
    <IdentificacionExtranjero>IdentificacionExtra1</IdentificacionExtranjero>
    <NombreComercial>NombreComercial1</NombreComercial>
    <Ubicacion>
      <Provincia>1</Provincia>
      <Canton>C1</Canton>
      <Distrito>D1</Distrito>
      <Barrio>B1</Barrio>
      <OtrasSenas>OtrasSenas1</OtrasSenas>
    </Ubicacion>
    <Telefono>
      <CodigoPais>1</CodigoPais>
      <NumTelefono>1</NumTelefono>
    </Telefono>
    <Fax>
      <CodigoPais>1</CodigoPais>
      <NumTelefono>1</NumTelefono>
    </Fax>
    <CorreoElectronico>CorreoElectronico1</CorreoElectronico>
  </Receptor>
  <CondicionVenta>01</CondicionVenta>
  <PlazoCredito>PlazoCred1</PlazoCredito>
  <MedioPago>01</MedioPago>
  <MedioPago>02</MedioPago>
  <MedioPago>03</MedioPago>
  <DetalleServicio>
    <LineaDetalle>
      <NumeroLinea>1</NumeroLinea>
      <Codigo>
        <Tipo>01</Tipo>
        <Codigo>Codigo1</Codigo>
      </Codigo>
      <Codigo>
        <Tipo>02</Tipo>
        <Codigo>Codigo2</Codigo>
      </Codigo>
      <Codigo>
        <Tipo>03</Tipo>
        <Codigo>Codigo3</Codigo>
      </Codigo>
      <Cantidad>1</Cantidad>
      <UnidadMedida>Sp</UnidadMedida>
      <UnidadMedidaComercial>UnidadMedidaComerci1</UnidadMedidaComercial>
      <Detalle>Detalle1</Detalle>
      <PrecioUnitario>0</PrecioUnitario>
      <MontoTotal>0</MontoTotal>
      <MontoDescuento>0</MontoDescuento>
      <NaturalezaDescuento>NaturalezaDescuento1</NaturalezaDescuento>
      <SubTotal>0</SubTotal>
      <Impuesto>
        <Codigo>01</Codigo>
        <Tarifa>1</Tarifa>
        <Monto>0</Monto>
        <Exoneracion>
          <TipoDocumento>01</TipoDocumento>
          <NumeroDocumento>NumeroDocumento1</NumeroDocumento>
          <NombreInstitucion>NombreInstitucion1</NombreInstitucion>
          <FechaEmision>1900-01-01T01:01:01-06:00</FechaEmision>
          <MontoImpuesto>0</MontoImpuesto>
          <PorcentajeCompra>1</PorcentajeCompra>
        </Exoneracion>
      </Impuesto>
      <Impuesto>
        <Codigo>02</Codigo>
        <Tarifa>-99.99</Tarifa>
        <Monto>-10000000000000</Monto>
        <Exoneracion>
          <TipoDocumento>02</TipoDocumento>
          <NumeroDocumento>NumeroDocumento2</NumeroDocumento>
          <NombreInstitucion>NombreInstitucion2</NombreInstitucion>
          <FechaEmision>0001-01-01T00:00:00-06:00</FechaEmision>
          <MontoImpuesto>-10000000000000</MontoImpuesto>
          <PorcentajeCompra>-999</PorcentajeCompra>
        </Exoneracion>
      </Impuesto>
      <Impuesto>
        <Codigo>03</Codigo>
        <Tarifa>99.99</Tarifa>
        <Monto>10000000000000</Monto>
        <Exoneracion>
          <TipoDocumento>03</TipoDocumento>
          <NumeroDocumento>NumeroDocumento3</NumeroDocumento>
          <NombreInstitucion>NombreInstitucion3</NombreInstitucion>
          <FechaEmision>9999-12-31T23:59:59.9999999-06:00</FechaEmision>
          <MontoImpuesto>10000000000000</MontoImpuesto>
          <PorcentajeCompra>999</PorcentajeCompra>
        </Exoneracion>
      </Impuesto>
      <MontoTotalLinea>0</MontoTotalLinea>
    </LineaDetalle>
    <LineaDetalle>
      <NumeroLinea>79228162514264337593543950335</NumeroLinea>
      <Codigo>
        <Tipo>04</Tipo>
        <Codigo>Codigo4</Codigo>
      </Codigo>
      <Codigo>
        <Tipo>99</Tipo>
        <Codigo>Codigo5</Codigo>
      </Codigo>
      <Codigo>
        <Tipo>01</Tipo>
        <Codigo>Codigo6</Codigo>
      </Codigo>
      <Cantidad>-10000000000000</Cantidad>
      <UnidadMedida>m</UnidadMedida>
      <UnidadMedidaComercial>UnidadMedidaComerci2</UnidadMedidaComercial>
      <Detalle>Detalle2</Detalle>
      <PrecioUnitario>-10000000000000</PrecioUnitario>
      <MontoTotal>-10000000000000</MontoTotal>
      <MontoDescuento>-10000000000000</MontoDescuento>
      <NaturalezaDescuento>NaturalezaDescuento2</NaturalezaDescuento>
      <SubTotal>-10000000000000</SubTotal>
      <Impuesto>
        <Codigo>04</Codigo>
        <Tarifa>0.99</Tarifa>
        <Monto>-0.0000000000001</Monto>
        <Exoneracion>
          <TipoDocumento>04</TipoDocumento>
          <NumeroDocumento>NumeroDocumento4</NumeroDocumento>
          <NombreInstitucion>NombreInstitucion4</NombreInstitucion>
          <FechaEmision>1899-11-30T01:01:01-06:00</FechaEmision>
          <MontoImpuesto>-0.0000000000001</MontoImpuesto>
          <PorcentajeCompra>0</PorcentajeCompra>
        </Exoneracion>
      </Impuesto>
      <Impuesto>
        <Codigo>05</Codigo>
        <Tarifa>1.01</Tarifa>
        <Monto>0.0000000000001</Monto>
        <Exoneracion>
          <TipoDocumento>05</TipoDocumento>
          <NumeroDocumento>NumeroDocumento5</NumeroDocumento>
          <NombreInstitucion>NombreInstitucion5</NombreInstitucion>
          <FechaEmision>1900-02-02T01:01:01-06:00</FechaEmision>
          <MontoImpuesto>0.0000000000001</MontoImpuesto>
          <PorcentajeCompra>2</PorcentajeCompra>
        </Exoneracion>
      </Impuesto>
      <Impuesto>
        <Codigo>06</Codigo>
        <Tarifa>-99.98</Tarifa>
        <Monto>-9999999999999.9999999999999</Monto>
        <Exoneracion>
          <TipoDocumento>99</TipoDocumento>
          <NumeroDocumento>NumeroDocumento6</NumeroDocumento>
          <NombreInstitucion>NombreInstitucion6</NombreInstitucion>
          <FechaEmision>0001-02-02T00:00:00-06:00</FechaEmision>
          <MontoImpuesto>-9999999999999.9999999999999</MontoImpuesto>
          <PorcentajeCompra>-998</PorcentajeCompra>
        </Exoneracion>
      </Impuesto>
      <MontoTotalLinea>-10000000000000</MontoTotalLinea>
    </LineaDetalle>
    <LineaDetalle>
      <NumeroLinea>2</NumeroLinea>
      <Codigo>
        <Tipo>02</Tipo>
        <Codigo>Codigo7</Codigo>
      </Codigo>
      <Codigo>
        <Tipo>03</Tipo>
        <Codigo>Codigo8</Codigo>
      </Codigo>
      <Codigo>
        <Tipo>04</Tipo>
        <Codigo>Codigo9</Codigo>
      </Codigo>
      <Cantidad>10000000000000</Cantidad>
      <UnidadMedida>kg</UnidadMedida>
      <UnidadMedidaComercial>UnidadMedidaComerci3</UnidadMedidaComercial>
      <Detalle>Detalle3</Detalle>
      <PrecioUnitario>10000000000000</PrecioUnitario>
      <MontoTotal>10000000000000</MontoTotal>
      <MontoDescuento>10000000000000</MontoDescuento>
      <NaturalezaDescuento>NaturalezaDescuento3</NaturalezaDescuento>
      <SubTotal>10000000000000</SubTotal>
      <Impuesto>
        <Codigo>07</Codigo>
        <Tarifa>99.98</Tarifa>
        <Monto>9999999999999.9999999999999</Monto>
        <Exoneracion>
          <TipoDocumento>01</TipoDocumento>
          <NumeroDocumento>NumeroDocumento7</NumeroDocumento>
          <NombreInstitucion>NombreInstitucion7</NombreInstitucion>
          <FechaEmision>9999-11-29T23:59:59.9999999-06:00</FechaEmision>
          <MontoImpuesto>9999999999999.9999999999999</MontoImpuesto>
          <PorcentajeCompra>998</PorcentajeCompra>
        </Exoneracion>
      </Impuesto>
      <Impuesto>
        <Codigo>08</Codigo>
        <Tarifa>0.98</Tarifa>
        <Monto>-0.0000000000002</Monto>
        <Exoneracion>
          <TipoDocumento>02</TipoDocumento>
          <NumeroDocumento>NumeroDocumento8</NumeroDocumento>
          <NombreInstitucion>NombreInstitucion8</NombreInstitucion>
          <FechaEmision>1899-10-29T01:01:01-06:00</FechaEmision>
          <MontoImpuesto>-0.0000000000002</MontoImpuesto>
          <PorcentajeCompra>-1</PorcentajeCompra>
        </Exoneracion>
      </Impuesto>
      <Impuesto>
        <Codigo>09</Codigo>
        <Tarifa>1.02</Tarifa>
        <Monto>0.0000000000002</Monto>
        <Exoneracion>
          <TipoDocumento>03</TipoDocumento>
          <NumeroDocumento>NumeroDocumento9</NumeroDocumento>
          <NombreInstitucion>NombreInstitucion9</NombreInstitucion>
          <FechaEmision>1900-03-06T01:01:01-06:00</FechaEmision>
          <MontoImpuesto>0.0000000000002</MontoImpuesto>
          <PorcentajeCompra>3</PorcentajeCompra>
        </Exoneracion>
      </Impuesto>
      <MontoTotalLinea>10000000000000</MontoTotalLinea>
    </LineaDetalle>
  </DetalleServicio>
  <ResumenFactura>
    <CodigoMoneda>AED</CodigoMoneda>
    <TipoCambio>0</TipoCambio>
    <TotalServGravados>0</TotalServGravados>
    <TotalServExentos>0</TotalServExentos>
    <TotalMercanciasGravadas>0</TotalMercanciasGravadas>
    <TotalMercanciasExentas>0</TotalMercanciasExentas>
    <TotalGravado>0</TotalGravado>
    <TotalExento>0</TotalExento>
    <TotalVenta>0</TotalVenta>
    <TotalDescuentos>0</TotalDescuentos>
    <TotalVentaNeta>0</TotalVentaNeta>
    <TotalImpuesto>0</TotalImpuesto>
    <TotalComprobante>0</TotalComprobante>
  </ResumenFactura>
  <InformacionReferencia>
    <TipoDoc>01</TipoDoc>
    <Numero>Numero1</Numero>
    <FechaEmision>1900-01-01T01:01:01-06:00</FechaEmision>
    <Codigo>01</Codigo>
    <Razon>Razon1</Razon>
  </InformacionReferencia>
  <InformacionReferencia>
    <TipoDoc>02</TipoDoc>
    <Numero>Numero2</Numero>
    <FechaEmision>0001-01-01T00:00:00-06:00</FechaEmision>
    <Codigo>02</Codigo>
    <Razon>Razon2</Razon>
  </InformacionReferencia>
  <InformacionReferencia>
    <TipoDoc>03</TipoDoc>
    <Numero>Numero3</Numero>
    <FechaEmision>9999-12-31T23:59:59.9999999-06:00</FechaEmision>
    <Codigo>03</Codigo>
    <Razon>Razon3</Razon>
  </InformacionReferencia>
  <Normativa>
    <NumeroResolucion>NumeroResolu1</NumeroResolucion>
    <FechaResolucion>FechaResolucion1</FechaResolucion>
  </Normativa>
  <Otros>
    <OtroTexto codigo="codigo1">OtroTexto1</OtroTexto>
    <OtroTexto codigo="codigo2">OtroTexto2</OtroTexto>
    <OtroTexto codigo="codigo3">OtroTexto3</OtroTexto>
    <OtroContenido codigo="codigo1">
      <any_element xmlns="otherNS">anyType</any_element>
    </OtroContenido>
    <OtroContenido codigo="codigo2">
      <any_element xmlns="otherNS">anyType</any_element>
    </OtroContenido>
    <OtroContenido codigo="codigo3">
      <any_element xmlns="otherNS">anyType</any_element>
    </OtroContenido>
  </Otros>
  <Signature Id="ID1" xmlns="http://www.w3.org/2000/09/xmldsig#">
    <SignedInfo Id="ID2">
      <CanonicalizationMethod Algorithm="http://uri1">text</CanonicalizationMethod>
      <SignatureMethod Algorithm="http://uri1">text<HMACOutputLength>1</HMACOutputLength></SignatureMethod>
      <Reference Id="ID3" URI="http://uri1" Type="http://uri1">
        <Transforms>
          <Transform Algorithm="http://uri1">text<any_element xmlns="otherNS">anyType</any_element><XPath>XPath1</XPath><any_element xmlns="otherNS">anyType</any_element></Transform>
          <Transform Algorithm="http://uri2">text<any_element xmlns="otherNS">anyType</any_element><XPath>XPath2</XPath><any_element xmlns="otherNS">anyType</any_element></Transform>
          <Transform Algorithm="http://uri3">text<any_element xmlns="otherNS">anyType</any_element><XPath>XPath3</XPath><any_element xmlns="otherNS">anyType</any_element></Transform>
        </Transforms>
        <DigestMethod Algorithm="http://uri1">text</DigestMethod>
        <DigestValue>AAECAwQFBgcICQoLDA0ODw==</DigestValue>
      </Reference>
      <Reference Id="ID4" URI="http://uri2" Type="http://uri2">
        <Transforms>
          <Transform Algorithm="http://uri4">text<any_element xmlns="otherNS">anyType</any_element><XPath>XPath4</XPath><any_element xmlns="otherNS">anyType</any_element></Transform>
          <Transform Algorithm="http://uri5">text<any_element xmlns="otherNS">anyType</any_element><XPath>XPath5</XPath><any_element xmlns="otherNS">anyType</any_element></Transform>
          <Transform Algorithm="http://uri6">text<any_element xmlns="otherNS">anyType</any_element><XPath>XPath6</XPath><any_element xmlns="otherNS">anyType</any_element></Transform>
        </Transforms>
        <DigestMethod Algorithm="http://uri2">text</DigestMethod>
        <DigestValue>AAECAwQFBgcICQoLDA0ODw==</DigestValue>
      </Reference>
      <Reference Id="ID5" URI="http://uri3" Type="http://uri3">
        <Transforms>
          <Transform Algorithm="http://uri7">text<any_element xmlns="otherNS">anyType</any_element><XPath>XPath7</XPath><any_element xmlns="otherNS">anyType</any_element></Transform>
          <Transform Algorithm="http://uri8">text<any_element xmlns="otherNS">anyType</any_element><XPath>XPath8</XPath><any_element xmlns="otherNS">anyType</any_element></Transform>
          <Transform Algorithm="http://uri9">text<any_element xmlns="otherNS">anyType</any_element><XPath>XPath9</XPath><any_element xmlns="otherNS">anyType</any_element></Transform>
        </Transforms>
        <DigestMethod Algorithm="http://uri3">text</DigestMethod>
        <DigestValue>AAECAwQFBgcICQoLDA0ODw==</DigestValue>
      </Reference>
    </SignedInfo>
    <SignatureValue Id="ID6">AAECAwQFBgcICQoLDA0ODw==</SignatureValue>
    <KeyInfo Id="ID7">text<KeyName>KeyName1</KeyName><KeyValue>text<DSAKeyValue><P>AAECAwQFBgcICQoLDA0ODw==</P><Q>AAECAwQFBgcICQoLDA0ODw==</Q><G>AAECAwQFBgcICQoLDA0ODw==</G><Y>AAECAwQFBgcICQoLDA0ODw==</Y><J>AAECAwQFBgcICQoLDA0ODw==</J><Seed>AAECAwQFBgcICQoLDA0ODw==</Seed><PgenCounter>AAECAwQFBgcICQoLDA0ODw==</PgenCounter></DSAKeyValue></KeyValue><RetrievalMethod URI="http://uri1" Type="http://uri1" /></KeyInfo>
    <Object Id="ID8" MimeType="MimeType1" Encoding="http://uri1">text<any_element xmlns="https://tribunet.hacienda.go.cr/docs/esquemas/2017/v4.2/facturaElectronica">anyType</any_element><any_element xmlns="https://tribunet.hacienda.go.cr/docs/esquemas/2017/v4.2/facturaElectronica">anyType</any_element><any_element xmlns="https://tribunet.hacienda.go.cr/docs/esquemas/2017/v4.2/facturaElectronica">anyType</any_element></Object>
    <Object Id="ID9" MimeType="MimeType2" Encoding="http://uri2">text<any_element xmlns="https://tribunet.hacienda.go.cr/docs/esquemas/2017/v4.2/facturaElectronica">anyType</any_element><any_element xmlns="https://tribunet.hacienda.go.cr/docs/esquemas/2017/v4.2/facturaElectronica">anyType</any_element><any_element xmlns="https://tribunet.hacienda.go.cr/docs/esquemas/2017/v4.2/facturaElectronica">anyType</any_element></Object>
    <Object Id="ID10" MimeType="MimeType3" Encoding="http://uri3">text<any_element xmlns="https://tribunet.hacienda.go.cr/docs/esquemas/2017/v4.2/facturaElectronica">anyType</any_element><any_element xmlns="https://tribunet.hacienda.go.cr/docs/esquemas/2017/v4.2/facturaElectronica">anyType</any_element><any_element xmlns="https://tribunet.hacienda.go.cr/docs/esquemas/2017/v4.2/facturaElectronica">anyType</any_element></Object>
  </Signature>
</FacturaElectronica>
    …
Ese es el xml generado con Visual Studio. Es el de la factura.
Compañeros. Ya consequi un proyecto funcional para la firma del XML. Esta probado, creo que la biblioteca que anda por ahi. No es funcional.
 Este es el link.
Para bajar el proyecto esta en c sharp

Hernan Serrano

unread,
Jan 24, 2018, 10:15:05 AM1/24/18
to publice...@googlegroups.com
Tienes un ejemplo del codigo. Que puedas compartir.

El 24 de enero de 2018, 8:01, Gregorik Domador <gregori...@gmail.com> escribió:
Saludos Jose Carlos, te informo que ya logre realizar la firma enteramente desde FoxPro usando OpenSSL.exe para calcular los digest y el signature value, te agradezco inmensamente tu ayuda, tu ejemplo me ayudo a darme cuenta que el formato de firma que utilizaba estaba incorrecto y a partir de la firma correcta que se genera con tu libreria logre reproducir la mía tal cual y listo, eso era lo que me faltaba, definitivamente si hubiese tenido el formato de firma correcta esto hubiese estado listo desde hace mas de un mes, pero finalmente gracias a ti lo logré, te repito, inmensamente agradecido.



Hernan Serrano

unread,
Jan 24, 2018, 10:45:51 AM1/24/18
to publice...@googlegroups.com
Otra pregunta Gregorik. Ya enviastes los documentos al site de pruebas de Tributacion y te dieron el visto bueno.

"Una vez firmado el documento no se puede agregar nada más al mismo porque genera espacios en blanco, hay que firmarlo, encriptarlo y enviarlo de una vez"
Esto es lo que me recomiendan unos amigos que ya lo han logrado.

Gregorik Domador

unread,
Jan 24, 2018, 12:32:24 PM1/24/18
to Comunidad de Visual Foxpro en Español
Si, ya obtengo status de "Accepted" y el xml de respuesta firmado por hacienda.

Oscar Melendez

unread,
Jan 24, 2018, 12:36:11 PM1/24/18
to publice...@googlegroups.com

Gregorik Domador podes compartirlo??

Gregorik Domador

unread,
Jan 24, 2018, 12:53:20 PM1/24/18
to Comunidad de Visual Foxpro en Español
Mmmmm, dejame ver las implicaciones del caso, porque trabajo para una casa de software y ellos tienen el derecho de autor sobre todo lo que hago, podria verme yo en un problema por compartir ese codigo publicamente ya que dentro del mismo tambien se usan rutinas que no fueron echas por mi y que son propiedad tambien de la empresa, es decir cosas echas por otros programadores de la empresa a lo largo de los años.

Oscar Melendez

unread,
Jan 24, 2018, 1:01:16 PM1/24/18
to publice...@googlegroups.com
yo lo que ocupo practicamente es el envio del xml y la respuesta del servidor lo demas me las puedo apañar

Hernan Serrano

unread,
Jan 24, 2018, 1:25:06 PM1/24/18
to publice...@googlegroups.com
Yo termino lo del xml. Y estoy trabajando con el envio a hacienda. Esta semana espero este listo.

Voy a apurar el paso..

Hernan Serrano

unread,
Jan 24, 2018, 1:26:02 PM1/24/18
to publice...@googlegroups.com
Gregorik, entiendo las implicaciones del caso. Tranquilo. Pero es bueno saber que desde Fox, Todo se puede.


Gregorik Domador

unread,
Jan 24, 2018, 1:46:57 PM1/24/18
to Comunidad de Visual Foxpro en Español
Te puedo colaborar con esto, pero es solo un granito de arena de todo lo que hay que hacer, supongo que ya tienen token, clave y xml, listo al igual que una funcion que te arme el json del request, en fin son tantas cosas...

    **Función que ejecuta y consume el servicio del API
    *---------------------------------------------------------
    Function EjecutaAPI(pTipoRequest, pRequest, pAuthorization, pBody)
        *pTipoRequest   : Token=1,Recepcion=2,Recepcion/Clave=3,Comprobantes=4,Comprobantes/Clave=5
        *pRequest        : Se recibe por referencia el objeto HTTP que se obtuvo en CreaRequest
        *pAuthorization    : El token obtenido con la funcion BuscaToken, solo cuando aplica.
        *pBody             : El contenido a enviar en el cuerpo del Request
        Try
            pRequest.setRequestHeader("cache-control", "private")
            If !Empty(pAuthorization)
                pRequest.setRequestHeader("Authorization", "bearer " + pAuthorization)
            Endif
            pRequest.Send(pBody)
            This.iStatus = pRequest.Status
        Catch To loErr
            * --- Si entra aqui es porque el error fue de conectividad a internet, no un error del webservice ---
            This.iStatus = -1
        Endtry
        Do Case
            Case This.iStatus = 200 Or (pTipoRequest = 2 And This.iStatus = 201)
                &&Estos 2 códigos (200,201) implican la aceptación y respuesta correcta del request
                This.sResponse = Strtran(Alltrim(pRequest.responseText), "'", "")
                Return .T.
            Case pTipoRequest = 2 And This.iStatus = 202
                &&Este código (202) implica la aceptación de la recepción pero el fallo en el procesamiento del mismo
                &&los detalles del error deben ser obtenidos mediante el método Recepcion/Clave
                This.sResponse = Strtran(Alltrim(pRequest.responseText), "'", "")
                If Empty(This.sResponse)
                    This.sResponse = Alltrim(pRequest.StatusText)
                Endif
                Return .T.
            Case This.iStatus = -1
                This.sError  = "Error: " + Transform(loErr.ErrorNo,"9999999999") + This.CRLF +  "Mensaje: " + loErr.Message
                Return .F.
            Otherwise
                If Inlist(This.iRequestType, 3, 5) And This.iStatus = 404
                    &&NO ocurrio un error, sino que NO se encontró la recepcion/comprobante solicitado
                    This.sResponse  = Str(This.iStatus,3,0) + " " + Alltrim(pRequest.StatusText) + This.CRLF + pRequest.getResponseHeader("X-Error-Cause") + This.CRLF + pRequest.responseText
                    Return .T.
                Else
                    This.sResponse  = Str(This.iStatus,3,0) + " " + Alltrim(pRequest.StatusText) + This.CRLF + pRequest.getResponseHeader("X-Error-Cause") + This.CRLF + pRequest.responseText
                    If "recibido anteriormente"$This.sResponse
                        Return .T.
                    Else
                        Return .F.
                    Endif
                Endif
        Endcase
    Endfunc

    **Función que crea el Request para la API
    *----------------------------------------------------------
    Function CreaRequest(pTipoRequest, pClave)
        ** pTipoRequest: Define el tipo de Request que puedo crear
        **                1: Token
        **                2: Recepcion
        **                3: Recepcion/Clave
        **                4: Comprobantes
        **                5: Comprobantes/Clave
        ** pClave       : Clave del Documento a consultar (Solo para el Request tipo 3 y 5)
        This.iRequestType = pTipoRequest
        Try
            oAPIRequest = Createobject('Msxml2.ServerXMLHTTP.6.0')
            Do Case
                Case pTipoRequest = 1 &&Token
                    oAPIRequest.Open("POST", This.sURL_Token, .F.)
                    oAPIRequest.setRequestHeader("content-type", "application/x-www-form-urlencoded")
                Case pTipoRequest = 2 &&Recepcion
                    oAPIRequest.Open("POST", This.sURL_API + "/recepcion", .F.)
                    oAPIRequest.setRequestHeader("Content-Type", "application/json")
                Case pTipoRequest = 3 &&Recepcion/Clave
                    oAPIRequest.Open("GET", This.sURL_API + "/recepcion/" + pClave, .F.)
                    oAPIRequest.setRequestHeader("Content-Type", "application/json")
                Case pTipoRequest = 4 &&Comprobantes
                    oAPIRequest.Open("GET", This.sURL_API + "/comprobantes", .F.)
                    oAPIRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
                Case pTipoRequest = 5 &&Comprobantes/Clave
                    oAPIRequest.Open("GET", This.sURL_API + "/comprobantes/" + pClave + "", .F.)
                    oAPIRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
                Otherwise
                    This.sError = "Error: No es posible crear el request tipo " + Str(pTipoRequest, 1, 0)
                    This.iStatus = -1
                    oAPIRequest = Null
            Endcase
        Catch To loErr
            This.sError = "Error: " + Transform(loErr.ErrorNo,"9999999999") + This.CRLF +  "Mensaje: " + loErr.Message
            This.iStatus = -1
            oAPIRequest = Null
        Endtry
        Return oAPIRequest
    Endfunc
    *---------------------------------------------------


Las referencias a "THIS" son porque estos metodos estan dentro de una clase, bastante extensa, como te dije son muchas cosas por ahcer.

Hernan Serrano

unread,
Jan 24, 2018, 2:06:11 PM1/24/18
to publice...@googlegroups.com
Correcto, hay que revisar el armado del XML.
Que debe estar listo para enviarse.
Ya la conexion con tributacion no hay problema. Ya lo logramos, de hecho hasta el refresh token se puede hacer.
La firma digital, ya nos proporcionaron una libreria que lo hace.
Si puedes colaborar con el armado del JSON, para enviar a Hacienda el XML, eso no seria un granito de Arena, seria un meteorito, compañero.

Si puedes ayudar con eso seria genial...

Gracias de ante mano.

Pd:
Estoy trabajando con la firma en VFP, pero por razones de tiempo por ahora utilizaremos las librerias de C Sharp. Pero despues publicare. Si lo logro como firmar con VFP.

Gregorik Domador

unread,
Jan 24, 2018, 2:22:04 PM1/24/18
to Comunidad de Visual Foxpro en Español
Ahi va el Meteorito...

**Función que arma el JSon que irá incluido en el cuerpo del request.
    *--------------------------------------------------------------------
    Function GenerarJSonRecepcion(pTipoDoc, pNumDoc, pClave)
        Local sJSon, sXML
        sJSon = ""
        If !Eof('tmpCursor')
            sJSon  = [{"clave": "] + pClave + [",] + This.LF
            sJSon  = sJSon + ["fecha": "] + Str(Year(Date()),4,0) + "-" + Padl(Alltrim(Str(Month(Date()),2,0)),2,"0") + "-" + Padl(Alltrim(Str(Day(Date()),2,0)),2,"0") + "T" + Time() + [Z",] + This.LF
            sJSon  = sJSon + ["emisor": {"tipoIdentificacion": "] + Padl(Alltrim(Transform(tmpCursor.tipoid,"99")),2,"0") + [",] + This.LF&&Cédula Física=01,Cédula Jurídica=02,DIMEX=03,NITE=04
            tmpNumID = ""
            Do Case
                Case tmpCursor.tipoid = 1 &&Cédula Física
                    tmpNumID = Substr(Alltrim(tmpEmisorCfg.nrofiscal1),1,9)
                Case tmpCursor.tipoid = 2 Or tmpCursor.tipoid  = 4 &&Cédula Jurídica o NITE
                    tmpNumID = Padl(Substr(Alltrim(tmpEmisorCfg.nrofiscal1),1,10),10,"0")
                Case tmpCursor.tipoid = 3 &&DIMEX
                    tmpNumID = Substr(Alltrim(tmpEmisorCfg.nrofiscal1),1,12)
            Endcase
            sJSon = sJSon + ["numeroIdentificacion": "] + tmpNumID + ["},] + This.LF
            sJSon = sJSon + ["receptor": {"tipoIdentificacion": "] + Padl(Alltrim(Transform(tmpCursor.tipoid,"99")),2,"0") + [",] + This.LF&&Cédula Física=01,Cédula Jurídica=02,DIMEX=03,NITE=04
            tmpNumID = ""
            Do Case
                Case tmpCursor.tipoid = 1 &&Cédula Física
                    tmpNumID = Substr(Alltrim(tmpCursor.cedula),1,9)
                    If Empty(tmpNumID)
                        tmpNumID = Substr(Alltrim(tmpCursor.rif),1,9)
                    Endif
                Case tmpCursor.tipoid = 2 &&Cédula Jurídica
                    tmpNumID = Padl(Substr(Alltrim(tmpCursor.cedula),1,10),10,"0")
                    If Empty(tmpNumID)
                        tmpNumID = Substr(Alltrim(tmpCursor.rif),1,9)
                    Endif
                Case tmpCursor.tipoid = 3 &&DIMEX
                    tmpNumID = Substr(Alltrim(tmpCursor.rif),1,12)
                Case tmpCursor.tipoid = 4 &&NITE
                    tmpNumID = Padl(Substr(Alltrim(tmpCursor.rif),1,10),10,"0")
                Otherwise
                    tmpNumID = Substr(Alltrim(tmpCursor.cedula),1,9)
                    If Empty(tmpNumID)
                        tmpNumID = Substr(Alltrim(tmpCursor.rif),1,9)
                    Endif
            Endcase
            sJSon = sJSon + ["numeroIdentificacion": "] + tmpNumID + ["},] + This.LF
            sXML  = This.GenerarXMLRecepcion(pTipoDoc, pNumDoc, pClave)
            sXML  = Strtran(This.EncodeStringBase64(sXML), Chr(0), "")
            sJSon = sJSon + ["comprobanteXml": "] + sXML + ["}]
        Endif
        Return sJSon
    Endfunc
    *--------------------------------------------------------------------------------------------------------

Gregorik Domador

unread,
Jan 24, 2018, 2:38:43 PM1/24/18
to Comunidad de Visual Foxpro en Español
Alguien podria proporcionarme un XML valido que contenga el nodo <Referencia>, el que se usa para Notas de Debito y Credito.
Si incluyen tambien el XML de la factura original a la afecta seria super fenomenal.

Oscar Melendez

unread,
Jan 24, 2018, 2:40:59 PM1/24/18
to publice...@googlegroups.com
Este lo paso un compañero del foro vea a ver si le sirve
sinfirna.xml

Hernan Serrano

unread,
Jan 24, 2018, 2:45:03 PM1/24/18
to publice...@googlegroups.com
Gracias compañero por el meteorito.

En la noche veo el tema de los xml, y te envio alguno que te pueda servir.

Gregorik Domador

unread,
Jan 24, 2018, 3:03:17 PM1/24/18
to Comunidad de Visual Foxpro en Español
Gracias por el XML, pero no tiene el nodo <Referencia>, necesito el XML de Nota de Credito o Debito, el nodo Referencia va entre <ResumenFactura> y <Normativa>

Hernan Serrano

unread,
Jan 27, 2018, 9:00:34 AM1/27/18
to publice...@googlegroups.com
Te adjunto el codigo de creacion encriptacion y firmado del .xml.
Ya estoy haciendo pruebas de envio a Hacienda.

Pd:
Nodo referencia. Solo que en blanco.
crear factura electronica 4.2a.prg

Jose Carlos Aguilar

unread,
Jan 27, 2018, 10:37:42 AM1/27/18
to Comunidad de Visual Foxpro en Español
Para aquellos que estén interesados en la firma para costa rica en PHP puro sin librerias de terceros, me escriben en Privado.
Saludos

Hernan Serrano

unread,
Jan 28, 2018, 9:34:06 PM1/28/18
to publice...@googlegroups.com
Podrias enviarme el codigo. Me interesa aprender php.

ATTe
Gracias

Hernan Serrano

unread,
Jan 28, 2018, 9:44:05 PM1/28/18
to publice...@googlegroups.com
Gregorik, podrias indicarme si no es mucha molestia.
El orden en que se hace el proceso del tu sistema: Ejemplo. Creacion API, parametros api, creacion xml, encriptación xml. etc.
Para saber que orden utilizan ustedes.
Lo otro, cuales son los paramentros que utilizan para el envio del comprobante: Yo tengo
oHTTP = CREATEOBJECT('Msxml2.ServerXMLHTTP.6.0')
oHTTP.OPEN(cMETHOD, cURL, .F.)
oHTTP.setRequestHeader ("Authorization", "Bearer " + cPARAM1)
*SE ENVIA EL JSON
oHTTP.SEND(cDATA)

En donde cMethod = 'POST', cURL (el de hacienda /recepcion), cParam1='token', cData (Json)
Por favor me podrias indicar si esto esta bien.

ATTE
Hernan Serrano M



El 24 de enero de 2018, 13:38, Gregorik Domador <gregori...@gmail.com> escribió:
Alguien podria proporcionarme un XML valido que contenga el nodo <Referencia>, el que se usa para Notas de Debito y Credito.
Si incluyen tambien el XML de la factura original a la afecta seria super fenomenal.

Hernan Serrano

unread,
Jan 28, 2018, 10:48:49 PM1/28/18
to publice...@googlegroups.com

Compañeros, ya logre el envio a Tributacion.
Excepto que no me devuelve error. (Creo que es aceptacion.)
Apenas depure el codigo lo comparto.

ATTE
Hernan

Hernan Serrano

unread,
Jan 29, 2018, 8:27:53 AM1/29/18
to publice...@googlegroups.com
El JSON, devuelto trae el mensaje. En este caso rechazado. Pero ahora hay que revisar para ver por que no lo esta aceptando. Tarea para hoy.

El 28 de enero de 2018, 21:48, Hernan Serrano <hernan.serr...@gmail.com> escribió:

Compañeros, ya logre el envio a Tributacion.
Excepto que no me devuelve error. (Creo que es aceptacion.)
Apenas depure el codigo lo comparto.

ATTE
Hernan

Eduardo Venegas

unread,
Jan 31, 2018, 3:18:02 PM1/31/18
to Comunidad de Visual Foxpro en Español
Tengo una duda, sigo los pasos que indicas en este doc, pero aun así me da [La firma del comprobante electrónico no es válida]
Por que podria ser el problema?

Jose Carlos Aguilar

unread,
Jan 31, 2018, 3:46:31 PM1/31/18
to Comunidad de Visual Foxpro en Español
Enviar archivo sin firma y firmado para analizar.

Diego Varela

unread,
Feb 1, 2018, 5:15:49 PM2/1/18
to Comunidad de Visual Foxpro en Español
Jose Carlos Aguilar

En esta sección del código:

parametros.SignaturePolicyInfo.PolicyIdentifier = "https://tribunet.hacienda.go.cr/docs/esquemas/2016/v4/Resolucion%20Comprobantes%20Electronicos%20%20DGT-R-48-2016.pdf";             parametros.SignaturePolicyInfo.PolicyHash = "V8lVVNGDCPen6VELRD1Ja8HARFk="; 

En la propiedad PolicyIdentifier deseo poner la url del documento de resolución vigente, creo que la propiedad PolicyHash también cambiaría, de hecho hice la prueba y el API de hacienda me retorna el mensaje de que la firma no es válida... Al reversar el cambio y poner los valores "originales" ahí si me lo recibe el api de hacienda.

La pregunta mía principalmente es que deseo entender cual es la importancia o reelevacia de los valores de estas 2 propiedades PolicyIdentifier y PolicyHash. Además deseo saber si es verdaderamente posible cambiar el valor de esos atributos.

Saludos

Jose Carlos Aguilar

unread,
Feb 1, 2018, 5:23:45 PM2/1/18
to Comunidad de Visual Foxpro en Español
PolicyHasch es el valor en sha1 (tambien podria ser sha2) y base64 del archivo pdf en cuestion, por supuesto si la entidad cambia las politicas de firma ese valor cambiarian. 
Además por eso publique el código para que en caso cambie uds puedan recompilar la solucion.
Saludos

Diego Varela

unread,
Feb 1, 2018, 5:33:35 PM2/1/18
to Comunidad de Visual Foxpro en Español
Jose Carlos Aguilar:

Usted dice: "es el valor en sha1 (tambien podria ser sha2) y base64 del archivo pdf en cuestion".

Como puedo generar el sha1 del pdf v4.2? es que deseo entender esta parte creo que es de lo más importante para poder darle mantenimiento a la solución a lo largo del tiempo.

Jose Carlos Aguilar

unread,
Feb 2, 2018, 9:18:33 AM2/2/18
to Comunidad de Visual Foxpro en Español
Bueno, aquellos que les interesa en PHP, comparti en el grupo de whatsapp CRlibre , el codigo en PHP puro,  en ese grupo se las compartiran de seguro.
Suerte   y saludos, espero haber contribuido en algo con Uds.

Michael Bianchini

unread,
Feb 2, 2018, 2:22:21 PM2/2/18
to Comunidad de Visual Foxpro en Español

Gracias, me encantaría recibir el código pero no pertenezco al grupo de Whatsapp (el número de TicoSupport no funciona).  Si tuvieras otra forma de pasarlo? Pura Vida!

Hernan Serrano

unread,
Feb 2, 2018, 2:44:43 PM2/2/18
to publice...@googlegroups.com
Cual es tu numero. Yo he pasado el codigo por todos los hilos de FActuracion electrónica.

Hernan Serrano

unread,
Feb 2, 2018, 2:47:17 PM2/2/18
to publice...@googlegroups.com
Diego Varela. A voz ya te esta aceptando los documentos hacienda. O te los esta rechazando.

Si te los esta aceptando. Me podrias brindar un XML, de los que te acepta para poder compararlo con los mios.

Hernan Serrano

unread,
Feb 3, 2018, 8:39:23 AM2/3/18
to publice...@googlegroups.com
Imágenes integradas 1

Ya logre enviar los documentos a hacienda, comuniquense conmigo, para enviar los detalles del logro. Lo unico que les solicito es una colaboracion por estar en este proyecto las cuentas se me juntaron.

Hernan Serrano

unread,
Feb 3, 2018, 8:41:36 AM2/3/18
to publice...@googlegroups.com
Imágenes integradas 1

El 3 de febrero de 2018, 7:39, Hernan Serrano <hernan.serr...@gmail.com> escribió:
Imágenes integradas 1

Ya logre enviar los documentos a hacienda, comuniquense conmigo, para enviar los detalles del logro. Lo unico que les solicito es una colaboracion por estar en este proyecto las cuentas se me juntaron.

El 2 de febrero de 2018, 13:47, Hernan Serrano <hernan.serrano.morales@gmail.com> escribió:
Diego Varela. A voz ya te esta aceptando los documentos hacienda. O te los esta rechazando.

Si te los esta aceptando. Me podrias brindar un XML, de los que te acepta para poder compararlo con los mios.

El 1 de febrero de 2018, 16:33, Diego Varela <dvare...@gmail.com> escribió:
Jose Carlos Aguilar:

Usted dice: "es el valor en sha1 (tambien podria ser sha2) y base64 del archivo pdf en cuestion".

Como puedo generar el sha1 del pdf v4.2? es que deseo entender esta parte creo que es de lo más importante para poder darle mantenimiento a la solución a lo largo del tiempo.



--
Tico Support S. A.
Tel. (506)8772-6170



--
Tico Support S. A.
Tel. (506)8772-6170



--
Tico Support S. A.
Tel. (506)8819-4369

Greivin Guevara

unread,
Feb 4, 2018, 5:30:47 PM2/4/18
to Comunidad de Visual Foxpro en Español
Usando este metodo, me responden desde hacienda que esta invalida la firma. Alguien la ha usado y ha logrado hacer que funcione? Muchisimas gracias si alguien me puede ayudar
            parametros.SignaturePolicyInfo.PolicyIdentifier = "https://tribunet.hacienda.go.cr/docs/esquemas/2016/v4/Resolucion%20Comprobantes%20Electronicos%20%20DGT-R-48-2016.pdf";             parametros.SignaturePolicyInfo.PolicyHash = "V8lVVNGDCPen6VELRD1Ja8HARFk="; 
            parametros.SignaturePolicyInfo.PolicyUri = "";

            parametros.SignatureMethod = SignatureMethod.RSAwithSHA256;
            parametros.SigningDate =new DateTime ? (DateTime.Now);
            parametros.SignaturePackaging = SignaturePackaging.ENVELOPED;

            string cnomcert = crutanombreCertificado; 
            X509Certificate2 MontCertificat = new X509Certificate2(cnomcert, cClavecertificado);
            using (parametros.Signer = new Signer(MontCertificat))
            {
                using (FileStream fs = new FileStream(ficheroFactura, FileMode.Open))
                {
                    var docFirmado = xadesService.Sign(fs, parametros);
                    docFirmado.Save(CRUTASALIDA + XMLFILESALIDA);
                    rRRpta = "OK - Archivo firmado correctamente por JCAguilar- jcagu...@gmail.com";
                 }
            }
            return rRRpta;
        }
    }
}

Hernan Serrano

unread,
Feb 4, 2018, 10:10:06 PM2/4/18
to publice...@googlegroups.com
Es el que utilizo. Y a mi me lo acepta perfectamente. El certificado estara bien. Por que no lo vuelves a bajar.

Greivin Guevara

unread,
Feb 5, 2018, 9:57:26 PM2/5/18
to Comunidad de Visual Foxpro en Español
Ya lo probé y no, esta raro, hay alguna posibilidad de que la conversión en base64 produzca un error en la firma?

Hernan Serrano

unread,
Feb 6, 2018, 9:00:12 AM2/6/18
to publice...@googlegroups.com
Correcto. Si envias caracteres de mas. Eso invalida la firma.

Ronald Chacon

unread,
Feb 23, 2018, 11:51:13 AM2/23/18
to Comunidad de Visual Foxpro en Español

Buenas amigo, yo estoy desarrollando  el sistema de factura electronica en .net, ya pude realizar envio del json, al consultar el estado me devuelve rechazado. No se ud o ustedes saben de cuales son os motivos del xq devuelve el estado rechazado, muchas gracias

El sábado, 3 de febrero de 2018, 7:41:36 (UTC-6), Hernan Serrano escribió:
Imágenes integradas 1

El 3 de febrero de 2018, 7:39, Hernan Serrano <hernan.serr...@gmail.com> escribió:
Imágenes integradas 1

Ya logre enviar los documentos a hacienda, comuniquense conmigo, para enviar los detalles del logro. Lo unico que les solicito es una colaboracion por estar en este proyecto las cuentas se me juntaron.

El 2 de febrero de 2018, 13:47, Hernan Serrano <hernan.serr...@gmail.com> escribió:
Diego Varela. A voz ya te esta aceptando los documentos hacienda. O te los esta rechazando.

Si te los esta aceptando. Me podrias brindar un XML, de los que te acepta para poder compararlo con los mios.

El 1 de febrero de 2018, 16:33, Diego Varela <dvare...@gmail.com> escribió:
Jose Carlos Aguilar:

Usted dice: "es el valor en sha1 (tambien podria ser sha2) y base64 del archivo pdf en cuestion".

Como puedo generar el sha1 del pdf v4.2? es que deseo entender esta parte creo que es de lo más importante para poder darle mantenimiento a la solución a lo largo del tiempo.



--
Tico Support S. A.
Tel. (506)8772-6170



--
Tico Support S. A.
Tel. (506)8772-6170

Hernan Serrano

unread,
Feb 23, 2018, 11:53:32 AM2/23/18
to publice...@googlegroups.com
Tienes que hacer la consulta. En modo consulta. Te devuelve el json. En la repsuesta viene un atributo que es el xml en base 64 con los errores que tienes. Debes decodificar y ver que errores te arroja el xml.

Diego Varela

unread,
Feb 23, 2018, 11:54:30 AM2/23/18
to publice...@googlegroups.com
Hola yo pude arreglarlo agregando las anotaciones faltantes al xml. Se las puedo indicar.... Me avisan...

Ronald Chacon

unread,
Feb 23, 2018, 11:56:05 AM2/23/18
to Comunidad de Visual Foxpro en Español
Gracias amigo vamos a revisar ese punto.

Hernan Serrano

unread,
Feb 23, 2018, 11:56:48 AM2/23/18
to publice...@googlegroups.com
Compañeros. Recuerden que antes de ofrecer pescado. Hay que enseñarle a la gente a pescar.

Yo puedo hacerle todo el trabajo al compañero. Pero la idea es que en el proceso aprendan todos los pormenores para que si les piden luego una asesoria. Con propiedad puedan ofrecerla y cobrar obviamente por ella.

Greivin Guevara

unread,
Feb 23, 2018, 12:06:22 PM2/23/18
to Comunidad de Visual Foxpro en Español
Ya logré enviar y todo, la factura esta bien, solo que solo obtengo estado de recibido.

Hernan Serrano

unread,
Feb 23, 2018, 12:08:25 PM2/23/18
to publice...@googlegroups.com
Hay dos procesos. Envio del documento como tal.

Y luego tenemos que hacer un proceso de consulta.
Cuando consultamos. El sistema de tributación devuelve un JSON. En ese json, nos devuelven un xml cifrado en Base 64. Ese JSON hay que descifrarlo. Y ahi estan los errores que el sistema te esta indicando.

Diego Varela

unread,
Feb 23, 2018, 12:15:57 PM2/23/18
to publice...@googlegroups.com
Esto es lo de las anotaciones en el xml
Ojo yo estoy usando la version 4.1
20180223_105905.jpg

Hernan Serrano

unread,
Feb 23, 2018, 12:44:47 PM2/23/18
to publice...@googlegroups.com
Nuevamente compañero. Creo que todas las versiones es asi:
1. Envio de documento a Hacienda. (Casi siempre es status es aceptado.)
2. Consulta del Estado del Documento (En este caso: Aceptado, Rechazado)
    Si es rechazado. El sistema de tributación te envia un JSON en la respuesta.

El 23 de febrero de 2018, 11:15, Diego Varela <dvare...@gmail.com> escribió:
Esto es lo de las anotaciones en el xml
Ojo yo estoy usando la version 4.1

Diego Varela

unread,
Feb 25, 2018, 3:30:58 PM2/25/18
to publice...@googlegroups.com
Claro el problema es asi, el xml que uno convierte en base64 debe llevar unas anotaciones de los esquemas del elemento FacturaElectronica y del elemento Signature.

El tema es que estoy el 99% seguro que el webservice de hacienda ocupa que el xml llevar esas anotaciones para poder decodificarlo y procesarlo...

En la foto que adjunté se denota pero eso es en csharp, le voy a mostrar a continuación como es que tiene que queda el xml (4.1) configurado en el elemento root FacturaElectronica.


Nótese el namespace xmlns:ds y el attributo xsi:schemaLocatiom y en este último ponga atención al formato del valor: primero una url(solo para namespace declaration) y luego la url con la ubicacion del fichero xsd.
Eso fue lo que yo tuve que agregar para eliminar el error de firma digital invalida. Otro detalle; vea que estoy usando la version 4.1, entonces, en teoria con la version 4.2 seria exactamente igual.

El namespace xmlns:ds es para el Elemento Signature
El attribute xsi:schemaLocation es para el elemento principal o root FacturaElectronica.


Lo importante creo yo es salir de la bronca de ese mensaje de firma no valida, ya el resto son fixes de datos...

Haga usted mismo la prueba y me informa como le fue.

Saludos y mucha suerte a todos.

Hernan Serrano

unread,
Apr 10, 2018, 9:55:49 AM4/10/18
to Comunidad de Visual Foxpro en Español
Buenos dias Jose.
Tal vez me puedes orientar. Estoy haciendo la firma en C sharp. Pero a  la hora de compilar el proyecto me da el siguiente warning. Y como quiero hacer una dll. Eso me da problemas por que la dll no funciona el warning es el siguiente:
No se puede cargar el archivo de ensamblado Microsoft.Xades Version= 1.0.5.0 Culture=neutral Public key token = null ni una de sus dependencias. Se necesita un ensamblado con nombre seguro.

Daniel Ramos Mora

unread,
Jun 8, 2018, 9:06:16 PM6/8/18
to Comunidad de Visual Foxpro en Español
Primero felicitarlo y agradecerle Jose, me funcionó perfecto. Una consulta, si por algún motivo Hacienda cambia algo vos actualizarias el dll y nos informarías?

Saludos Cordiales,

El martes, 16 de enero de 2018, 7:11:54 (UTC-6), jose carlos aguilar escribió:
Les adjunto una librería para el firmado electrónico de facturas en Costa Rica acorde a lo que pide Hacienda.

Primero registrar la libreria luego ejecutar desde Foxpro de la sgt manera:
 ol = CREATEOBJECT("firmadoxadescr")

MESSAGEBOX(ol.FirmarXAdes("E:\Ivancr\", ;
                           "xml_sinfirma.xml",;
                           "E:\IvanCr\" , ;
                           "firmadocr.xml","E:\IvanCr\certificado.p12","clacecertificado"))

Espero les sea de utilidad.

Saludos

Hendell Mora

unread,
Jun 8, 2018, 9:16:33 PM6/8/18
to publice...@googlegroups.com
Podrias reenviar la dll.


Hendell

Daniel Ramos Mora

unread,
Jun 8, 2018, 9:21:58 PM6/8/18
to publice...@googlegroups.com
Lo puso Jose al principio de la cola

monica....@gmail.com

unread,
Jul 26, 2018, 7:52:25 PM7/26/18
to Comunidad de Visual Foxpro en Español
Hola, a donde puedo ver el codigo de esa libreria?

Hernan Serrano

unread,
Jul 27, 2018, 10:29:06 AM7/27/18
to publice...@googlegroups.com
Esa libreria es el aporte de uno de nuestros compañeros. Por favor si puedes poner los creditos eso seria genial. 

Por que suena a que te estas acreditando el aporte.....
--
Tico Support S. A.
Tel. (506)8819-4369

Monica Escrich

unread,
Jul 27, 2018, 10:47:41 AM7/27/18
to publice...@googlegroups.com
por supuesto pongo los creditos si la utilizo, no te preocupes

rodolfolopezp

unread,
Oct 23, 2018, 3:48:21 AM10/23/18
to Comunidad de Visual Foxpro en Español


Hola, e acabo de unir a la factura digital y estuve viendo sus conversaciones.
   Yo estoy en C#, utilizo la DLL FIRMADOCR, cn la cual firmo el XML.
   Pero hasta el momento me dice firma invalida .
   Yo pongo el código como usted en este apartado, y me lo firma, es eso únicamente lo que se debe hacer?. La DLL la conveirte a base 64 de una vez o hay que            hacerlo uno mismo?

    Gracias
 
Saludos

Diego Varela

unread,
Oct 23, 2018, 1:20:16 PM10/23/18
to publice...@googlegroups.com
Le recomiendo este sitio web


Ahi puede subir el XML que firma y validar... este link le permite ir corrigiendo errores hasta finalmente alcanzar la firma válida.
Reply all
Reply to author
Forward
0 new messages