Clipper On Line • Ver Tópico - Exemplos tudo-em-um

Exemplos tudo-em-um

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

 

Exemplos tudo-em-um

Mensagempor JoséQuintas » 19 Fev 2014 19:30

Não, porque os truques usados pra puxar do html são totalmente dependentes do html, se uma única letra mudar de lugar, já não serve.
Mesmo assim, pegar do html não garante que esteja ok.

Com a parte do Sped (webservices), se não depender de manifestação do destinatário, poderia ter.

Lembro que no início do projeto, em 1998, havia a opção de um certificado especial pra servidor, que podia baixar qualquer XML de qualquer empresa. De repente os webservices ainda existem.

Nunca procurei.
Cada vez mais acho que tudo isso é um grande erro.
O governo nunca vai admitir isso, porque senão o país inteiro cai encima dele.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 11533
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 12 vezes
Mens.Curtidas: 736 vezes

Exemplos tudo-em-um

Mensagempor JoséQuintas » 01 Mar 2014 19:39

O tudo-em-um tem a rotina pra "colar", usada no filtro de inkey.
Rolou uma pergunta mostrando que no xHarbour tem a opção copiar/colar de/para GETs.
Então fiz e acrescentei a opção de "copiar", limitada ao GET, mas já é alguma coisa. (e diferente do exemplo postado, não precisa GETSYS especial).
É só acrescentar na rotina de inkeyfilter o trecho referente à tecla ctrl-C
Com isso, o ctrl-c vai copiar o conteúdo do get ativo para a área de transferência.

Então, na rotina de iniciar o comando completo ficou assim:

   hb_gtInfo( HB_GTI_INKEYFILTER, { ;
      | nKey |
      LOCAL nBits, lIsKeyCtrl
      nBits := hb_GtInfo( HB_GTI_KBDSHIFTS )
      lIsKeyCtrl := ( nBits == hb_BitOr( nBits, HB_GTI_KBD_CTRL ) )
      SWITCH nKey
      CASE K_MWBACKWARD
         RETURN K_DOWN
      CASE K_MWFORWARD
         RETURN K_UP
      CASE K_RBUTTONDOWN
         RETURN K_ESC
      CASE K_RDBLCLK
         RETURN K_ESC
      CASE K_CTRL_V
         IF lIsKeyCtrl
            hb_GtInfo( HB_GTI_CLIPBOARDPASTE )
            RETURN 0
         ENDIF
      CASE K_CTRL_C
         IF lIsKeyCtrl
            IF GetActive() != NIL
               hb_gtInfo( HB_GTI_CLIPBOARDDATA, Transform( GetActive():VarGet(), "" ) )
               RETURN 0
            ENDIF
         ENDIF
      ENDSWITCH
      RETURN nKey
       } )
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 11533
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 12 vezes
Mens.Curtidas: 736 vezes

Exemplos tudo-em-um

Mensagempor JoséQuintas » 18 Mar 2014 14:17

Só pra ficar atualizado.
Anexos
allinone.zip
(44.72 KiB) Baixado 338 vezes
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 11533
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 12 vezes
Mens.Curtidas: 736 vezes

Exemplos tudo-em-um

Mensagempor zazibr » 19 Mar 2014 12:05

parabens ....vc nao testou nada de qt ?
Avatar de usuário

zazibr
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 73
Data de registro: 11 Set 2004 17:07
Cidade/Estado: Campo Grande/MS
Curtiu: 0 vez
Mens.Curtidas: 3 vezes

Exemplos tudo-em-um

Mensagempor JoséQuintas » 19 Mar 2014 19:42

Ainda não. Isso de projeto separado atrapalha muito.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 11533
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 12 vezes
Mens.Curtidas: 736 vezes

Exemplos tudo-em-um

Mensagempor Alexandre Silva » 24 Mar 2014 23:45

Parabens, estou querendo fazer tudo no harbour.
Desculpe se a pergunta é basica, mas pelo que vi, tudo funciona para o certificado A1, nao para o A3 ?

Vi que em PHP é uma pedreira nao resolvida
https://groups.google.com/forum/?hl=pt-BR#!searchin/nfephp/A3/nfephp/eCj15-q6t3M/fsS2yOawha0J

e no projeto ABCR o pessoal tem que ficar fazendo 2 versoes..
http://www.projetoacbr.com.br/forum/index.php?/files/
* Clipper 5.2e/Gaspro 4.0 /CDX/Blinker 7.0 Harbour 3.2 Console Hbmk2
Avatar de usuário

Alexandre Silva
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 291
Data de registro: 26 Mar 2007 00:16
Cidade/Estado: Itapema - SC
Curtiu: 15 vezes
Mens.Curtidas: 1 vez

Exemplos tudo-em-um

Mensagempor JoséQuintas » 25 Mar 2014 09:39

O A3 é pra mais segurança, mas segurança demais atrapalha.
E faz parte da segurança alertas a cada uso, o que impediria o automático.

A coisa curiosa é a seguinte:
A diferença do A3 não é apenas a segurança, ele tem muito mais poderes que o A1.
O A3 é acesso total à Receita Federal, pra qualquer coisa.
Já o A1 é basicamente NFE.

O pessoal costuma pegar o A3 não pela segurança, mas porque vale por 3 anos.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 11533
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 12 vezes
Mens.Curtidas: 736 vezes

Exemplos tudo-em-um

Mensagempor Alexandre Silva » 25 Mar 2014 21:44

é bem isso,
o problema basicamente é para nao ficar renovando...todo ano
Mas meus clientes que usam cte e Nfe, daqui a pouco vao começar com o MDFE (manifesto)
Queria fazer pelo harbou e nao pelos emissores do SEFAZ, nem pelo ACBR

E vc nao ve uma alternativa (para poder usar o A3) que poderia ser usada no harbour ?
chamar um programa externo ? conhece algum ?
* Clipper 5.2e/Gaspro 4.0 /CDX/Blinker 7.0 Harbour 3.2 Console Hbmk2
Avatar de usuário

Alexandre Silva
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 291
Data de registro: 26 Mar 2007 00:16
Cidade/Estado: Itapema - SC
Curtiu: 15 vezes
Mens.Curtidas: 1 vez

Exemplos tudo-em-um

Mensagempor JoséQuintas » 25 Mar 2014 23:45

Vou testar isso qualquer hora.
O problema é a Microsoft inventando seguranças cada vez mais inseguras.
No Windows 8 complica até pra baixar o programa oficial da Fazenda.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 11533
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 12 vezes
Mens.Curtidas: 736 vezes

Exemplos tudo-em-um

Mensagempor JoséQuintas » 22 Mai 2014 20:33

Só pra constar:
Embuti algumas coisas do tudo em um no www.harbourdoc.com.br
Apesar de misturado, fica em separado, já que classifiquei como library harbourdoc.com.br
Por exemplo:

Ao abrir a categoria PDF, a library harbourdoc.com.br contém PDFClass
Ao abrir a categoria User Interface, a library harbourdoc.com.br contém GrafTime()
Ao abrir a categoria Miscelaneous, a library harbourdoc.com.br contém ReturnValue()

Ainda não sei aonde encaixar as outras, além de muitas do harbour.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 11533
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 12 vezes
Mens.Curtidas: 736 vezes

Exemplos tudo-em-um

Mensagempor Alexandre Silva » 06 Set 2014 02:04

Entao Zé...
Vc colocou ai essa funcao assinaxml() como ela funciona ?

Tenho a funcao hbNFeAssina() mas nao sei como se passa os parametros e se executa o objeto..

E o nome do Certificado é aquele CN= XXXX (normalmente o nome da empresa)
ou é uma Chave ou outra coisa ??

Quando estou gerando o XML, linha a linha, numa String cXml, chego no final antes da assinatura com o tag
cXml+='</infCte>'

Nesse ponto deve ser assinado, como fazer ?

PS: Atualmente coloco uma assinatura falsa para poder ser importado no Emissor.
* Clipper 5.2e/Gaspro 4.0 /CDX/Blinker 7.0 Harbour 3.2 Console Hbmk2
Avatar de usuário

Alexandre Silva
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 291
Data de registro: 26 Mar 2007 00:16
Cidade/Estado: Itapema - SC
Curtiu: 15 vezes
Mens.Curtidas: 1 vez

Exemplos tudo-em-um

Mensagempor JoséQuintas » 06 Set 2014 08:34

É praticamente a mesma rotina da hbnfe.

A estrutura dos arquivos NFE, CTE, MDFe, etc. é parecida na formação.

a) Todas são a informação do documento <infNFe></infNFe> ou <infCTe></infCTe> ou <infMDFe></infMDFe>.
b) Dentro desse bloco, todas tem o bloco do documento e o bloco da assinatura <NFe>...</NFe><signature></signature>
c) No bloco do documento tem o bloco chave <id...>

Pra assinatura, insere só o básico do bloco da assinatura pra identificar aonde vai ficar, e utiliza o bloco Id, que pode ser diferente conforme o tipo de documento. É isso que a rotina de assinatura identifica.
Depois de assinado, o bloco de assinatura completo substitui o bloco vazio antes da assinatura <signature></signature>

Se for lote, vai conter vários blocos de NFe, e cada bloco é tratado como um XML de NFE diferente, cada um com a sua assinatura.

Lembrando: a assinatura é como um dígito de controle, para o documento mais o certificado. (um grande dígito de controle com muitos dígitos)

Então basicamente é isso: a rotina de assinatura identifica qual o tipo de documento pra saber como separar a identificação, calcula a assinatura, e depois inclui a assinatura no bloco da assinatura.
A rotina só precisa saber qual é o XML, e qual o certificado.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 11533
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 12 vezes
Mens.Curtidas: 736 vezes

Exemplos tudo-em-um

Mensagempor Alexandre Silva » 06 Set 2014 15:48

Oi. desculpe,
sou iniciante nisso. Sua explicacao é muito boa, preciso do exemplo prático/real.

1=O que preciso é: tendo um XML de Cte, como faço para assinar ??

2=Qual função voce usa ?? Porque essa hbnfeassina() pelo que vi nao faz referencia a Cte.
Ou nesta funcao vc mudou as referencias a NFe>para CTe> ??

3-Nos prg da compilacao tenho ze_sefaz.prg, hhNfeAssina.prg e hbnfe.prg que peguei em:
precisa mais alguma coisa ??
[url]
http://hbnfe.googlecode.com/svn/trunk/source/
[/url]

4-O que vai como parametro do certificado ?? quais desses Metodos devo usar ??
METHOD escolheCertificado(lTentaRegistrar)
METHOD pegaObjetoCertificado(cSerialCert)
METHOD pegaCNCertificado()
METHOD pegaPropriedadesCertificado(cSerialCert)

5-Abaixo o trecho que tento assinar , dá erro varialvel nao existe SELF
  
       HB_MemoWrit(varqs,cXml)  // salvo o string do xml que estou montado
       oAssina := hbNFeAssina(vcertificado,varqs)

      // Objeto ohbNfe  de onde vem isso ? que objeto é esse ?
      //  aqui da erro variavel nao existe SELF 

       oAssina:ohbNFe := ::ohbNfe   
       oAssina:cXMLFile := cXML
       oAssina:lMemFile := .T.
       aRetornoAss := oAssina:execute()
       oAssina := Nil
       IF aRetornoAss['OK'] == .F.
          aRetorno['OK']       := .F.
          aRetorno['MsgErro']  := aRetornoAss['MsgErro']
          RETURN(aRetorno)
       ENDIF
       cXML:= aRetornoAss['XMLAssinado']



Obrigado
* Clipper 5.2e/Gaspro 4.0 /CDX/Blinker 7.0 Harbour 3.2 Console Hbmk2
Avatar de usuário

Alexandre Silva
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 291
Data de registro: 26 Mar 2007 00:16
Cidade/Estado: Itapema - SC
Curtiu: 15 vezes
Mens.Curtidas: 1 vez

Exemplos tudo-em-um

Mensagempor JoséQuintas » 06 Set 2014 21:44

No meu tudo em um, o assinatura está apenas observado, mas não é usado.
Aqui vai minha função de assinatura baseada na hbnfe. Pelo que percebi, tem partes sem uso que não retirei.

Importante:
A rotina não faz tudo sozinha, precisa da CAPICOM, e do Microsoft XML 5.0 (a única versão que faz assinatura).
A rotina recebe o conteúdo do XML, e o conteúdo fica assinado (ou não), sem usar arquivo temporário.
Se for usar arquivo, só fazer uma função intermediária, algo do tipo:

cXml := MemoRead( "arquivo.xml" )
cRetorno := AssinaXml( @cXml, "NOME DO CERTIFICADO" )
IF cRetorno != "OK"
    ? cRetorno
ELSE
   hb_MemoWrit( "assinado.xml", cXml )
ENDIF



#define _CAPICOM_STORE_OPEN_READ_ONLY                 0           // Somente Smart Card em Modo de Leitura

#define _CAPICOM_MEMORY_STORE                         0
#define _CAPICOM_LOCAL_MACHINE_STORE                  1
#define _CAPICOM_CURRENT_USER_STORE                   2
#define _CAPICOM_ACTIVE_DIRECTORY_USER_STORE          3
#define _CAPICOM_SMART_CARD_USER_STORE                4

#define _CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED           2
#define _CAPICOM_CERTIFICATE_FIND_SHA1_HASH           0           // Retorna os Dados Criptografados com Hash SH1
#define _CAPICOM_CERTIFICATE_FIND_EXTENDED_PROPERTY   6
#define _CAPICOM_CERTIFICATE_FIND_TIME_VALID          9           // Retorna Certificados Válidos
#define _CAPICOM_CERTIFICATE_FIND_KEY_USAGE           12          // Retorna Certificados que contém dados.
#define _CAPICOM_DIGITAL_SIGNATURE_KEY_USAGE          0x00000080  // Permitir o uso da Chave Privada para assinatura Digital
#define _CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME 0           // Este atributo contém o tempo em que a assinatura foi criada.
#define _CAPICOM_INFO_SUBJECT_SIMPLE_NAME             0           // Retorna o nome de exibição do certificado.
#define _CAPICOM_ENCODE_BASE64                        0           // Os dados são guardados como uma string base64-codificado.
#define _CAPICOM_E_CANCELLED                          -2138568446 // A operação foi cancelada pelo usuário.
#define _CERT_KEY_SPEC_PROP_ID                        6
#define _CAPICOM_CERT_INFO_ISSUER_EMAIL_NAME          0
#define _SIG_KEYINFO                                  2

#define XMLNFE          1
#define XMLCTE          2
#define XMLCANCELAMENTO 3
#define XMLINUTILIZACAO 4
#define XMLDEPEC        5
#define XMLEVENTO       6

#include "common.ch"
#include "hbclass.ch"

FUNCTION AssinaXml( cTxtXml, cCertCN )
   LOCAL oDOMDoc, nPosIni, nPosFim, xmlHeaderAntes, xmldsig, dsigns, oCert, oStoreMem, oError, xmlHeaderDepois
   LOCAL XMLAssinado, ParseError, oSchema, SIGNEDKEY, DSIGKEY, SCONTAINER, SPROVIDER, ETYPE, nTipo, cURI, cRetorno, nP, nResult
   LOCAL aDelimitadores, nCont

// atenção a ordem é importante
   aDelimitadores := { { "<infMDFe", "</MDFe>" }, { "<infCte", "</CTe>" }, { "<infNFe", "</NFe>" }, ;
      { "<infCanc", "</cancNFe>" }, { "<infInut",  "</inutNFe>" }, { "<infEvento", "</evento>" }, ;
      { "<inf????", "</envDPEC>" } }

   // Define Tipo de Documento

   IF AT( [<Signature], cTxtXml) <= 0
      nTipo := 0
      FOR nCont = 1 TO Len( aDelimitadores )
         IF aDelimitadores[ nCont, 1 ] $ cTxtXml
            nTipo := nCont
            EXIT
         ENDIF
      NEXT

      // Pega URI
      nPosIni := At( [Id=], cTxtXml )
      IF nPosIni = 0
         cRetorno := "Não encontrado início do URI: Id="
         RETURN cRetorno
      ENDIF
      nPosIni := HB_AT( ["], cTxtXml, nPosIni + 2 )
      IF nPosIni = 0
         cRetorno := "Não encontrado início do URI: aspas inicial"
         RETURN cRetorno
      ENDIF
      nPosFim := HB_AT( ["], cTxtXml, nPosIni + 1 )
      IF nPosFim = 0
         cRetorno := "Não encontrado início do URI: aspas final"
         RETURN cRetorno
      ENDIF
      cURI := Substr( cTxtXml, nPosIni + 1, nPosFim - nPosIni - 1 )

      // Adiciona bloco de assinatura no local apropriado
      IF nTipo != 0
         IF aDelimitadores[ nTipo, 2 ] $ cTxtXml
            cTxtXml := Substr( cTxtXml, 1, At( aDelimitadores[ nTipo, 2 ], cTxtXml ) - 1 ) + SignatureNode( cURI ) + aDelimitadores[ nTipo, 2 ]
         ENDIF
      ENDIF
   ENDIF

//   HB_MemoWrit( "NFE\Ultimo-1.XML", cTxtXml )
   // Lendo Header antes de assinar //
   xmlHeaderAntes := ''
   nPosIni := AT( [?>], cTxtXml )
   IF nPosIni > 0
      xmlHeaderAntes := Substr( cTxtXml, 1, nPosIni + 1 )
   ENDIF

   BEGIN SEQUENCE
      oDOMDoc := Win_OleCreateObject( "MSXML2.DOMDocument.5.0" )
   RECOVER
      cRetorno := "Não carregado MSXML2.DOMDocument.5.0"
      RETURN cRetorno
   END SEQUENCE

   oDOMDoc:async = .F.
   oDOMDoc:resolveExternals := .F.
   oDOMDoc:validateOnParse  = .T.
   oDOMDoc:preserveWhiteSpace = .T.

   BEGIN SEQUENCE
      xmldsig := Win_OleCreateObject( "MSXML2.MXDigitalSignature.5.0")
   RECOVER
      cRetorno := "Não carregado MSXML2.MXDigitalSignature.5.0"
      RETURN cRetorno
   END SEQUENCE

   oDOMDoc:LoadXML( cTxtXml )
   IF oDOMDoc:parseError:errorCode <> 0 // XML não carregado
      cRetorno := "Assinar: Não foi possivel carregar o documento pois ele não corresponde ao seu Schema" + HB_EOL()
      cRetorno += " Linha: " + Str(oDOMDoc:parseError:line)+HB_EOL()
      cRetorno += " Caractere na linha: " + Str(oDOMDoc:parseError:linepos)+HB_EOL()
      cRetorno += " Causa do erro: " + oDOMDoc:parseError:reason+HB_EOL()
      cRetorno += "code: "+STR(oDOMDoc:parseError:errorCode)
      RETURN cRetorno
   ENDIF

   DSIGNS = "xmlns:ds='http://www.w3.org/2000/09/xmldsig#'"
   oDOMDoc:setProperty('SelectionNamespaces', DSIGNS)

   IF .NOT. "</Signature>" $ cTxtXml
      RETURN "ERRO: Bloco Assinatura não encontrado"
   ENDIF
   BEGIN SEQUENCE
      xmldsig:signature := oDOMDoc:selectSingleNode(".//ds:Signature")
   RECOVER
      cRetorno := "Template de assinatura não encontrado"
      RETURN cRetorno
   END SEQUENCE

   oCert:= pegaObjetoCertificado( cCertCn )
   IF oCert == NIL
      cRetorno := "Certificado não encontrado"
      RETURN cRetorno
   ENDIF

   oStoreMem := Win_OleCreateObject( "CAPICOM.Store" )
   BEGIN SEQUENCE WITH { | oError | Break( oError ) }
      oStoreMem:open( _CAPICOM_MEMORY_STORE, 'Memoria', _CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED )
   RECOVER USING oError
      cRetorno := "Falha ao criar espaço certificado na memoria " + HB_EOL()
      cRetorno += "Error: "  + Transform( oError:GenCode, NIL ) + ";" + HB_EOL()
      cRetorno += "SubC: "   + Transform( oError:SubCode, NIL ) + ";" + HB_EOL()
      cRetorno += "OSCode: "  + Transform( oError:OsCode,  NIL ) + ";" + HB_EOL()
      cRetorno += "SubSystem: " + Transform( oError:SubSystem, NIL ) + ";" +HB_EOL()
      cRetorno += "Mensagem: " + oError:Description
      RETURN cRetorno
   END SEQUENCE

   BEGIN SEQUENCE WITH { | oError | Break( oError ) }
      oStoreMem:Add( oCert )
   RECOVER USING oError
      cRetorno := "Falha ao adicionar certificado na memoria " + HB_EOL()
      cRetorno += "Error: "  + Transform( oError:GenCode, NIL) + ";" + HB_EOL()
      cRetorno += "SubC: "   + Transform( oError:SubCode, NIL) + ";" + HB_EOL()
      cRetorno += "OSCode: "  + Transform( oError:OsCode,  NIL) + ";" + HB_EOL()
      cRetorno += "SubSystem: " + Transform( oError:SubSystem, NIL) + ";" + HB_EOL()
      cRetorno += "Mensagem: " + oError:Description
      RETURN cRetorno
   END SEQUENCE

   xmldsig:store := oStoreMem

   //---> Dados necessários para gerar a assinatura
   eType := oCert:PrivateKey:ProviderType
   sProvider := oCert:PrivateKey:ProviderName
   sContainer := oCert:PrivateKey:ContainerName
   dsigKey := xmldsig:CreateKeyFromCSP(eType, sProvider, sContainer, 0)
   IF ( dsigKey = NIL )
      cRetorno := "Erro ao criar a chave do CSP."
      RETURN cRetorno
   ENDIF

   SignedKey := XmlDSig:Sign( DSigKey, 2 )

   IF ( signedKey <> NIL )
      XMLAssinado := oDOMDoc:xml
      XMLAssinado := StrTran( XMLAssinado, Chr(10), "" )
      XMLAssinado := StrTran( XMLAssinado, Chr(13), "" )
      nPosIni := At( [<SignatureValue>], XMLAssinado ) + Len( [<SignatureValue>] )
      XMLAssinado := Substr( XMLAssinado, 1, nPosIni - 1 ) + StrTran( Substr( XMLAssinado, nPosIni, Len( XMLAssinado ) ), " ", "" )
      nPosIni := At( [<X509Certificate>], XMLAssinado ) - 1
      nP = At( [<X509Certificate>], XMLAssinado )
      nResult := 0
      DO WHILE nP<>0
         nResult := nP
         nP = HB_AT( [<X509Certificate>], XMLAssinado, nP + 1 )
      ENDDO
      nPosFim := nResult
      XMLAssinado := Substr( XMLAssinado, 1, nPosIni ) + Substr( XMLAssinado, nPosFim, Len( XMLAssinado ) )
   ELSE
      cRetorno := "Assinatura Falhou."
      RETURN cRetorno
   ENDIF

   IF xmlHeaderAntes <> ""
      nPosIni := At( XMLAssinado, [?>] )
      IF nPosIni > 0
         xmlHeaderDepois := Substr( XMLAssinado, 1, nPosIni + 1 )
         IF xmlHeaderAntes <> xmlHeaderDepois
            * ? "entrou stuff"
            * XMLAssinado := StuffString( XMLAssinado, 1, Length( xmlHeaderDepois ), xmlHeaderAntes )
         ENDIF
      ELSE
         XMLAssinado := xmlHeaderAntes + XMLAssinado
      ENDIF
   ENDIF
   cTxtXml := XmlAssinado
   cRetorno := "OK"
   oDOMDoc := NIL
   ParseError := NIL
   oSchema := NIL
   RETURN cRetorno
*----------------------------------------------------------------

STATIC FUNCTION SignatureNode( cUri )
   Local cSignatureNode := ""
   cSignatureNode += [<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">]
   cSignatureNode +=    [<SignedInfo>]
   cSignatureNode +=       [<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>]
   cSignatureNode +=       [<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />]
   cSignatureNode +=       [<Reference URI="#] + cURI + [">]
   cSignatureNode +=       [<Transforms>]
   cSignatureNode +=          [<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />]
   cSignatureNode +=          [<Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />]
   cSignatureNode +=       [</Transforms>]
   cSignatureNode +=       [<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />]
   cSignatureNode +=       [<DigestValue>]
   cSignatureNode +=       [</DigestValue>]
   cSignatureNode +=       [</Reference>]
   cSignatureNode +=    [</SignedInfo>]
   cSignatureNode +=    [<SignatureValue>]
   cSignatureNode +=    [</SignatureValue>]
   cSignatureNode +=    [<KeyInfo>]
   cSignatureNode +=    [</KeyInfo>]
   cSignatureNode += [</Signature>]
   RETURN cSignatureNode
*----------------------------------------------------------------

FUNCTION PegaObjetoCertificado( cCertCn )
   LOCAL oStore, oCertificados, oResult := NIL, nCont
   oStore := Win_OleCREATEObject( "CAPICOM.Store" )
   oStore:open( _CAPICOM_CURRENT_USER_STORE, "My", _CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED )
   oCertificados := oStore:Certificates()
   FOR nCont = 1 TO oCertificados:Count()
      IF cCertCN $ oCertificados:Item( nCont ):SubjectName
         oResult := oCertificados:Item( nCont )
         EXIT
      ENDIF
   NEXT
   oCertificados := NIL
   oStore := NIL
   RETURN oResult
*----------------------------------------------------------------
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 11533
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 12 vezes
Mens.Curtidas: 736 vezes

Exemplos tudo-em-um

Mensagempor Alexandre Silva » 09 Set 2014 02:15

Muito muito obrigado...
finalmente consegui assinar um XML.. tando do Cte como do MDFe...
Claro isso só serve para os do repositorio do Windows certo.. ? nao assina se for cartao...

Muito obrigado
* Clipper 5.2e/Gaspro 4.0 /CDX/Blinker 7.0 Harbour 3.2 Console Hbmk2
Avatar de usuário

Alexandre Silva
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 291
Data de registro: 26 Mar 2007 00:16
Cidade/Estado: Itapema - SC
Curtiu: 15 vezes
Mens.Curtidas: 1 vez

Anterior Próximo



Retornar para Contribuições, Dicas e Tutoriais

Quem está online

Usuários vendo este fórum: dtoledo e 1 visitante


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro