Factura Electronica Peru - Firmado Digital

3,147 views
Skip to first unread message

Jose Carlos Aguilar

unread,
Sep 28, 2016, 4:11:48 PM9/28/16
to Comunidad de Visual Foxpro en Español
Les comparto codigo fuente para el firmado del XML generado.
Pueden generar la dll desde Vb,net (framework 4.0) y consumirla desde Foxpro 

Pasos: Generar la Dll -  Registrar la dll - Consumirla desde Foxpro 


Imports System.IO
Imports System.IO.Compression
Imports System
Imports System.Security.Cryptography
Imports System.Security.Cryptography.Xml
Imports System.Security.Cryptography.X509Certificates
Imports System.Xml
Imports System.Data
Imports System.Data.SqlClient
Imports System.Text
Imports System.Runtime.InteropServices

Namespace firmadoCE
    <ClassInterface(ClassInterfaceType.AutoDual)> _
    <ProgId("firmadoCE.firmado")> _
    Public Class firmado
        Public Function firmar(ByVal cRutaArchivo As String, ByVal cArchivo As String, ByVal cCertificado As String, ByVal cClave As String) As String
            Dim cRpta As String
            Dim local_typoDocumento As String = cArchivo.Substring(12, 2) ' retorna 01 o 03 0 ...
            Dim l_xpath As String = ""
            Dim f_certificat As String = cCertificado
            Dim f_pwd As String = cClave
            Dim xmlFile As String = cRutaArchivo & cArchivo
            Dim MonCertificat As X509Certificate2 = New X509Certificate2(f_certificat, f_pwd)
            Dim xmlDoc As XmlDocument = New XmlDocument()
            xmlDoc.PreserveWhitespace = True
            xmlDoc.Load(xmlFile)
            Dim signedXml As SignedXml = New SignedXml(xmlDoc)
            signedXml.SigningKey = MonCertificat.PrivateKey
            Dim KeyInfo As KeyInfo = New KeyInfo()
            Dim Reference As Reference = New Reference()
            Reference.Uri = ""
            Reference.AddTransform(New XmlDsigEnvelopedSignatureTransform())
            signedXml.AddReference(Reference)
            Dim X509Chain As X509Chain = New X509Chain()
            X509Chain.Build(MonCertificat)
            Dim local_element As X509ChainElement = X509Chain.ChainElements(0)
            Dim x509Data As KeyInfoX509Data = New KeyInfoX509Data(local_element.Certificate)
            Dim subjectName As String = local_element.Certificate.Subject
            x509Data.AddSubjectName(subjectName)
            KeyInfo.AddClause(x509Data)
            signedXml.KeyInfo = KeyInfo
            signedXml.ComputeSignature()
            Dim signature As XmlElement = signedXml.GetXml()
            signature.Prefix = "ds"
            signedXml.ComputeSignature()
            For Each node As XmlNode In signature.SelectNodes("descendant-or-self::*[namespace-uri()='http://www.w3.org/2000/09/xmldsig#']")
                ' node.Prefix = "ds"
                If node.LocalName = "Signature" Then
                    Dim newAttribute As XmlAttribute = xmlDoc.CreateAttribute("Id")
                    newAttribute.Value = "SignatureSP"
                    node.Attributes.Append(newAttribute)
                End If
            Next node
            Dim nsMgr As XmlNamespaceManager
            nsMgr = New XmlNamespaceManager(xmlDoc.NameTable)
            nsMgr.AddNamespace("sac", "urn:sunat:names:specification:ubl:peru:schema:xsd:SunatAggregateComponents-1")
            nsMgr.AddNamespace("ccts", "urn:un:unece:uncefact:documentation:2")
            nsMgr.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance")

            Select Case local_typoDocumento
                Case "01", "03" 'factura y boleta
                    nsMgr.AddNamespace("tns", "urn:oasis:names:specification:ubl:schema:xsd:Invoice-2")
                    l_xpath = "/tns:Invoice/ext:UBLExtensions/ext:UBLExtension[2]/ext:ExtensionContent"
                Case "07" 'n ota de credito
                    nsMgr.AddNamespace("tns", "urn:oasis:names:specification:ubl:schema:xsd:CreditNote-2")
                    l_xpath = "/tns:CreditNote/ext:UBLExtensions/ext:UBLExtension[2]/ext:ExtensionContent"
                Case "08" 'nota de debito
                    nsMgr.AddNamespace("tns", "urn:oasis:names:specification:ubl:schema:xsd:DebitNote-2")
                    l_xpath = "/tns:DebitNote/ext:UBLExtensions/ext:UBLExtension[2]/ext:ExtensionContent"
                Case "RA" ' COMUNICACION DE BAJA
                    nsMgr.AddNamespace("tns", "urn:sunat:names:specification:ubl:peru:schema:xsd:VoidedDocuments-1")
                    l_xpath = "/tns:VoidedDocuments/ext:UBLExtensions/ext:UBLExtension/ext:ExtensionContent"
                Case "RC" ' RESUMEN DIARIO
                    nsMgr.AddNamespace("tns", "urn:sunat:names:specification:ubl:peru:schema:xsd:SummaryDocuments-1")
                    l_xpath = "/tns:SummaryDocuments/ext:UBLExtensions/ext:UBLExtension/ext:ExtensionContent"
            End Select
            nsMgr.AddNamespace("cac", "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2")
            nsMgr.AddNamespace("udt", "urn:un:unece:uncefact:data:specification:UnqualifiedDataTypesSchemaModule:2")
            nsMgr.AddNamespace("ext", "urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2")
            nsMgr.AddNamespace("qdt", "urn:oasis:names:specification:ubl:schema:xsd:QualifiedDatatypes-2")
            nsMgr.AddNamespace("cbc", "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2")
            nsMgr.AddNamespace("ds", "http://www.w3.org/2000/09/xmldsig#")

            xmlDoc.SelectSingleNode(l_xpath, nsMgr).AppendChild(xmlDoc.ImportNode(signature, True))
            xmlDoc.Save(xmlFile)
            Dim nodeList As XmlNodeList = xmlDoc.GetElementsByTagName("ds:Signature")
            If (nodeList.Count <> 1) Then
                cRpta = "SE PRODUJO ERROR EN LA FIRMA"
            End If
            signedXml.LoadXml(CType(nodeList(0), XmlElement))
            If (signedXml.CheckSignature()) = False Then            ' verificacion de la firma generada
                cRpta = "SE PRODUJO UN ERROR EN LA FIRMA  DE DOCUMENTO"
            Else
                cRpta = "OK"
            End If
            Return cRpta
        End Function

    End Class
End Namespace






Jean Pierre Adonis De La Cruz Garcia

unread,
Sep 28, 2016, 4:50:30 PM9/28/16
to Comunidad de Visual Foxpro en Español
Excelente apoerte amigo, puedo dar fe de este proceso, ya que es el mismo que estoy utilizando me me va de maravillas en las facturas electronicas.

Moises Daniel Vilchez Tello

unread,
Sep 28, 2016, 4:57:22 PM9/28/16
to Comunidad de Visual Foxpro en Español
C#?
--
Moises Daniel Vilchez Tello
Chiclayo - Lambayeque - Peru

Jose Carlos Aguilar

unread,
Sep 28, 2016, 5:04:52 PM9/28/16
to Comunidad de Visual Foxpro en Español
Vb.net , paisano ya que eres chiclayano como yo. Saludos

Rene Jara

unread,
Sep 28, 2016, 5:44:26 PM9/28/16
to publicesvfoxpro
Hola Foxeros

que valioso aporte, soy nulo en vb, alguien ya tiene el dll que lo pueda compartir
mi correo es rene.j...@gmail.com
de antemano muchas gracias.

Saludos


  
Cordialmente
Rene Jara Muñoz

 

Daniel Sánchez

unread,
Sep 28, 2016, 10:15:46 PM9/28/16
to Comunidad de Visual Foxpro en Español
Jose Carlos la siguiente línea me dice que no encuentra el miembro o no existe

Imports System.Security.Cryptography.Xml

me sugiere cambiarlo por este, es correcto 

Imports System.Xml

estas lineas de rojo también marca error

           Dim signedXml As SignedXml = New SignedXml(xmlDoc)
            signedXml.SigningKey = MonCertificat.PrivateKey
            Dim KeyInfo As KeyInfo = New KeyInfo()
            Dim Reference As Reference = New Reference()
            Reference.Uri = ""
            Reference.AddTransform(New XmlDsigEnvelopedSignatureTransform())
            signedXml.AddReference(Reference)
            Dim X509Chain As X509Chain = New X509Chain()
            X509Chain.Build(MonCertificat)
            Dim local_element As X509ChainElement = X509Chain.ChainElements(0)
            Dim x509Data As KeyInfoX509Data = New KeyInfoX509Data(local_element.Certificate)

Saludos


2016-09-28 15:11 GMT-05:00 Jose Carlos Aguilar <jcagu...@gmail.com>:



--
Daniel Sánchez Escobar
Investigación y Desarrollo
Reset Software & Sistemas
Móvil +051-949398047 RPM #948615385
Trujillo - Perú

P  Sugerimos no imprimir este e-mail a menos que sea absolutamente necesario. Protejamos el medio ambiente.

Jose Carlos Aguilar

unread,
Sep 29, 2016, 8:52:37 AM9/29/16
to Comunidad de Visual Foxpro en Español
Asegurare hacer referencia  a :

Saludos

Daniel Sánchez

unread,
Sep 29, 2016, 9:16:35 AM9/29/16
to Comunidad de Visual Foxpro en Español
Así aparece

Imágenes integradas 1

Daniel Sánchez

unread,
Sep 29, 2016, 9:19:32 AM9/29/16
to Comunidad de Visual Foxpro en Español
De la lista visualizada le di doble click al item system.security y ya no indica ningún error, lo compilare para ver como queda.

Saludos

JBCA

unread,
Oct 3, 2016, 12:57:33 AM10/3/16
to Comunidad de Visual Foxpro en Español
José,

Excelente!!!, después de algunas pruebas funcionó correctamente, GRACIAS.

Jorge.


El miércoles, 28 de septiembre de 2016, 15:11:48 (UTC-5), Jose Carlos Aguilar escribió:

Jose Carlos Aguilar

unread,
Oct 3, 2016, 1:15:27 AM10/3/16
to Comunidad de Visual Foxpro en Español
Muy bien Jorge me alegra que te sirva, de esa manera tienes control sobre cualquier cambio futuro que haga la sunat y no depender de terceros que te amarran a dll.

Saludos

Juan Pablo Iparraguirre Iparraguirre

unread,
Jan 25, 2017, 4:29:19 AM1/25/17
to Comunidad de Visual Foxpro en Español
Estimado Jose Carlos, como puedo consumir esta dll en visual fox?, tal vez puedas darme una pista.

Gracias.


El miércoles, 28 de septiembre de 2016, 15:11:48 (UTC-5), Jose Carlos Aguilar escribió:

Jose Carlos Aguilar

unread,
Jan 25, 2017, 7:54:32 AM1/25/17
to Comunidad de Visual Foxpro en Español
LOCAL ol
  ol = CREATEOBJECT("firmadoCE.firmado")
  ?ol.firmar("E:\", "20441053658-01-F050-0000001.xml", "RUTACERTIFICADO", "CLAVE")

Saludos

Christiam Polo Bedregal

unread,
Jan 27, 2017, 6:18:05 AM1/27/17
to Comunidad de Visual Foxpro en Español
Jose muy bueno tu aporte

Tengo una duda. Estoy intentando pasar por el proceso de homologación. La empresa en la que estoy, no lo pudo hacer porque no manejan operaciones gratuitas ni inafectas.

Yo preparé los XML. Se volvió a tramitar la solicitud. Se hicieron las pruebas en el servidor beta sin ningún problema. Al cambiar al servidor de homologación aparece un   mensaje de error 

Error al recibir la respuesta HTTP a https://www.sunat.gob.pe/ol-ti-itcpgem-sqa/billService. Puede deberse a que el enlace del extremo de servicio no usa el protocolo HTTP. También puede deberse a que el servidor anula un contexto de solicitud HTTP (posiblemente por el cierre del servicio)


Espero que me puedas ayudar.

Muchas gracias



Jose Carlos Aguilar

unread,
Jan 27, 2017, 8:16:55 AM1/27/17
to Comunidad de Visual Foxpro en Español
Estimado. veo que tu aplicacion esta  en .net, en .net lo que hice es crear una referencia de servicio por cada tipo de proceso (beta, homologacion y produccion)  con diferente nombre ejm wsbeta, wsprod y wshom, porque si trabajas con una sola referencia probablemente tengas que actualizar  el config donde se agregan los endpoints ya que estos no se actualizan. Por alli va tu problem. si te puedo ayudar  en este tema sería por privado ya que todo tu proceso lo haces en .net y no en fox.

Saludos

Christiam Polo Bedregal

unread,
Jan 27, 2017, 5:27:13 PM1/27/17
to Comunidad de Visual Foxpro en Español
Un favor podrías pasarme tu codigo en fox?

Gracias

Jose Carlos Aguilar

unread,
Jan 27, 2017, 5:59:02 PM1/27/17
to Comunidad de Visual Foxpro en Español

FUNCTION FE_SUNATWSENVIO
 PARAMETER _rutaxml, _nombrearchivose, femodo, rucsol, usuariosol, clavesol, purlws && ejm: "c:\", "20441053658-01-F050-0000001" , "P", "xxxxxxxxxxx","xxx","xxx", "direccion del servicio"
 ls_ruc_emisor = rucsol
 ls_user = ls_ruc_emisor+usuariosol
 ls_pwd_sol = clavesol
 ps_file = _rutaxml+_nombrearchivose
 ps_filezip = ps_file+".zip"
 IF  .NOT. FILE(ps_filezip)
    RETURN "Archivo zip a enviar no encontrado"
 ENDIF
 ls_filename = JUSTFNAME(ps_filezip)
 ls_contentfile = FILETOSTR(ps_filezip)
 ls_base64 = STRCONV(ls_contentfile, 13)
 TEXT TO ls_envioxml TEXTMERGE NOSHOW PRETEXT 0015 FLAGS 1
<soapenv:Envelope xmlns:ser="http://service.sunat.gob.pe" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
<soapenv:Header>
<wsse:Security>
<wsse:UsernameToken>
<wsse:Username><<ls_user>></wsse:Username>
<wsse:Password><<ls_pwd_sol>></wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</soapenv:Header>
<soapenv:Body>
<ser:sendBill>
<fileName><<ls_fileName>></fileName>
<contentFile><<ls_base64>></contentFile>
</ser:sendBill>
</soapenv:Body>
</soapenv:Envelope>
 ENDTEXT
 oxmlhttp = CREATEOBJECT("MSXML2.ServerXMLHTTP.6.0")
 oxmlbody = CREATEOBJECT('MSXML2.DOMDocument.6.0')
 IF  .NOT. (oxmlbody.loadxml(ls_envioxml))
    oresp.mensaje = "No se cargo XML: "+oxmlbody.parseerror.reason
    RETURN .F.
 ENDIF
 lsurl = purlws
 oxmlhttp.open('POST', lsurl, .F.)
 oxmlhttp.setrequestheader("Content-Type", "text/xml")
 oxmlhttp.setrequestheader("Content-Type", "text/xml;charset=ISO-8859-1")
 oxmlhttp.setrequestheader("Content-Length", LEN(ls_envioxml))
 oxmlhttp.setrequestheader("SOAPAction", "sendBill")
 oxmlhttp.setoption(2, 13056)
 
 
 
 lcErr = "" 
TRY 
 oxmlhttp.send(oxmlbody.documentelement.xml)

CATCH TO loError 
lcErr = [Error: ] + STR(loError.ERRORNO) + CHR(13) + [Linea: ] + STR(loError.LINENO) + CHR(13) + [Mensaje: ] + loError.MESSAGE 
FINALLY 
IF EMPTY(lcErr) 
*MESSAGEBOX("El mensaje se envió con éxito", 64, "Aviso") 
ELSE 
MESSAGEBOX(lcErr, 16 , "Error")
ENDIF 
ENDTRY 

IF lcerr=""
ELSE
RETURN "ERROR- ASEGURE QUE HAY CONEXION A INTENET O ESTE DISPONIBLE EL SERVIDOR DE SUNAT- EL COMPROBANTE NO SE ENVIO" 
ENDIF

 
 
 IF (oxmlhttp.status<>200)
  *MESSAGEBOX("ERROR:"+ oxmlhttp.responsetext )
    RETURN "Error: Comprobante NO SE HA ENVIADO: "+ oxmlhttp.responsetext
 ELSE
    loxmlresp = CREATEOBJECT("MSXML2.DOMDocument.6.0")
    loxmlresp.loadxml(oxmlhttp.responsetext)
    ccontenidorptazip = STREXTRACT(oxmlhttp.responsetext, "<applicationResponse>", "</applicationResponse>")
    STRTOFILE(STRCONV(ccontenidorptazip, 14), _rutaxml+"R-"+_nombrearchivose+".zip")
    RETURN "OK"
 ENDIF
ENDFUNC

saludos, espero te sirva

Christiam Polo Bedregal

unread,
Jan 27, 2017, 6:39:55 PM1/27/17
to Comunidad de Visual Foxpro en Español
Muchas gracias. Te pasaste. Yo hice las pruebas sin problemas pero cuando quise homologar me aparecía un mensaje de error indicando únicamente un guión.

Yo programaba en Clipper. De alguna manera el código FOX me es familiar.

De casualidad tienes algo sobre la version 1.1 de los resúmenes de boletas. Estas entran en vigencia el 01/07

Nuevamente gracias


Jose Carlos Aguilar

unread,
Jan 28, 2017, 8:00:01 AM1/28/17
to Comunidad de Visual Foxpro en Español
El error del guion  tiene que ver probablemente con la cuenta, crea otra cuenta o usuario secundario  con los privilegios necesarios y prueba
..
SAludos

Zen Tes

unread,
Jan 28, 2017, 10:52:40 AM1/28/17
to Comunidad de Visual Foxpro en Español
Gracias por compartir el codigo.

Jose Carlos Aguilar

unread,
Jan 28, 2017, 10:59:27 AM1/28/17
to Comunidad de Visual Foxpro en Español
Es código que uno lo encuentra en la red y uno lo adapta, la verdad no recuerdo de donde lo saque lo del firmado y lo del envio esta en el foro y considero que si alguien lo compartió deberia hacer lo mismo.
Saludos

Zen Tes

unread,
Jan 28, 2017, 11:43:41 AM1/28/17
to Comunidad de Visual Foxpro en Español
Jose

Asi es es codigo que uno encuentra en la red y lo adapta y lo comparte, yo comparti con Uds. el envio, basicamente envio del XML para consulta del estado de comprobante en sunat y estaba como para adaptarlo a cualquier otro proceso con sunat.

saludos.

Christiam Polo Bedregal

unread,
Jan 30, 2017, 10:44:43 AM1/30/17
to publice...@googlegroups.com
Estimado Jose Carlos

De casualidad tienes el código para homologar los resúmenes?

Gracias

Jose Carlos Aguilar

unread,
Jan 30, 2017, 10:54:48 AM1/30/17
to Comunidad de Visual Foxpro en Español
Te refieres al envio o generación del xml?

Christiam Polo Bedregal

unread,
Jan 30, 2017, 12:11:29 PM1/30/17
to Comunidad de Visual Foxpro en Español
Al envío. 

En cuanto a la generación del xml tendrás información de la version 1.1? Según me informaron entra en vigencia a partir del 01 de julio, pero no han publicado la estructura.

Gracias

Jose Carlos Aguilar

unread,
Jan 30, 2017, 2:11:48 PM1/30/17
to Comunidad de Visual Foxpro en Español
Con respecto al resumen diario de boletas y resumen  de baja

PARAMETER _rutaxml, _nombrearchivose, femodo, rucsol, usuariosol, clavesol, _urlws
 PUBLIC rptawsticket
 rptawsticket = "ERROR"
 ls_ruc_emisor = rucsol
 ls_user = ls_ruc_emisor+usuariosol
 ls_pwd_sol = clavesol
 ps_file = _rutaxml+_nombrearchivose
 ps_filezip = ps_file+".zip"
 ls_filename = JUSTFNAME(ps_filezip)
 ls_contentfile = FILETOSTR(ps_filezip)
 ls_base64 = STRCONV(ls_contentfile, 13)
 TEXT TO ls_envioxml TEXTMERGE NOSHOW PRETEXT 0015 FLAGS 1
<soapenv:Envelope xmlns:ser="http://service.sunat.gob.pe" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
<soapenv:Header>
<wsse:Security>
<wsse:UsernameToken>
<wsse:Username><<ls_user>></wsse:Username>
<wsse:Password><<ls_pwd_sol>></wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</soapenv:Header>
<soapenv:Body>
<ser:sendSummary>
<fileName><<ls_fileName>></fileName>
<contentFile><<ls_base64>></contentFile>
</ser:sendSummary>
</soapenv:Body>
</soapenv:Envelope>
 ENDTEXT
 oxmlhttp = CREATEOBJECT("MSXML2.ServerXMLHTTP.6.0")
 oxmlbody = CREATEOBJECT('MSXML2.DOMDocument.6.0')
 IF  .NOT. (oxmlbody.loadxml(ls_envioxml))
    oresp.mensaje = "No se cargo XML: "+oxmlbody.parseerror.reason
    rptawsticket = "ERROR NO SE CARGO XML"
    RETURN rptawsticket
 ENDIF
 lsurl = _urlws
 MESSAGEBOX(lsurl)
 oxmlhttp.open('POST', lsurl, .F.)
 oxmlhttp.setrequestheader("Content-Type", "text/xml")
 oxmlhttp.setrequestheader("Content-Type", "text/xml;charset=ISO-8859-1")
 oxmlhttp.setrequestheader("Content-Length", LEN(ls_envioxml))
 oxmlhttp.setrequestheader("SOAPAction", "sendSummary")
 oxmlhttp.setoption(2, 13056)
 oxmlhttp.send(oxmlbody.documentelement.xml)
 IF (oxmlhttp.status<>200)
    rptawsticket = 'ERROR EN EL ENVIO STATUS: '+ALLTRIM(STR(oxmlhttp.status))+'-'+NVL(oxmlhttp.responsetext, '')
    RETURN rptawsticket
 ENDIF
 loxmlresp = CREATEOBJECT("MSXML2.DOMDocument.6.0")
 loxmlresp.loadxml(oxmlhttp.responsetext)
 rptawsticket = STREXTRACT(oxmlhttp.responsetext, "<ticket>", "</ticket>")
 RETURN rptawsticket

Christiam Polo Bedregal

unread,
Jan 30, 2017, 4:43:20 PM1/30/17
to Comunidad de Visual Foxpro en Español
Gracias Jose Carlos.



Christiam Polo Bedregal

unread,
Jan 30, 2017, 5:56:45 PM1/30/17
to Comunidad de Visual Foxpro en Español
Una pregunta 

Al enviar el resumen se genera un ticket. ¿Cuánto tiempo hay que esperar para que el ticket generado aparezca en el seguimiento de solicitudes?

--
Christiam Polo Bedregal
DBA Asociación Peruano Japonesa

Christian Valdez Ll.

unread,
Jul 3, 2017, 12:02:51 PM7/3/17
to Comunidad de Visual Foxpro en Español
Hola Jose Carlos, me ha servido el DLL, lo descargué de otro de grupo de google, te felicito por tu desinteresada colaboración, es algo que ya no suelo ver mucho....

Estimado Jose Carlos, tu DLL que descargué me firma las facturas, boletas, notas de credito y debito, pero no me firma el resumen de comprobantes, te adjunto una pantalla del mensaje que sale.

Es probable que el DLL que descargué en los "case" no inlcuye para RC y RA, no lo sé, por favor estaré atento a tu respuesta.

Saludos, y te agradezco de antemano....
SNAG-17070310474800.png

Jean Pierre Adonis De La Cruz Garcia

unread,
Jul 3, 2017, 12:05:50 PM7/3/17
to Comunidad de Visual Foxpro en Español
con respecto a ese modulo si firma Resumen diario y baja, yo he hecho la prueba, a la vez le agregue Guia, Percepcion, detraccion, y retencion y me firma sin problmeas

Jose Carlos Aguilar

unread,
Jul 3, 2017, 12:09:18 PM7/3/17
to Comunidad de Visual Foxpro en Español
Estimado, en realidad yo no publique ninguna libreria para firmado, lo que publique el codigo fuente en C# para que cada uno genere la dll, como veras en el codigo si está para firmar resumen de baja y resumen de boletas y cada uno puede agregar los demas tipos de cpes que faltan.

Hay otro hilo donde si hay una libreria pero la verdad no la he probado.


El lunes, 3 de julio de 2017, 11:02:51 (UTC-5), Christian Valdez Ll. escribió:

Christian Valdez Ll.

unread,
Jul 3, 2017, 3:09:10 PM7/3/17
to Comunidad de Visual Foxpro en Español
Gracias por la respuesta Jose Carlos, tendré que instalarme el Visual Studio Comunity para compilar el código que publicaste.... jajajaja, me estaba rompiendo la cabeza, jajajaja

Nuevamente gracias por tu atención, un abrazo....

Christian Valdez Ll.

unread,
Jul 4, 2017, 9:45:35 PM7/4/17
to Comunidad de Visual Foxpro en Español
Estimado ya creé el DLL pero al querer registrarlo para consumirlo en Fox, me sale el mensaje adjunto, no encuentro como solucionarlo.... gracias
SNAG-17070420440700.png

Christian Valdez Ll.

unread,
Jul 4, 2017, 11:36:05 PM7/4/17
to Comunidad de Visual Foxpro en Español
Ya logré registrarlo.... aparte del DLL tenía que crear su respectivo TLB..... ahora me firma los comprobantes normal, y el resumen de boletas también me lo firma, no dudo que va firmarme el resumen de anulados.... el dll que me baje y usaba antes no firmaba los resumenes.... Buena con tu código Jose Carlos....!!!! gracias....

Patricio Muñoz

unread,
Jul 5, 2017, 8:47:00 AM7/5/17
to publice...@googlegroups.com
Disculpen.... ese código sirve sólo para Perú?

Bendiciones

El 4 de julio de 2017, 23:36, Christian Valdez Ll. <christian...@gmail.com> escribió:
Ya logré registrarlo.... aparte del DLL tenía que crear su respectivo TLB..... ahora me firma los comprobantes normal, y el resumen de boletas también me lo firma, no dudo que va firmarme el resumen de anulados.... el dll que me baje y usaba antes no firmaba los resumenes.... Buena con tu código Jose Carlos....!!!! gracias....



--
Saludos

Patricio Muñoz
Pro&Tech
Analista en Sistemas

Jose Carlos Aguilar

unread,
Jul 5, 2017, 8:57:23 AM7/5/17
to Comunidad de Visual Foxpro en Español
Así es solo para firmado de comprobantes electrónicos SUNAT- PERU,  en el standar xmldsig.

Saludos 

Patricio Muñoz

unread,
Jul 5, 2017, 9:08:10 AM7/5/17
to publice...@googlegroups.com
mmmmmmm Gracias José

Bendiciones

Jose Carlos Aguilar

unread,
Jul 5, 2017, 9:09:32 AM7/5/17
to Comunidad de Visual Foxpro en Español
Fui incorporando algunas funciones a la libreria les comparto (volver a compilar y registrar -  no olviden las referencias): 

Imports System.IO
Imports System.IO.Compression
Imports System
Imports System.Security.Cryptography
Imports System.Security.Cryptography.Xml
Imports System.Security.Cryptography.X509Certificates
Imports System.Xml
Imports Ionic.Zip
Imports System.Data
Imports System.Data.SqlClient
Imports System.Text
Imports System.Runtime.InteropServices
Imports ZXing
Imports ZXing.Common
Imports ZXing.QrCode
Imports System.Drawing

Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Linq
Imports System.Xml.Schema
Imports System.Windows.Forms
Imports System.Diagnostics

Namespace firmadoCE
    <ClassInterface(ClassInterfaceType.AutoDual)> _
    <ProgId("firmadoCE.firmado")> _
    Public Class firmado
        Public Function firmar(ByVal cRutaArchivo As String, ByVal cArchivo As String, ByVal cCertificado As String, ByVal cClave As String) As String
            Dim cRpta As String

            Try
            Catch ex As Exception
                cRpta = ex.Message
            End Try

            Return cRpta
        End Function

        Public Function comprimir(ByVal cnombrearchivoOrigen As String, ByVal cnombreArchivoDestino As String) As String
            Dim zip As Ionic.Zip.ZipFile = New Ionic.Zip.ZipFile()
            zip.AddFile(cnombrearchivoOrigen, "") ' se puede seguir agregando mas con a misma funcion
            zip.Save(cnombreArchivoDestino)
            Dim rpta As String = "OK"
            Return rpta
        End Function
        Public Function extraer(ByVal cnombrearchivoOrigen As String, ByVal ruta As String) As String
            Dim rpta As String
            rpta = "OK"
            Try
                Dim zip = ZipFile.Read(cnombrearchivoOrigen)
                zip.ExtractAll(ruta)
            Catch ex As Exception
                rpta = ex.Message
            End Try
            Return rpta
        End Function
        Public Function pdf417(ByVal ctextoCodificar As String, ByVal cruta As String, ByVal cnombreArchivoPNG As String, ByVal cbarcode As String, ByVal nAncho As Integer, ByVal nAlto As Integer, ByVal nMargen As Integer) As String
            Dim options As New ZXing.QrCode.QrCodeEncodingOptions
            options.DisableECI = True
            options.CharacterSet = "UTF-8"
            options.Width = nAncho
            options.Height = nAlto
            options.Margin = nMargen

            Dim qr As New ZXing.BarcodeWriter()
            qr.Options = options
            If cbarcode = "1" Then
                qr.Format = ZXing.BarcodeFormat.PDF_417
            End If
            If cbarcode = "2" Then
                qr.Format = ZXing.BarcodeFormat.QR_CODE
            End If
            If cbarcode = "3" Then
                qr.Format = ZXing.BarcodeFormat.DATA_MATRIX
            End If

            Dim result As New System.Drawing.Bitmap(qr.Write(Trim(ctextoCodificar)))
            result.Save(cruta & cnombreArchivoPNG)
            Dim rpta As String
            rpta = "ok"
            Return rpta

        End Function
        Public Resultado As Boolean
        Public txtresultado As String
        Private Sub AdminEventoValidacion(sender As Object, args As ValidationEventArgs)
            Resultado = False
        End Sub
        Public Function validarXML(ByVal txtxml As String, ByVal txtxsd As String) As String
            Resultado = True
            txtresultado = "OK"
            'DESDE EL LLAMADO SE DEBERA VALIDAR LA EXISTENCIA DE LOS ARCHIVOS ENVIADOS COMO PARAMETROS
            Dim xmlR As New XmlTextReader(txtxml)
            Dim xsdR As New XmlValidatingReader(xmlR)
            Try
                xsdR.Schemas.Add(Nothing, txtxsd)
                xsdR.ValidationType = ValidationType.Schema
                AddHandler xsdR.ValidationEventHandler, New ValidationEventHandler(AddressOf AdminEventoValidacion)
                While xsdR.Read()
                    Application.DoEvents()
                End While
                xsdR.Close()
            Catch ex As Exception
                'txtresultado = If(Resultado, "Archivo XML correcto con respecto al esquema XSD", ex.Message)
                txtresultado = ex.Message
            End Try
            ' SI NO HAY NINGUN ERROR REVOLVERA OK
            xsdR.Close()
            Return txtresultado
        End Function
        Public Function FTPenviar_archivoRemoto(ByVal rutaarchivoftp As String, userftp As String, ByVal passftp As String, nombrearchivolocal As String) As String
            Dim miUri As String = rutaarchivoftp
            Dim miRequest As Net.FtpWebRequest = Net.WebRequest.Create(miUri)
            miRequest.Credentials = New Net.NetworkCredential(userftp, passftp)
            miRequest.Method = Net.WebRequestMethods.Ftp.UploadFile
            Try
                Dim bFile() As Byte = System.IO.File.ReadAllBytes(nombrearchivolocal)
                Dim miStream As System.IO.Stream = miRequest.GetRequestStream()
                miStream.Write(bFile, 0, bFile.Length)
                miStream.Close()
                miStream.Dispose()
                Return "OK"
            Catch ex As Exception
                Return "ERROR-" & ex.Message
            End Try
        End Function
        Public Function FTPverificar_archivoRemoto(ByVal rutayarchivo As String, ByVal userftp As String, ByVal passftp As String) As String
            Dim miUri As String = rutayarchivo    '  dir    "ftp://ftp.midominio.com/carpeta/fichero.jpg"
            Dim miRequest As Net.FtpWebRequest = Net.WebRequest.Create(miUri)
            miRequest.Credentials = New Net.NetworkCredential(userftp, passftp)
            miRequest.Method = Net.WebRequestMethods.Ftp.GetFileSize
            Try
                Dim response As Net.FtpWebResponse = miRequest.GetResponse()
                ' THE FILE EXISTS
            Catch ex As Net.WebException
                Dim response As Net.FtpWebResponse = ex.Response
                If Net.FtpStatusCode.ActionNotTakenFileUnavailable = response.StatusCode Then
                    ' THE FILE DOES NOT EXIST
                    Return "ERROR"
                End If
            End Try

            Return "OK"

        End Function
        Public Function EnviarEmail(ByVal razonsocialemisor As String, ByVal AsuntoEmail As String, ByVal mailEnvio As String, ByVal claveemail As String, ByVal servidorEnvio As String, ByVal portEnvioSMTP As String, ByVal emailestino As String, ByVal archivoadjunto As String, archivoadjunto2 As String) As String
            Dim archivo As New System.Net.Mail.Attachment(archivoadjunto)
            Dim archivo2 As New System.Net.Mail.Attachment(archivoadjunto2)
            Dim Message As New System.Net.Mail.MailMessage()
            Dim SMTP As New System.Net.Mail.SmtpClient
            'CONFIGURACIÓN DEL STMP
            '----------------------------------------------------'("cuenta de correo", "contraseña")
            SMTP.Credentials = New System.Net.NetworkCredential(mailEnvio, claveemail)
            SMTP.Host = servidorEnvio
            SMTP.Port = portEnvioSMTP
            SMTP.EnableSsl = True
            ' CONFIGURACION DEL MENSAJE
            Message.[To].Add(emailestino) ' Acá se escribe la cuenta de correo al que se le quiere enviar el e-mail
            '-------"Quien lo envía","Nombre de quien lo envía"  
            Message.From = New System.Net.Mail.MailAddress(mailEnvio, claveemail, System.Text.Encoding.UTF8) 'Quien envía el e-mail
            Message.Subject = razonsocialemisor & AsuntoEmail
            Message.SubjectEncoding = System.Text.Encoding.UTF8 'Codificacion
            Message.IsBodyHtml = True
            Message.Body = "<font size=10>Se le ha enviado una nueva factura electronica</font> <font color=red><b>a test</b></font>"
            Message.Body = "<TABLE border = 4 cellspacing = 4 cellpadding = 4 width =80%> <TH align = center> " & razonsocialemisor & " <TR> <TD align = LEFT>" & "Se le ha enviado una facura electronica" & "</TABLE> "

            Message.BodyEncoding = System.Text.Encoding.UTF8
            Message.Priority = System.Net.Mail.MailPriority.Normal
            '  Message.IsBodyHtml = False
            Message.Attachments.Add(archivo)
            Message.Attachments.Add(archivo2)
            'ENVIO
            Try
                SMTP.Send(Message)
                Return "OK"
            Catch ex As System.Net.Mail.SmtpException
                Return "ERROR-" & ex.ToString
            End Try
        End Function
        Public Function isOnline() As String
            Dim Url As New System.Uri("http://www.google.com/&#8221")
            Dim oWebReq As System.Net.WebRequest
            oWebReq = System.Net.WebRequest.Create(Url)
            Dim oResp As System.Net.WebResponse
            Try
                oResp = oWebReq.GetResponse
                oResp.Close()
                oWebReq = Nothing
                Return "OK"
            Catch ex As Exception
                oResp.Close()
                oWebReq = Nothing
                Return "ERROR- NO HAY CONEXION A INTERNET"
            End Try
        End Function
    End Class
End Namespace


lib._rar

luis.p...@modipsa.com.pe

unread,
Aug 25, 2017, 1:27:13 PM8/25/17
to Comunidad de Visual Foxpro en Español
Hola, tienes un ejemplo de documento xml para firmar digitalmente?, yo estoy cargando el documento pero me sale este error.

Gracias

El lunes, 3 de julio de 2017, 11:09:18 (UTC-5), Jose Carlos Aguilar escribió:

luis.p...@modipsa.com.pe

unread,
Aug 25, 2017, 7:08:48 PM8/25/17
to Comunidad de Visual Foxpro en Español
Hola, tienes un ejemplo de documento xml para firmar digitalmente?, yo estoy cargando el documento pero me sale este error.


 

Julio Ramos

unread,
Dec 3, 2017, 9:45:48 AM12/3/17
to Comunidad de Visual Foxpro en Español
Mi estimado José, puedo generar esta librería con vs 2015 o cual es la recomendable y muchas gracias por tus aportes
Saludos

Juan MLC

unread,
Dec 3, 2017, 2:58:55 PM12/3/17
to Comunidad de Visual Foxpro en Español
Hola Zen Tes, porfavor puedes compartir nuevamente codigo para consulta del estado de comprobante en sunat, porque utilice el que publicaste inicialmente y a todo los documentos me sale el error 0011 "El comprobante de pago electronico no existe", ya revise en SUNAT y  el documento si existe,
ya verifique enviarlo con variables o directamente los datos del documento y siempre me sale el mismo error, te agradeceria mucho

Saludos

Christian Valdez Ll.

unread,
Dec 3, 2017, 4:32:30 PM12/3/17
to Comunidad de Visual Foxpro en Español
SI, YO LO HICE CON EL 2015

Jorge Carrasco

unread,
May 25, 2018, 7:27:53 PM5/25/18
to Comunidad de Visual Foxpro en Español
Hola a todos. :D

Les comento lo que ha pasado:
He compilado con el código publicado aquí por el compañero Jose Carlos Aguilar (muchas gracias por ello), pero solamente firma los xml con UBL 2.0, al querer firmar los archivos XML que son UBL 2.1, no lo hace, sólo devuelve el mensaje "Referencia a objeto no establecida como instancia de un objeto", tiene algo que ver el UBL o es otro detalle que estoy pasando por alto?. A alguien le ha pasado?. No entiendo exactamente a que se refiere el mensaje, y mucho menos cómo solucionarlo, supongo que debe ser algo sencillo pero mi experiencia con VB.net es demasiado limitada, es por ello que solicito ayuda a ésta comunidad.

Muchas gracias

Junior Bermudez

unread,
Jun 19, 2018, 10:58:30 AM6/19/18
to Comunidad de Visual Foxpro en Español
Jorge Buenos dias, Conseguiste alguna solucion a ese problema? mi aplicación me arroja el mismo error.

Jorge Carrasco

unread,
Jun 19, 2018, 1:19:01 PM6/19/18
to Comunidad de Visual Foxpro en Español
Hola
Sí, parece que el detalle estaba en la parte del CASE
l_xpath = "/tns:Invoice/ext:UBLExtensions/ext:UBLExtension[2]/ext:ExtensionContent"

Ahí hace referencia al UBLExtension[2], y comparando el UBL 2.0 con el 2.1, el segundo solamente tiene un nodo UBLExtension, así que con cambiar el [2] por [1] ya funcionó, pero claro, no lo he probado más, porque dentro del CASE hay otros que también hacen la misma referencia, pero de los demás casos no he comprobado.

Prueba y nos comentas cómo te fue.

Saludos

Message has been deleted
Message has been deleted
Message has been deleted
Message has been deleted
Message has been deleted
Message has been deleted
Message has been deleted
Message has been deleted

Kyo2104

unread,
Sep 5, 2018, 10:59:05 AM9/5/18
to Comunidad de Visual Foxpro en Español
Buen Dia Jose Carlos,

He realizado el proceso de creacion de la Libreria firmadoCE.DLL, (Visual Studio 2015, Registrado en WINDOWS 10) y lo aplico en un pequeño programa en Visual Foxpro 9, pero siempre me emite el mensaje "Referencia a Objeto no establecida como instancia de un objeto", te adjunto archivo en formato RAR conteniendo el Proyecto firmadoCE (Visual Basic), el archivo xml al cual le realizo la prueba de la firma digital, para que por favor lo puedas validar e indicarme en donde he realizado alguna omision o equivicacion. muchas gracias por el apoyo..

El miércoles, 25 de enero de 2017, 7:54:32 (UTC-5), jose carlos aguilar escribió:
LOCAL ol
  ol = CREATEOBJECT("firmadoCE.firmado")
  ?ol.firmar("E:\", "20441053658-01-F050-0000001.xml", "RUTACERTIFICADO", "CLAVE")

Saludos

El miércoles, 25 de enero de 2017, 4:29:19 (UTC-5), Juan Pablo Iparraguirre Iparraguirre escribió:
Estimado Jose Carlos, como puedo consumir esta dll en visual fox?, tal vez puedas darme una pista.

Gracias.
                    l_xpath = "/tns:Invoice/ext:UBLExtensions/ext:UBLExtension[2]/ext:ExtensionContent"
Message has been deleted
Message has been deleted
Message has been deleted
Message has been deleted

Jorge Aguilar

unread,
Apr 1, 2020, 4:17:02 PM4/1/20
to Comunidad de Visual Foxpro en Español
Estimado ¿No tuviste problema con las Guias, Percepcion, Detraccion y Retencion?
Modificaste el código en alguna parte porque a mi justamente con con esos casos tengo problemas, por favor apoyame, llevo días con esto

Te agradezco de antemano.

Jorge Aguilar

unread,
Apr 1, 2020, 4:22:37 PM4/1/20
to Comunidad de Visual Foxpro en Español
Hola Jose Carlos, para el tema de Guias, Percepcion, Detraccion y Retencion estoy teniendo problemas, por favor me podrias apoyar, ya modifique el codigo pero aun asi me esta saliendo error.
Reply all
Reply to author
Forward
0 new messages