Jump to content
Fivewin Brasil

Registro online boleto Bradesco


Wellington Vieira

Recommended Posts

Boa tarde,

Segue exemplo de registro online de boleto bancário BRADESCO, usando CAPICOM.DLL e MRBOLETO..

Algumas considerações.

[Fontes consultadas e utilizadas.]
https://github.com/JoseQuintas/sefazclass
https://github.com/fernandoathayde/hbnfe
http://www.pctoledo.com.br/forum/viewtopic.php?f=43&t=18664
CLASSE enviada pelo Rogerio Figueira em: 16/03/2015 do MRBOLETO

Obs. Registrar as DLL's que se encontram no GitHub do Sr. Jose Quintas ( "msxml5.dll", "msxml5r.dll", "capicom.dll") OU baixar em https://pt.dll-files.com/capicom.dll.html
As informações abaixo são do Sr. José Quintas em seu GitHub, de como registrar as dll's.

1) Copiar as DLLs
Se Windows 32 bits: copiar para c:\windows\system32
Se Windows 64 bits: copiar para c:\windows\syswow64

2) Registrar
Tem que ser na pasta conforme acima, porque tem mais de um regsvr32.exe no Windows
E como administrador. Pelo menos uma delas não aceita registrar como usuário comum.
regsvr32.exe capicom.dll
regsvr32.exe msxml5.dll

3) Somente certificados válidos, remova certificados vencidos

Obs. Eu coloquei na abertura do sistema, para verificar se esta registrada as dll's.

4) A TIP.LIB, tem que estar no projeto para as funções: //1-hb_SHA1(),224-hb_SHA224(),256-hb_SHA256(),384-hb_SHA384(),512-hb_SHA512() e HB_Base64Encode()

Obs. A EMPRESA QUE FOR UTILIZAR o software , TEM QUE REGISTRAR ESTE TIPO DE CONTRATO PARA USO DE REGISTRO ONLINE DE BOLETOS NO BRADESCO, ATRAVÉS DE SEU GERENTE. Não consegui anexar o Manual_Registro_de_Boleto_Bancario_Online, mas procurando na internet se acha, é o Guia de integração Versão 2.2 janeiro/2019 ( MANUAL TÉCNICO E LAYOUT REGISTRO ON-LINE DE BOLETOS DE COBRANÇA BRADESCO)

O Fonte abaixo tem as minhas tabelas, algumas rotinas que são usadas pelo meu software, mas o que interessa são as funções e classes da CAPICOM  e MRBOLETO.

CONSUMO DE WEBSERVICE (BRADESCO).

homologação -  "https://cobranca.bradesconetempresa.b.br/ibpjregistrotitulows/registrotitulohomologacao"
produção        -  "https://cobranca.bradesconetempresa.b.br/ibpjregistrotitulows/registrotitulo"}

function gera_boleto_nf_pedido(objetboleto)
         LOCAL cSignatureValue, cDigestValue, cPublicKey
		 
		 asamplzboletos   = {}
         arecboletos      = {}
		 xncertificado    = ""
		 xnpfxcertificado = ""
		 xnpfxsenha       = ""
		 xnurlbanco       = ""
		 
		 tseqconf = 1
         cwQuery := "select * from adconfiggeral where "+;
                    "seqconf = " + alltrim(str(tseqconf))  +" order by seqconf asc;"
         owQuery := oServer:Query(cwQuery)
         zxboletogeral   = owQuery:Fieldget(owQuery:Fieldpos('boletogeral'))
		 owQuery:destroy()
		 
         cquery := "select fncaixas.seqcaixa,fncaixas.descricaocaixa,contaboleto.* from fncaixas,contaboleto where" +;
                   " fncaixas.seqcaixa = contaboleto.caixa"
		 //cquery += " and substr(fncaixas.descricaocaixa,1"+","+alltrim(str(len(alltrim(opesquisaunidade:cText))))+")"+;
         //          " = " + "'"+alltrim(opesquisaunidade:cText)+"'"
         if zxboletogeral = .f.
		    cquery += " and contaboleto.loja = " + alltrim(str(zseqloja))
	     endif
		 cquery += " order by fncaixas.descricaocaixa asc;"
         oquery := oServer:Query(cquery)
         tt = oquery:Fieldget(oquery:Fieldpos('seqcontaboleto'))
		 if empty(tt)
            oquery:destroy()
		    msgstop("Nenhum banco foi cadastrado para emissão de boleto bancário.","Atenção")
		    return nil
		 endif
         DO WHILE ! oquery:Eof()
            a = oquery:Fieldget(oquery:Fieldpos('seqcontaboleto'))
            b = oquery:Fieldget(oquery:Fieldpos('descricaocaixa'))
            aadd( asamplzboletos,{b,alltrim(str(a))} )
            aadd( arecboletos,a )
            oquery:Skip()
         END
         oquery:destroy()
		 
         nresp = fWait( "........* processando *........")
		 
		 if objetboleto = "Nfe"
		    
			qq = ver_marcado_nota()
            if qq = "N"
               oDlgWait:end()
               msgstop("Nenhuma nota fiscal foi marcada para o boleto.","Atenção")
               return nil
            endif
		    
            cQuery := "select * from ftnotafiscal where"+;
                      " seqnotafiscal = " + alltrim(str(mnr))+;
                      " order by seqnotafiscal asc;"
            oQuery := oServer:Query(cQuery)
            ncontroledocumento            = oQuery:Fieldget(oQuery:Fieldpos('controledocumento'))
            npstu                         = oQuery:Fieldget(oQuery:Fieldpos('statusdanotafiscal'))
            ntipovenda                    = oQuery:Fieldget(oQuery:Fieldpos('tipovenda'))
            ncodigodestinatario           = oQuery:Fieldget(oQuery:Fieldpos('codigodestinatario'))
			nDataemissao_a_gravar         = oQuery:Fieldget(oQuery:Fieldpos('dataemissao'))
			nNumerododocument_a_gravar    = "Boletos_Nfe" + "_" + alltrim(oQuery:Fieldget(oQuery:Fieldpos('numerodanf')))
			oQuery:destroy()
			
		    if npstu = "01"
               oDlgWait:end()
               msgstop("Esta nota não foi validada.","Atenção")
               return nil
            endif
            if val(npstu) <= 4
               oDlgWait:end()
               msgstop("Esta nota não foi autorizada.","Atenção")
               return nil
            endif
		    if npstu = "06"
               oDlgWait:end()
               msgstop("Esta nota foi cancelada.","Atenção")
               return nil
            endif
		    if npstu = "08"
               oDlgWait:end()
               msgstop("Esta nota foi denegada.","Atenção")
               return nil
            endif
		    if ntipovenda != 2
               oDlgWait:end()
               msgstop("Esta nota não foi a prazo.","Atenção")
               return nil
		    endif
		 
		 elseif objetboleto = "Ped"
		    
			if empty(mPnumerodopedido)
               oDlgWait:end()
               msgstop("Sem pedido inicializado.","Atenção")
               return nil
            endif
			if empty(asamplzPEDpedido[1,1])
               oDlgWait:end()
               msgstop("Sem pedido inicializado.","Atenção")
               return nil
			endif
			if !empty(mPnumeronotafiscal)
               oDlgWait:end()
               msgstop("Foi gerado uma NF-e para este pedido, o boleto deve ser pela NFe.","Atenção")
               return nil
			endif
			
            cquery := "select * from ftpedido where "+;
                      "loja = " + alltrim(str(zseqloja)) +;
                      " and pedidoromaneio = 'P'"+;
					  " and entradasaida = 'S'"+;
                      " and numerodopedido = " + alltrim(str(mPnumerodopedido))
            cquery += " order by loja asc, numerodopedido asc;"
            oquery := oServer:Query(cquery)
            tseqpedido                 = oquery:Fieldget(oquery:Fieldpos('seqpedido'))
			ncontroledocumento         = oquery:Fieldget(oquery:Fieldpos('controledocumento'))
            tsituacaopedido            = oquery:Fieldget(oquery:Fieldpos('situacaopedido'))
            ncodigodestinatario        = oQuery:Fieldget(oQuery:Fieldpos('idcliente'))
            ntipovenda                 = oQuery:Fieldget(oQuery:Fieldpos('tipovenda'))
			nDataemissao_a_gravar      = oQuery:Fieldget(oQuery:Fieldpos('dataemissao'))
			nNumerododocument_a_gravar = "Boletos_Ped" + "_" + alltrim(str(oQuery:Fieldget(oQuery:Fieldpos('numerodopedido'))))
            oquery:destroy()
            if empty(tseqpedido)
               oDlgWait:end()
               msgstop("Pedido não encontrado","Atenção")
               return nil
            endif
            if tsituacaopedido = 1 .or. tsituacaopedido = 3
               oDlgWait:end()
               msgstop(iif(tsituacaopedido = 1,"Pedido em digitação.",iif(tsituacaopedido = 3,"Pedido cancelado.","")),"Atenção")
               return nil
            endif
		    if ntipovenda != 2
               oDlgWait:end()
               msgstop("Esta nota não foi a prazo.","Atenção")
               return nil
		    endif
		 
		 endif
		 
		 //Pesquisa por clientes
         cQuery := "select * from fncliente where "+;
                   "seqcliente = " + alltrim(str(ncodigodestinatario))
         cQuery += " order by seqcliente asc;"
         oQuery := oServer:Query(cQuery)
         rseqcliente           = oQuery:Fieldget(oQuery:Fieldpos('seqcliente'))
		 rpessoafisicajuridica = oQuery:Fieldget(oQuery:Fieldpos('pessoafisicajuridica'))
         rrazaosocial          = oQuery:Fieldget(oQuery:Fieldpos('razaosocial'))
         
		 rfantasia             = alltrim(oQuery:Fieldget(oQuery:Fieldpos('fantasia')))
		 rfantasia             = trata_boleto( rfantasia )
		 
         rendereco             = substr(oQuery:Fieldget(oQuery:Fieldpos('endereco')),1,40)
         rcomplemento          = oQuery:Fieldget(oQuery:Fieldpos('complemento'))
         rnumero               = oQuery:Fieldget(oQuery:Fieldpos('numero'))
         rbairro               = oQuery:Fieldget(oQuery:Fieldpos('bairro'))
         rcep                  = oQuery:Fieldget(oQuery:Fieldpos('cep'))
         rcidade               = oQuery:Fieldget(oQuery:Fieldpos('cidadeibge'))
         ruf                   = oQuery:Fieldget(oQuery:Fieldpos('uf'))
         rtelefone             = oQuery:Fieldget(oQuery:Fieldpos('telefone1'))
		 remail                = oQuery:Fieldget(oQuery:Fieldpos('email'))
		 rpessoacontato        = oQuery:Fieldget(oQuery:Fieldpos('pessoacontato'))
         rcnpjcpf              = oQuery:Fieldget(oQuery:Fieldpos('numerodocumentonacional'))
         rinscricaoestadualrg  = oQuery:Fieldget(oQuery:Fieldpos('numerodocumentolocal'))
         oquery:destroy()
		 if empty(rseqcliente)
            oDlgWait:end()
            msgstop("Cliente não encontrado.","Atenção")
            return nil
		 endif
		 if substr(rrazaosocial,1,10) = "CONSUMIDOR"
            oDlgWait:end()
            msgstop("Cliente não pode ser consumidor.","Atenção")
            return nil
		 endif
		 if empty(rcnpjcpf)
            oDlgWait:end()
            msgstop("CPF/CNPJ não informado.","Atenção")
            return nil
		 endif
		 if empty(rrazaosocial)
            oDlgWait:end()
            msgstop("Cliente sem razão social / Nome.","Atenção")
            return nil
		 endif
		 if empty(rendereco)
            oDlgWait:end()
            msgstop("Cliente sem endereço.","Atenção")
            return nil
		 endif
		 if empty(rnumero)
            oDlgWait:end()
            msgstop("Cliente sem número.","Atenção")
            return nil
		 endif
		 if empty(rbairro)
            oDlgWait:end()
            msgstop("Cliente sem bairro.","Atenção")
            return nil
		 endif
		 if empty(rcidade)
            oDlgWait:end()
            msgstop("Cliente sem cidade.","Atenção")
            return nil
		 endif
		 if empty(ruf)
            oDlgWait:end()
            msgstop("Cliente sem o estado.","Atenção")
            return nil
		 endif
		 if len(alltrim(rcep)) != 8
            oDlgWait:end()
            msgstop("Cep inconsistente.","Atenção")
            return nil
		 endif
		 
		 nNumerododocument_a_gravar = nNumerododocument_a_gravar + "_" + alltrim(rfantasia) + ".pdf"
		 
         
		 nOpcao   = CurDrive()+ ":\" + CurDir() + "\boletos"
		 if !IsDirectory(nOpcao)
		    lmkdir(nOpcao)
		 endif
         nOpcao   = CurDrive()+ ":\" + CurDir() + "\boletos\" + substr(dtos(nDataemissao_a_gravar),5,2) + substr(dtos(nDataemissao_a_gravar),1,4)
		 if !IsDirectory(nOpcao)
		    lmkdir(nOpcao)
		 endif
         nOpcao   = CurDrive()+ ":\" + CurDir() + "\boletos\" + substr(dtos(nDataemissao_a_gravar),5,2) + substr(dtos(nDataemissao_a_gravar),1,4) + "\" + substr(nNumerododocument_a_gravar,9,3)
		 if !IsDirectory(nOpcao)
		    lmkdir(nOpcao)
		 endif
		 
		 cFilePdf = CurDrive()+ ":\" + CurDir() + "\boletos\" + substr(dtos(nDataemissao_a_gravar),5,2) + substr(dtos(nDataemissao_a_gravar),1,4) + "\" + substr(nNumerododocument_a_gravar,9,3) + + "\" + nNumerododocument_a_gravar
		 
		 if file( cFilePdf )
            oDlgWait:end()
			if msgyesno("Deseja reimprimir o boleto ?","Atenção") = .t.
			   //if file( Curdrive() + ":\" + CurDir() + "\" + "sumatrapdf.exe" )
		       //   winexec( Curdrive() + ":\" + CurDir() + "\" + "sumatrapdf.exe " + cFilePdf )
		       //else
                  run("explorer.exe " + cFilePdf )
		       //endif
			endif
            return nil
         endif

		 mpassaverificavencimento = "S"
		 mpassaverificaseboleto   = "N"
		 tdescricaomeiospagamento = ""
		 ttnnqq = 1
		 cquery := "select * from fntitulosclientefornecedor where"+;
                   " controledocumento = " + alltrim(str(ncontroledocumento))+;
                   " order by datavencimento asc;"
         oquery := oServer:Query(cquery)
         aseqtitulo = oquery:Fieldget(oquery:Fieldpos('seqtitulo'))
		 if !empty(aseqtitulo)
		    do while !oquery:eof()
			   andup          = oquery:Fieldget(oquery:Fieldpos('numeroordem'))
               advenc         = oquery:Fieldget(oquery:Fieldpos('datavencimento'))
               avdup          = oquery:Fieldget(oquery:Fieldpos('valortitulo'))
		       tMeiopagamento = oquery:Fieldget(oquery:Fieldpos('idmeiospagamento'))
               
			   cwquery := "select * from fnmeiospagamento where "+;
                          "seqmeiospagamento = " + alltrim(str(tMeiopagamento))
               cwquery += " order by seqmeiospagamento asc;"
               owquery := oServer:Query(cwquery)
               tgeneromeiospagamento     = alltrim(upper(owquery:Fieldget(owquery:Fieldpos('generomeiospagamento'))))    // BOLETO
			   tdescricaomeiospagamento  = owquery:Fieldget(owquery:Fieldpos('descricaomeiospagamento'))
		       tidmeionf                 = owquery:Fieldget(owquery:Fieldpos('idmeionf'))
		       owquery:destroy()
			   
			   if objetboleto = "Ped"
			      if alltrim(upper(tgeneromeiospagamento)) = "BOLETO"
			         if ttnnqq = 1
				        tidmeionf = 15
				        mpassaverificaseboleto = "S"
					    ++ttnnqq
				     endif
				  else 
				     tidmeionf = 99
				  endif
			   endif
			   
               if tidmeionf = 15
			      if ttnnqq = 1
				     mpassaverificaseboleto = "S"
					 ++ttnnqq
				  endif
			      if advenc < ldate
				     mpassaverificavencimento = "N"
					 exit
				  endif
               endif
			   oquery:skip()
            end
		    oquery:destroy()
		 endif
		 if mpassaverificavencimento = "N"
            oDlgWait:end()
		    msgstop("O título " + alltrim(andup) + " no valor de R$ " + alltrim(transform(avdup,"@e 999,999,999.99")) +;
   			        " a data de vencimento " + substr(dtos(advenc),7,2) + "/" + substr(dtos(advenc),5,2) + "/" + substr(dtos(advenc),1,4) +;
					" é inferior a data de emissão do boleto " + substr(dtos(ldate),7,2) + "/" + substr(dtos(ldate),5,2) + "/" + substr(dtos(ldate),1,4) +;
					". Favor alterar a data de vencimento do título ou o meio de pagamento. ","Atenção")
			return nil 
		 endif
		 if mpassaverificaseboleto = "N"
		    if !empty(tdescricaomeiospagamento)
			   oDlgWait:end()
			   msgstop("Contas a receber gerado é " + alltrim(tdescricaomeiospagamento),"Atenção")
		       return nil
			else
			   oDlgWait:end()
			   msgstop("Sem contas a receber localizado.","Atenção")
		       return nil
			endif
		 endif
		 
		 mlinha1 = iif(rpessoafisicajuridica = "J",transform(rcnpjcpf,"@r 99.999.999/9999-99"),transform(rcnpjcpf,"@r 999.999.999-99"))
         mlinha2 = alltrim(rrazaosocial)
         mlinha3 = "Endereço: " + alltrim(rendereco) + "," + alltrim(rnumero) + iif(!empty(rcomplemento),"-"+alltrim(rcomplemento),"") +;
                   " Bairro: " + alltrim(rbairro)
		 mlinha4 = "Cep: " + transform(alltrim(rcep),"@r 99.999-999") + " " + " Cidade: " + alltrim(rcidade) + "/"  + ruf

		 nEscolheuboletos = "N"
		 define dialog emissao_boleto title "" from 000,000 to 650,595 Pixel transparent
                @ 005,005 say "Escolha o banco para emitir o boleto" font mtahomagrandeletra size 300,17 of emissao_boleto color corfrtsayds,corfdogetnotafiscal pixel
                @ 025,005 listbox obrzboletos fields asamplzboletos[obrzboletos:nat,1],asamplzboletos[obrzboletos:nat,2];
                          headers "Banco","Cd" FIELDSIZES 485,020;
                          size 288,290;
                          pixel of emissao_boleto font mtahomagg
                obrzboletos:nLineStyle := 2
                obrzboletos:lCellStyle = .t.
                obrzboletos:lAutoSkip  = .t.
                obrzboletos:SetArray(asamplzboletos)
                obrzboletos:bGoTop = { || obrzboletos:nat := 1 }
                obrzboletos:bGoBottom = { || obrzboletos:nat := Eval( obrzboletos:bLogicLen ) }
                obrzboletos:bSkip = { | nWant, nOld | nOld := obrzboletos:nat, obrzboletos:nat += nWant,;
                obrzboletos:nat := Max( 1, Min( obrzboletos:nat, Eval( obrzboletos:bLogicLen ) ) ),;
                obrzboletos:nat - nOld }
                obrzboletos:bLogicLen = { || Len( asamplzboletos ) }
                obrzboletos:cAlias = "Array"
                obrzboletos:nColAct       := 1
                obrzboletos:lMChange      := .F.
                obrzboletos:SetFocus()
                obrzboletos:Refresh()
		 		
		 	    emissao_boleto:bKeyDown := {|nKey| IIf( nKey == VK_RETURN, ((nEscolheuboletos := "S"),emissao_boleto:end()) ,0)}
		 		
		 activate dialog emissao_boleto center
		 if nEscolheuboletos = "N"
            oDlgWait:end()
		    return nil
		 endif
		 
		 mseqctaboleto = arecboletos[obrzboletos:nat]
		 
		 if IsInternet() == .f.
            oDlgWait:end()
            msgstop("Necessário conexão com internet." + CRLF + "Operação cancelada","Informação")
			return nil
         endif
		 
         cwquery := "select * from contaboleto where "+;
                    "seqcontaboleto = " + alltrim(str(mseqctaboleto)) + " order by seqcontaboleto asc;"
         owquery := oServer:Query(cwquery)
         xnloja           =  owquery:Fieldget(owquery:Fieldpos('loja'))           //smallint
         xncaixa          =  owquery:Fieldget(owquery:Fieldpos('caixa'))          //integer
         xnbanco          =  owquery:Fieldget(owquery:Fieldpos('banco'))          //character(50)
         xnagencia        =  owquery:Fieldget(owquery:Fieldpos('agencia'))        //character(08)
         xndagencia       =  owquery:Fieldget(owquery:Fieldpos('dagencia'))       //character(02)
         xndagencia_Un    =  owquery:Fieldget(owquery:Fieldpos('dagencia_Un'))    //character(02)
         xnconta          =  owquery:Fieldget(owquery:Fieldpos('conta'))          //character(15)
         xndconta         =  owquery:Fieldget(owquery:Fieldpos('dconta'))         //character(02)
         xnoperacao       =  owquery:Fieldget(owquery:Fieldpos('operacao'))       //character(02)
         xncarteira       =  owquery:Fieldget(owquery:Fieldpos('carteira'))       //character(15)
         xntpcarteira     =  owquery:Fieldget(owquery:Fieldpos('tpcarteira'))     //character(15)
         xnnossonumerobco =  owquery:Fieldget(owquery:Fieldpos('nossonumero'))    //character(15)
		 xnnMusarnosso    =  owquery:Fieldget(owquery:Fieldpos('usarnosso'))      //boolean
         xnprefixo        =  owquery:Fieldget(owquery:Fieldpos('prefixo'))        //character(08)
         xndprefixo       =  owquery:Fieldget(owquery:Fieldpos('dprefixo'))       //character(02)
         xnaceite         =  owquery:Fieldget(owquery:Fieldpos('aceite'))         //character(02)
         xnespecie        =  owquery:Fieldget(owquery:Fieldpos('especie'))        //character(02)
         xnlocalpagamento =  owquery:Fieldget(owquery:Fieldpos('localpagamento')) //character(200)
         xnvias           =  owquery:Fieldget(owquery:Fieldpos('vias'))           //character(02)
         xninstrucao      =  owquery:Fieldget(owquery:Fieldpos('instrucao'))      //text
         xndemonstrativo  =  owquery:Fieldget(owquery:Fieldpos('demonstrativo'))  //text
		 xncertificado    =  owquery:Fieldget(owquery:Fieldpos('certificado'))    //Certificado instalado no windows
		 xnemitido        =  owquery:Fieldget(owquery:Fieldpos('emitido'))        //Data de emissão do certificado
		 xnvalidade       =  owquery:Fieldget(owquery:Fieldpos('validade'))       //Validade do certificado
         xnpfxcertificado =  alltrim(owquery:Fieldget(owquery:Fieldpos('pfxcertificado'))) //Arquivo pfx do certificado
         xnpfxsenha       =  alltrim(owquery:Fieldget(owquery:Fieldpos('pfxsenha')))       //Senha do arquivo pfx do certificado
         xnurlbanco       =  alltrim(owquery:Fieldget(owquery:Fieldpos('urlbanco')))       //url de envido de registro de boleto do Bradesco
         owquery:destroy()
		
         cwQuery := "select * from adloja where seqloja = " + alltrim(str(xnloja))
         owQuery := oServer:Query(cwQuery)
         aaloja = owquery:Fieldget(owquery:Fieldpos('numerodocumentonacional'))
         abloja = owquery:Fieldget(owquery:Fieldpos('razaosocial'))
         acloja = owquery:Fieldget(owquery:Fieldpos('endereco'))
         adloja = owquery:Fieldget(owquery:Fieldpos('numero'))
         aeloja = owquery:Fieldget(owquery:Fieldpos('complemento'))
         afloja = owquery:Fieldget(owquery:Fieldpos('bairro'))
         agloja = owquery:Fieldget(owquery:Fieldpos('cep'))
         ahloja = owquery:Fieldget(owquery:Fieldpos('cidadeibge'))
         ailoja = owquery:Fieldget(owquery:Fieldpos('uf'))
         owQuery:destroy()
		 
		 mlinh1 = "CNPJ: " + transform(alltrim(aaloja),"@r 99.999.999-9999/99")
         mlinh2 = alltrim(abloja)
         mlinh3 = alltrim(acloja) + "," + alltrim(adloja) + iif(!empty(aeloja),"-"+alltrim(aeloja),"") +;
                  " B:" + alltrim(afloja) + " " + transform(alltrim(agloja),"@r 99.999-999") + " " + alltrim(ahloja) + "/"  + ailoja
		 
		 if substr(xnbanco,1,3) = "237" // bradesco
            
			if !empty(xncertificado)
		       if ldate > xnvalidade
                  msgstop("Certificado com validade vencida.","Atenção")
			      oDlgWait:end()
		          return nil
			   endif
			else
			   if empty(xnpfxcertificado)
                  msgstop("Arquivo pfx não informado.","Atenção")
			      oDlgWait:end()
		          return nil
		       endif
			   if empty(xnpfxsenha)
                  msgstop("Senha do arquivo pfx não informado.","Atenção")
			      oDlgWait:end()
		          return nil
		       endif
		    endif
			if empty(xnurlbanco)
               msgstop("URL de registro online do boleto Bradesco não informado.","Atenção")
			   oDlgWait:end()
		       return nil
			endif
			
		 endif
		 
		 nregistroutitulo = "N"
		 cquery := "select * from fntitulosclientefornecedor where"+;
                   " controledocumento = " + alltrim(str(ncontroledocumento))+;
				   " and boletoemitido != " + "'"+ "y" + "'"+;
                   " order by datavencimento asc;"
         oquery := oServer:Query(cquery)
         aseqtitulo = oquery:Fieldget(oquery:Fieldpos('seqtitulo'))
		 if !empty(aseqtitulo)
		    do while !oquery:eof()
               aseq           = oquery:Fieldget(oquery:Fieldpos('seqtitulo'))
               andup          = oquery:Fieldget(oquery:Fieldpos('numeroordem'))
               advenc         = oquery:Fieldget(oquery:Fieldpos('datavencimento'))
               avdup          = oquery:Fieldget(oquery:Fieldpos('valortitulo'))
		       tMeiopagamento = oquery:Fieldget(oquery:Fieldpos('idmeiospagamento'))
			   if xnnMusarnosso = .t.
			      tnossonumerosequencia = oquery:Fieldget(oquery:Fieldpos('nossonumerosequencia'))
			   else
			      tnossonumerosequencia = oquery:Fieldget(oquery:Fieldpos('nossonumerobancario'))
			   endif
			   if !empty(tnossonumerosequencia)
			      oquery:skip()
				  loop
			   endif
		       
		       cwquery := "select * from fnmeiospagamento where "+;
                          "seqmeiospagamento = " + alltrim(str(tMeiopagamento))
               cwquery += " order by seqmeiospagamento asc;"
               owquery := oServer:Query(cwquery)
               tgeneromeiospagamento     = alltrim(upper(owquery:Fieldget(owquery:Fieldpos('generomeiospagamento'))))    // BOLETO
		       tidmeionf                 = owquery:Fieldget(owquery:Fieldpos('idmeionf'))
		       owquery:destroy()
			   
			   if objetboleto = "Ped"
			      if alltrim(upper(tgeneromeiospagamento)) = "BOLETO"
				     tidmeionf = 15
				  else 
				     tidmeionf = 99
				  endif
			   endif
		       
               if tidmeionf = 15
			   
				  _nxgravarnumero = ""
				  _nxgravarnumeroPego = ""
				  
				  if xnnMusarnosso = .t.
				     oBoleto  := MR_Boleto():New( "nosso_numero.pdf" )
				     oBoleto:Banco________ := substr(xnbanco,1,3)
                     oBoleto:Banco_Agencia := alltrim(xnagencia)
                     oBoleto:Banco_Ag_Dv__ := iif(empty(xndagencia),"",alltrim(xndagencia))
                     oBoleto:Banco_Ag_Un_A := iif(empty(xndagencia_Un),"",alltrim(xndagencia_Un))
                     oBoleto:Conta________ := alltrim(xnconta)
                     oBoleto:Conta_DV_____ := alltrim(xndconta)
                     oBoleto:Conta_OP_____ := iif(empty(xnoperacao),"","'" + alltrim(xnoperacao))
                     oBoleto:Carteira_____ := alltrim(xncarteira)
                     oBoleto:Carteira_Tipo := iif(empty(xntpcarteira),"",alltrim(xntpcarteira))
                     oBoleto:NossoNumero__ := alltrim(xnnossonumerobco)
                     oBoleto:Doc_Origem___ := iif( substr(nNumerododocument_a_gravar,9,3) = "Ped","DM","DM")
                     oBoleto:Prefixo______ := iif(empty(xnprefixo),"",alltrim(xnprefixo))
                     oBoleto:Prefixo_DV___ := iif(empty(xndprefixo),"",alltrim(xndprefixo))
                     oBoleto:Doc_Numero___ := alltrim(andup)
                     oBoleto:Doc_Aceite___ := alltrim(xnaceite)
                     oBoleto:Doc_Especie__ := alltrim(xnespecie)
                     oBoleto:Doc_Data_____ := ldate //nDataemissao_a_gravar
                     oBoleto:Vencimento___ := advenc
                     oBoleto:Valor________ := avdup
                     oBoleto:Multa_Auto___ := iif(empty(zfinmultaatraso),0,zfinmultaatraso)
                     oBoleto:Juros_Mes____ := iif(empty(zfintaxajurosmensal),0,zfintaxajurosmensal)
                     oBoleto:Numero_Vias__ := val(xnvias)
                     oBoleto:Local_Pagamen := { xnlocalpagamento }
				     oBoleto:Instrucoes___ := { "","" }
                     oBoleto:Demonstrativo := { "","","","","","","","","","","","","","","" }
                     oBoleto:Cedente______ := { mlinh1,mlinh2,mlinh3}
                     oBoleto:Sacado_______ := { mlinha1,mlinha2,mlinha3,mlinha4 }
				     oBoleto:Avalista_____ := { "Não informado.", "", "" }
				     oBoleto:AddPage()
			         oBoleto:Finish()
					 _nxgravarnumero = alltrim(oBoleto:NossoNumero__)
				     delete file "nosso_numero.pdf"
				  endif
				  
				  if substr(xnbanco,1,3) = "237" // bradesco
				  	 
					 narquivoJSON := '{'
                     narquivoJSON += '"nuCPFCNPJ":'                            + '"' + substr(alltrim(aaloja),1,8)               + '",'
                     narquivoJSON += '"filialCPFCNPJ":'                        + '"' + substr(alltrim(aaloja),9,4)               + '",'
                     narquivoJSON += '"ctrlCPFCNPJ":'                          + '"' + substr(alltrim(aaloja),13,2)              + '",'
                     narquivoJSON += '"cdTipoAcesso":'                         + '"' + '2'                                       + '",'
				  	 narquivoJSON += '"clubBanco":'                            + '"' + '0'                                       + '",'
                     narquivoJSON += '"cdTipoContrato":'                       + '"' + '0'                                       + '",'
				  	 narquivoJSON += '"nuSequenciaContrato":'                  + '"' + '0'                                       + '",'
                     narquivoJSON += '"idProduto":'                            + '"' + strzero(val(xncarteira),2)                + '",'
				  	 narquivoJSON += '"nuNegociacao":'                         + '"' + alltrim(xnagencia) + '0000000' + alltrim(xnconta) + '",'
                     narquivoJSON += '"cdBanco":'                              + '"' + substr(xnbanco,1,3)                       + '",'
                     narquivoJSON += '"eNuSequenciaContrato":'                 + '"' + '0'                                       + '",'
                     narquivoJSON += '"tpRegistro":'                           + '"' + '1'                                       + '",'
                     narquivoJSON += '"cdProduto":'                            + '"' + '0'                                       + '",'
                     narquivoJSON += '"nuTitulo":'                             + '"' + iif(empty(_nxgravarnumero),'0',_nxgravarnumero) + '",'
                     narquivoJSON += '"nuCliente":'                            + '"' + substr(alltrim(andup),1,10)               + '",'
                     narquivoJSON += '"dtEmissaoTitulo":'                      + '"' + substr(dtos(ldate),7,2)  + "." + substr(dtos(ldate),5,2)  + "." + substr(dtos(ldate),1,4)  + '",'
                     narquivoJSON += '"dtVencimentoTitulo":'                   + '"' + substr(dtos(advenc),7,2) + "." + substr(dtos(advenc),5,2) + "." + substr(dtos(advenc),1,4) + '",'
                     narquivoJSON += '"tpVencimento":'                         + '"' + '0'                                       + '",'
                     narquivoJSON += '"vlNominalTitulo":'                      + '"' + alltrim(str(int(avdup * 100)))            + '",'
                     narquivoJSON += '"cdEspecieTitulo":'                      + '"' + '02'                                      + '",'
                     narquivoJSON += '"tpProtestoAutomaticoNegativacao":'      + '"' + '0'                                       + '",'
                     narquivoJSON += '"prazoProtestoAutomaticoNegativacao":'   + '"' + '0'                                       + '",'
                     narquivoJSON += '"controleParticipante":'                 + '"' + ''                                        + '",'
                     narquivoJSON += '"cdPagamentoParcial":'                   + '"' + ''                                        + '",'
                     narquivoJSON += '"qtdePagamentoParcial":'                 + '"' + '0'                                       + '",'
                     narquivoJSON += '"percentualJuros":'                      + '"' + '0'                                       + '",'
                     narquivoJSON += '"vlJuros":'                              + '"' + '0'                                       + '",'
                     narquivoJSON += '"qtdeDiasJuros":'                        + '"' + '0'                                       + '",'
                     narquivoJSON += '"percentualMulta":'                      + '"' + '0'                                       + '",'
                     narquivoJSON += '"vlMulta":'                              + '"' + '0'                                       + '",'
                     narquivoJSON += '"qtdeDiasMulta":'                        + '"' + '0'                                       + '",'
                     narquivoJSON += '"percentualDesconto1":'                  + '"' + '0'                                       + '",'
                     narquivoJSON += '"vlDesconto1":'                          + '"' + '0'                                       + '",'
                     narquivoJSON += '"dataLimiteDesconto1":'                  + '"' + ''                                        + '",'
                     narquivoJSON += '"percentualDesconto2":'                  + '"' + '0'                                       + '",'
                     narquivoJSON += '"vlDesconto2":'                          + '"' + '0'                                       + '",'
                     narquivoJSON += '"dataLimiteDesconto2":'                  + '"' + ''                                        + '",'
                     narquivoJSON += '"percentualDesconto3":'                  + '"' + '0'                                       + '",'
                     narquivoJSON += '"vlDesconto3":'                          + '"' + '0'                                       + '",'
                     narquivoJSON += '"dataLimiteDesconto3":'                  + '"' + ''                                        + '",'
                     narquivoJSON += '"prazoBonificacao":'                     + '"' + '0'                                       + '",'
                     narquivoJSON += '"percentualBonificacao":'                + '"' + '0'                                       + '",'
                     narquivoJSON += '"vlBonificacao":'                        + '"' + '0'                                       + '",'
                     narquivoJSON += '"dtLimiteBonificacao":'                  + '"' + ''                                        + '",'
                     narquivoJSON += '"vlAbatimento":'                         + '"' + '0'                                       + '",'
                     narquivoJSON += '"vlIOF":'                                + '"' + '0'                                       + '",'
				  	 narquivoJSON += '"nomePagador":'                          + '"' + alltrim(rrazaosocial)                     + '",'
                     narquivoJSON += '"logradouroPagador":'                    + '"' + alltrim(rendereco)                        + '",'
                     narquivoJSON += '"nuLogradouroPagador":'                  + '"' + alltrim(rnumero)                          + '",'
                     narquivoJSON += '"complementoLogradouroPagador":'         + '"' + iif(empty(alltrim(rcomplemento)),'',alltrim(rcomplemento)) + '",'
                     narquivoJSON += '"cepPagador":'                           + '"' + substr(alltrim(rcep),1,5)                 + '",'
                     narquivoJSON += '"complementoCepPagador":'                + '"' + substr(alltrim(rcep),6,3)                 + '",'
                     narquivoJSON += '"bairroPagador":'                        + '"' + alltrim(rbairro)                          + '",'
                     narquivoJSON += '"municipioPagador":'                     + '"' + alltrim(rcidade)                          + '",'
                     narquivoJSON += '"ufPagador":'                            + '"' + ruf                                       + '",'
				  	 narquivoJSON += '"cdIndCpfcnpjPagador":'                  + '"' + iif(len(alltrim(rcnpjcpf)) = 11,'1','2')  + '",'
                     narquivoJSON += '"nuCpfcnpjPagador":'                     + '"' + alltrim(rcnpjcpf)                         + '",'
                     narquivoJSON += '"endEletronicoPagador":'                 + '"' + ''                                        + '",'
                     narquivoJSON += '"nomeSacadorAvalista":'                  + '"' + ''                                        + '",'
                     narquivoJSON += '"logradouroSacadorAvalista":'            + '"' + ''                                        + '",'
                     narquivoJSON += '"nuLogradouroSacadorAvalista":'          + '"' + '0'                                       + '",'
                     narquivoJSON += '"complementoLogradouroSacadorAvalista":' + '"' + ''                                        + '",'
                     narquivoJSON += '"cepSacadorAvalista":'                   + '"' + '0'                                       + '",'
                     narquivoJSON += '"complementoCepSacadorAvalista":'        + '"' + '0'                                       + '",'
                     narquivoJSON += '"bairroSacadorAvalista":'                + '"' + ''                                        + '",'
                     narquivoJSON += '"municipioSacadorAvalista":'             + '"' + ''                                        + '",'
                     narquivoJSON += '"ufSacadorAvalista":'                    + '"' + ''                                        + '",'
                     narquivoJSON += '"cdIndCpfcnpjSacadorAvalista":'          + '"' + '0'                                       + '",'
                     narquivoJSON += '"nuCpfcnpjSacadorAvalista":'             + '"' + '0'                                       + '",'
                     narquivoJSON += '"endEletronicoSacadorAvalista":'         + '"' + ''                                        + '"' 
		             narquivoJSON += '}'
                     
					 //1-hb_SHA1(),224-hb_SHA224(),256-hb_SHA256(),384-hb_SHA384(),512-hb_SHA512()
					 cDigestValue    := CapicomClass():HashData(narquivoJSON,256)
					 cSignatureValue := CapicomClass():Sign( cDigestValue, , , @cPublicKey )
					 cDigestValue     = CapicomClass():VerifySignature( cSignatureValue )
					 if IsValidSignatureCapicom( cDigestValue, cSignatureValue ) = .f.
					    exit
					 endif
					 
                     _cresposta := ""
                     try
					    _oserver := CreateObject( "MSXML2.XMLHTTP" )
					    _oserver:Open( "POST", xnurlbanco, .F. )
					    _oserver:SetRequestHeader("Content-Type","application/json")
	                    _oserver:Send(cSignatureValue)
	                    WHILE _oserver:readyState != 4
	                          _oserver:WaitForResponse( 500 )
	                    end
						_cresposta := _oserver:responseText
	                 catch
	                    msgstop("Erro no envio do arquivo json do boleto para o Bradesco.","Atenção")
						exit
	                 end
					 if _cresposta = nil
					    msgstop("Sem resposta do Bradesco.","Atenção")
						exit
					 endif
					 if empty(_cresposta)
					    msgstop("Sem resposta do Bradesco.","Atenção")
					    exit
					 endif
					 _cresposta = StrTran(_cresposta,Chr(13) + Chr(10), "" )
					 _nresposta = ""
					 _ninicia   = "N"
					 _ncaracter = 0
					 for ttqq = 1 to len(_cresposta)
					 	 if substr(_cresposta,ttqq,1) = "{"
					 	    _nresposta = _nresposta + substr(_cresposta,ttqq,1)
					 	    _ninicia = "S"
					 	 elseif substr(_cresposta,ttqq,1) = "}"
					 	    _nresposta = _nresposta + substr(_cresposta,ttqq,1)
					        _ninicia = "N"
					 	 elseif _ninicia = "S"
					 	    if substr(_cresposta,ttqq,1) = '"' .and. _ncaracter = 0
					 	 	   _nresposta = _nresposta + substr(_cresposta,ttqq,1)
					 	 	   ++_ncaracter
					 	 	elseif substr(_cresposta,ttqq,1) = '"' .and. _ncaracter = 3
					 	 	   _nresposta = _nresposta + substr(_cresposta,ttqq,1)
					 	 	   _ncaracter = 0
					 	 	elseif substr(_cresposta,ttqq,1) = '"' .and. _ncaracter != 0
					 	 	   ++_ncaracter
					 	 	else
					 	 	   _nresposta = _nresposta + substr(_cresposta,ttqq,1)
					 	 	endif
					 	 endif
					 next
					 
					 _nretarray := &_nresposta
					 
					 _nMotivo = ""
					 _nPassa  = "N"
					 for ttqq = 1 to len(_nretarray[1])
					     if substr(_nretarray[1],ttqq,1) = ":"
					        _nPassa = "S"
					     elseif _nPassa = "S"
						    _nMotivo = _nMotivo + substr(_nretarray[1],ttqq,1)
						 endif
					 next
					 if _nMotivo = "800"
					    msgstop("Erro Certificado / Formatação dos campos da mensagem inválida.","Atenção")
						exit
					 elseif _nMotivo = "810"
					    msgstop("Erro Certificado / Formatação dos campos da mensagem inválida.","Atenção")
						exit
					 elseif empty(_nMotivo)
					    msgstop("Erro. Motivo não catalogado.","Atenção")
						exit
					 else
					    msn = "S"
				        if _nMotivo != "00" .or. _nMotivo != "05"
					       msn = "N"
					       for ttqq = 1 to len(respostaJSONbra)
					  	       if respostaJSONbra[ttqq,1] = _nMotivo
					  	 	      //_nMotivo = _nMotivo + " | " + respostaJSONbra[ttqq,2]
					  	 	      _nMotivo = respostaJSONbra[ttqq,2]
					  	 	      exit
					  	 	   endif
					  	   next
				        endif  
					    if msn = "N"  
					       msgstop(_nMotivo,"Atenção")
					       exit
				        endif
				     endif
					 
					 // Pega o nosso numero gerado pelo banco....................
					 _nxgravarnumeroPego = ""
					 _nPassa  = "N"
					 for ttqq = 1 to len(_nretarray[9])
					     if substr(_nretarray[9],ttqq,1) = ":"
					        _nPassa = "S"
					     elseif _nPassa = "S"
						    _nxgravarnumeroPego = _nxgravarnumeroPego + substr(_nretarray[9],ttqq,1)
						 endif
					 next
					 if empty(_nxgravarnumeroPego)
					    msgstop("Não foi gerado nosso número pelo banco bradesco.","Atenção")
						exit
					 endif
					 
					 // aqui ...
                     msginfo(_nxgravarnumeroPego)
                     exit
				  
				  endif
				  
				  if xnnMusarnosso = .t.
				     cwquery := "Update fntitulosclientefornecedor set banco = " + alltrim(str(mseqctaboleto))
				     cwquery += ",boletoemitido = 'n'"
				     cwquery += ",dataemissaoboleto = " + "'"+ substr(dtos(ldate),1,4) + "-" + substr(dtos(ldate),5,2) + "-" + substr(dtos(ldate),7,2) +"'"
				     cwquery += ",nossonumerosequencia = " + alltrim(xnnossonumerobco)
                     cwquery += " where seqtitulo = " + alltrim(str(aseq))
                     owquery := oServer:Query(cwquery)
                     if owquery:neterr()
                        msgstop("Não foi possível realizar a alteração do nosso número.","Atenção")
                     endif
                     owquery:destroy()
                     oServer:Commit()
				     
					 xnovonumerobco   = alltrim(str(val(xnnossonumerobco) + 1))
				     xnnossonumerobco = xnovonumerobco + space(15 - len(xnovonumerobco) )
				     cwquery := "Update contaboleto set nossonumero = " + "'" + xnnossonumerobco + "'"+;
                                " where seqcontaboleto = " + alltrim(str(mseqctaboleto))
                     owquery := oServer:Query(cwquery)
                     if owquery:neterr()
                        msgstop("Não foi possível realizar a alteração do nosso número.","Atenção")
                     endif
                     owquery:destroy()
                     oServer:Commit()
				  else
				     cwquery := "Update fntitulosclientefornecedor set banco = " + alltrim(str(mseqctaboleto))
				     cwquery += ",boletoemitido = 'y'"
				     cwquery += ",dataemissaoboleto = " + "'"+ substr(dtos(ldate),1,4) + "-" + substr(dtos(ldate),5,2) + "-" + substr(dtos(ldate),7,2) +"'"
			         cwquery += ",nossonumerobancario = " + "'"+ alltrim(_nxgravarnumeroPego) + space(20 - len(alltrim(_nxgravarnumeroPego)) ) +"'"
                     cwquery += " where seqtitulo = " + alltrim(str(aseq))
                     owquery := oServer:Query(cwquery)
                     if owquery:neterr()
                        msgstop("Não foi possível realizar a alteração do nosso número.","Atenção")
                     endif
                     owquery:destroy()
                     oServer:Commit()
				  endif
				  
				  //nregistroutitulo = "S"

               endif
		       oquery:skip()
            end
		 endif
         oquery:destroy()
		 if nregistroutitulo = "N"
            oDlgWait:end()
		    return nil
		 endif
		 
		 // GERA EM PDF O BOLETO BANCÁRIO
		 cquery := "select * from fntitulosclientefornecedor where"+;
                   " controledocumento = " + alltrim(str(ncontroledocumento))+;
                   " order by datavencimento asc;"
         oquery := oServer:Query(cquery)
         aseqtitulo = oquery:Fieldget(oquery:Fieldpos('seqtitulo'))
		 if !empty(aseqtitulo)
		    nnescolhe = 1
		    do while !oquery:eof()
               aseq           = oquery:Fieldget(oquery:Fieldpos('seqtitulo'))
               andup          = oquery:Fieldget(oquery:Fieldpos('numeroordem'))
               advenc         = oquery:Fieldget(oquery:Fieldpos('datavencimento'))
               avdup          = oquery:Fieldget(oquery:Fieldpos('valortitulo'))
			   ldataemissao   = oquery:Fieldget(oquery:Fieldpos('dataemissaoboleto'))
		       tMeiopagamento = oquery:Fieldget(oquery:Fieldpos('idmeiospagamento'))
			   if xnnMusarnosso = .t.
			      tnossonumerosequencia = alltrim(str(oquery:Fieldget(oquery:Fieldpos('nossonumerosequencia'))))
			   else
			      tnossonumerosequencia = oquery:Fieldget(oquery:Fieldpos('nossonumerobancario'))
			   endif
			   if empty(tnossonumerosequencia)
			      oquery:skip()
				  loop
			   endif

		       cwquery := "select * from fnmeiospagamento where "+;
                          "seqmeiospagamento = " + alltrim(str(tMeiopagamento))
               cwquery += " order by seqmeiospagamento asc;"
               owquery := oServer:Query(cwquery)
               tgeneromeiospagamento     = alltrim(upper(owquery:Fieldget(owquery:Fieldpos('generomeiospagamento'))))    // BOLETO
		       owquery:destroy()
		       
		 	   if nnescolhe = 1
		 	      ++nnescolhe
			      oBoleto  := MR_Boleto():New( cFilePdf )
		 	   endif
			   oBoleto:Banco________ := substr(xnbanco,1,3)
               oBoleto:Banco_Agencia := alltrim(xnagencia)
               oBoleto:Banco_Ag_Dv__ := iif(empty(xndagencia),"",alltrim(xndagencia))
               oBoleto:Banco_Ag_Un_A := iif(empty(xndagencia_Un),"",alltrim(xndagencia_Un))
               oBoleto:Conta________ := alltrim(xnconta)
               oBoleto:Conta_DV_____ := alltrim(xndconta)
               oBoleto:Conta_OP_____ := iif(empty(xnoperacao),"","'" + alltrim(xnoperacao))
               oBoleto:Carteira_____ := alltrim(xncarteira)
               oBoleto:Carteira_Tipo := iif(empty(xntpcarteira),"",alltrim(xntpcarteira))
               oBoleto:NossoNumero__ := tnossonumerosequencia
               oBoleto:Doc_Origem___ := iif( substr(nNumerododocument_a_gravar,9,3) = "Ped","DM","DM")
               oBoleto:Prefixo______ := iif(empty(xnprefixo),"",alltrim(xnprefixo))
               oBoleto:Prefixo_DV___ := iif(empty(xndprefixo),"",alltrim(xndprefixo))
               oBoleto:Doc_Numero___ := alltrim(andup)
               oBoleto:Doc_Aceite___ := alltrim(xnaceite)
               oBoleto:Doc_Especie__ := alltrim(xnespecie)
               oBoleto:Doc_Data_____ := ldataemissao
               oBoleto:Vencimento___ := advenc
               oBoleto:Valor________ := avdup
               oBoleto:Multa_Auto___ := iif(empty(zfinmultaatraso),0,zfinmultaatraso)
               oBoleto:Juros_Mes____ := iif(empty(zfintaxajurosmensal),0,zfintaxajurosmensal)
               oBoleto:Numero_Vias__ := val(xnvias)
               oBoleto:Local_Pagamen := { xnlocalpagamento }
			   //if empty(xninstrucao)
			    oBoleto:Instrucoes___ := { "","" }
			   //else
			   //endif
               oBoleto:Demonstrativo := { "","","","","","","","","","","","","","","" }
               oBoleto:Cedente______ := { mlinh1,mlinh2,mlinh3}
               oBoleto:Sacado_______ := { mlinha1,mlinha2,mlinha3,mlinha4 }
			   oBoleto:Avalista_____ := { "Não informado.", "", "" }
			   oBoleto:AddPage()
			   
			   if xnnMusarnosso = .t.
			      cwquery := "Update fntitulosclientefornecedor set boletoemitido = 'y'"
			      cwquery += ",nossonumerobancario = " + "'"+ alltrim(oBoleto:NossoNumero__) + space(20 - len(alltrim(oBoleto:NossoNumero__)) ) +"'"
                  cwquery += " where seqtitulo = " + alltrim(str(aseq))
                  owquery := oServer:Query(cwquery)
                  if owquery:neterr()
                     msgstop("Não foi possível realizar a alteração do nosso número.","Atenção")
                  endif
                  owquery:destroy()
                  oServer:Commit()
			   endif
               
		       oquery:skip()
            end
		 	if nnescolhe > 1
               oBoleto:Finish()
		    endif
		 endif
         oquery:destroy()
         oDlgWait:end()
		 if nnescolhe > 1
            if file( cFilePdf )
               run("explorer.exe " + cFilePdf )
            else
               msgstop( "Erroo na geração do arquivo..." + cFilePdf,"Atenção" )
            endif
		 endif
return nil
function trata_boleto(objetoPassagem)
         nOpcao = ""
         for x = 1 to len(objetoPassagem)
             if substr(objetoPassagem,x,1) = '<'
                nOpcao = nOpcao + '_'
             elseif substr(objetoPassagem,x,1) = '>'
                nOpcao = nOpcao + '_'
             elseif substr(objetoPassagem,x,1) = '&'
                nOpcao = nOpcao + 'E'
             elseif substr(objetoPassagem,x,1) = '"'
                nOpcao = nOpcao + '_'
             elseif substr(objetoPassagem,x,1) = "'"
                nOpcao = nOpcao + '_; '
             elseif substr(objetoPassagem,x,1) = "á"
                nOpcao = nOpcao + 'A'
             elseif substr(objetoPassagem,x,1) = "é"
                nOpcao = nOpcao + 'E'
             elseif substr(objetoPassagem,x,1) = "í"
                nOpcao = nOpcao + 'I'
             elseif substr(objetoPassagem,x,1) = "ó"
                nOpcao = nOpcao + 'O'
             elseif substr(objetoPassagem,x,1) = "ú"
                nOpcao = nOpcao + 'U'
             elseif substr(objetoPassagem,x,1) = "Á"
                nOpcao = nOpcao + 'A'
             elseif substr(objetoPassagem,x,1) = "É"
                nOpcao = nOpcao + 'E'
             elseif substr(objetoPassagem,x,1) = "Í"
                nOpcao = nOpcao + 'I'
             elseif substr(objetoPassagem,x,1) = "Ó"
                nOpcao = nOpcao + 'O'
             elseif substr(objetoPassagem,x,1) = "Ú"
                nOpcao = nOpcao + 'U'
             elseif substr(objetoPassagem,x,1) = "ã"
                nOpcao = nOpcao + 'A'
             elseif substr(objetoPassagem,x,1) = "õ"
                nOpcao = nOpcao + 'O'
             elseif substr(objetoPassagem,x,1) = "Ã"
                nOpcao = nOpcao + 'A'
             elseif substr(objetoPassagem,x,1) = "Õ"
                nOpcao = nOpcao + 'O'
             elseif substr(objetoPassagem,x,1) = "â"
                nOpcao = nOpcao + 'A'
             elseif substr(objetoPassagem,x,1) = "ê"
                nOpcao = nOpcao + 'E'
             elseif substr(objetoPassagem,x,1) = "î"
                nOpcao = nOpcao + 'I'
             elseif substr(objetoPassagem,x,1) = "ô"
                nOpcao = nOpcao + 'O'
             elseif substr(objetoPassagem,x,1) = "û"
                nOpcao = nOpcao + 'U'
             elseif substr(objetoPassagem,x,1) = "Â"
                nOpcao = nOpcao + 'A'
             elseif substr(objetoPassagem,x,1) = "Ê"
                nOpcao = nOpcao + 'A'
             elseif substr(objetoPassagem,x,1) = "Î"
                nOpcao = nOpcao + 'I'
             elseif substr(objetoPassagem,x,1) = "Ô"
                nOpcao = nOpcao + 'O'
             elseif substr(objetoPassagem,x,1) = "Û"
                nOpcao = nOpcao + 'U'
             elseif substr(objetoPassagem,x,1) = "ç"
                nOpcao = nOpcao + 'C'
             elseif substr(objetoPassagem,x,1) = "Ç"
                nOpcao = nOpcao + 'C'
             elseif substr(objetoPassagem,x,1) = "º"
                nOpcao = nOpcao + ' '
             elseif substr(objetoPassagem,x,1) = "ª"
                nOpcao = nOpcao + ' '
             elseif substr(objetoPassagem,x,1) = " "
                nOpcao = nOpcao + '_'
             else
				nOpcao = nOpcao + substr(objetoPassagem,x,1)
             endif
		 next
return(nOpcao)

/*
http://www.pctoledo.com.br/forum/viewtopic.php?f=43&t=18664
*/
//Boleto operações com certificado digital e assinatura
function boleto_CertificadoEscolhe(objetcert)
         LOCAL dValidFrom, dValidTo
         try
		   cCertificado := boleto_CapicomEscolheCertificado()
           dValidFrom   := boleto_CapicomCertificado( cCertificado ):ValidFromDate
           dValidTo     := boleto_CapicomCertificado( cCertificado ):ValidToDate
		   if objetcert = 1
		      nMcertificado = cCertificado
		      onMcertificado:settext(nMcertificado)
		      nMemitido  = ctod(dtoc(dValidFrom))
		      nMvalidade = ctod(dtoc(dValidTo))
		      onMemitido:settext(nMemitido)
		      onMvalidade:settext(nMvalidade)
		   endif
		 catch
	       msgstop("Certificado não selecionado.","Atenção")
		 end
return nil
function boleto_CapicomEscolheCertificado( dValidFrom, dValidTo )
         local oCertificado, oCapicomStore, cNomeCertificado := "NENHUM", oColecao
         
		 oCapicomStore        := CreateObject( "CAPICOM.Store" )
         oCapicomStore:Open( CAPICOM_CURRENT_USER_STORE, 'My', CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED )
		 oColecao         := oCapicomStore:Certificates()
         do case
         case oColecao:Count() == 1
              dValidFrom       := oColecao:item(1):ValidFromDate
              dValidTo         := oColecao:item(1):ValidToDate
              cNomeCertificado := oColecao:item(1):SubjectName
         case oColecao:Count() > 1
              oCertificado     := oColecao:Select( "Selecione o certificado para uso nos boletos.","Selecione o certificado", .F. )
              dValidFrom       := oCertificado:item(1):ValidFromDate
              dValidTo         := oCertificado:item(1):ValidToDate
              cNomeCertificado := oCertificado:item(1):SubjectName
         endcase
		 if "CN=" $ cNomeCertificado
            cNomeCertificado := Substr( cNomeCertificado, At( "CN=", cNomeCertificado ) + 3 )
            if "," $ cNomeCertificado
               cNomeCertificado := Substr( cNomeCertificado, 1, At( ",", cNomeCertificado ) - 1 )
			endif
         endif
return cNomeCertificado
function boleto_CapicomCertificado( cNomeCertificado )
         local oCapicomStore, oColecao, oCertificado, nCont
         oCapicomStore := CreateObject( "CAPICOM.Store" )
         oCapicomStore:Open( CAPICOM_CURRENT_USER_STORE, "My", CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED )
         oColecao := oCapicomStore:Certificates()
         for nCont = 1 TO oColecao:Count()
			 if cNomeCertificado $ oColecao:Item( nCont ):SubjectName
                oCertificado := oColecao:Item( nCont )
                exit
             endif
         next
return oCertificado
function IsValidSignatureCapicom( cDigestValue, cSignatureValue )
         if cDigestValue = nil .OR. cSignatureValue = nil
            return .f.
         endif
return CapicomClass():VerifySignature( cSignatureValue ) == cDigestValue

CREATE CLASS CapicomClass
       METHOD SelectCertificate()
       METHOD VerifySignature( cSignedData )
       METHOD HashData( cData, nAlgorithm )
       METHOD Sign( cDigestValue, oCAPICOMcert, nEncode, cPublicKey )
ENDCLASS

METHOD SelectCertificate() CLASS CapicomClass
       local oCapicom, oCertificate
       oCapicom:= CreateObject( "CAPICOM.Store" )
       oCapicom:Open( CAPICOM_CURRENT_USER_STORE, "My", CAPICOM_STORE_OPEN_READ_ONLY )
       try
          oCertificate := oCapicom:Certificates:Select( "Selecione um certificado digital", "Algoritmo de Assinatura SHA256RSA" )
       catch
	   end
       return nil
	   
return oCertificate:Item( 1 )

METHOD VerifySignature( cSignedData ) CLASS CapicomClass
       local oCapicom
       if cSignedData == nil
          return nil
       endif
       oCapicom := CreateObject( "CAPICOM.SignedData.1" )
       oCapicom:Verify( cSignedData, .F., CAPICOM_VERIFY_SIGNATURE_ONLY )
RETURN oCapicom:Content

METHOD HashData( cData, nAlgorithm ) CLASS CapicomClass
       if cData = NIL
          cData := Dtos( Date() ) + Time()
       else
		  cData = alltrim(cData)
	   endif
	   if nAlgorithm = 1
	      _ShaAlg = StrToHex(hb_SHA1(cData))
	   elseif nAlgorithm = 224
	      _ShaAlg = StrToHex(hb_SHA224(cData))
	   elseif nAlgorithm = 256
	      _ShaAlg = StrToHex(hb_SHA256(cData))
	   elseif nAlgorithm = 384
	      _ShaAlg = StrToHex(hb_SHA384(cData))
	   elseif nAlgorithm = 512
	      _ShaAlg = StrToHex(hb_SHA512(cData))
	   else
	      _ShaAlg = StrToHex(hb_SHA1(cData))
	   endif
	   _ShaAlg = zHexToBinary(_ShaAlg)
return(StrTran(HB_Base64Encode(_ShaAlg,len(_ShaAlg)),Chr(13) + Chr(10), "" ))

function zHexToBinary(cHex)
         local nLenBin, nX, nPos, cBinNumber, cCharHex, cBinBase
         aHexBinary  := { {"0","0000"},{"1","0001"},{"2","0010"},{"3","0011"},{"4","0100"},{"5","0101"},;
                          {"6","0110"},{"7","0111"},{"8","1000"},{"9","1001"},{"A","1010"},{"B","1011"},;
                          {"C","1100"},{"D","1101"},{"E","1110"},{"F","1111"} }
         cBinNumber := ""
         cHex := alltrim(cHex)
         for nX := len(cHex)  to 1 step -1
             cCharHex := substr(cHex, -nX, 1)
             nPos := ascan(aHexBinary, { |a| a[1] == substr(cHex, -nX, 1)} )
             cBinBase := aHexBinary[nPos,2]
             cBinNumber := cBinNumber + cBinBase
         next
return(cBinNumber)

METHOD Sign( cDigestValue, oCAPICOMCert, nEncode, cPublicKey ) CLASS CapicomClass
       local oCAPICOMSignedData, oCAPICOMSigner, oCAPICOMTimeStamp, cSignature
       if cDigestValue = nil
          return nil
       endif
       if nEncode = nil
          nEncode := CAPICOM_ENCODE_BASE64
       endif
       oUtil := CreateObject( "CAPICOM.Utilities" )
       oCAPICOMSigner := CreateObject( "CAPICOM.Signer.2" ) // versao 2
       if oCAPICOMCert = nil
          if empty(xncertificado) // Certificado instalado no store do WINDOWS......
             if !empty(xnpfxcertificado) .and. !empty(xnpfxsenha) // Certificado em arquivo PFX.
				oCert := CreateObject( "CAPICOM.Certificate" )
                oCert:Load( xnpfxcertificado, xnpfxsenha, 1, 0 )
				oCapicomStore := CreateObject( "CAPICOM.Store" )
                oCapicomStore:open(CAPICOM_MEMORY_STORE, 'Memoria',CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED )
                oCapicomStore:Add( oCert )
				if oCapicomStore:item(1):ValidToDate <= ldate
				   msgstop("Certificado " + alltrim(xnpfxcertificado) + " VENCIDO!!!","Atenção")
				   return nil
				endif
				oCAPICOMCert := oCapicomStore:item(1)
			 else
			    oCAPICOMCert := ::SelectCertificate() // Escolhe o certificado.
			 endif
		  else
		     oCAPICOMCert := boleto_CapicomCertificado( alltrim(xncertificado) )
	      endif
          if oCAPICOMCert = nil
             return nil
          endif
          oCAPICOMSigner:Certificate := oCAPICOMcert
       else
          oCAPICOMSigner:Certificate := oCAPICOMcert:DefaultInterface
       endif
       if ! ( oCAPICOMSigner:Certificate:HasPrivateKey;
          .and. Dtos( oCAPICOMSigner:Certificate:ValidFromDate ) <= Dtos( Date() ) ;
          .and. Dtos( oCAPICOMSigner:Certificate:ValidToDate ) >= Dtos( Date() ) )
          return nil
       endif
	   oCAPICOMSigner:Options   := CAPICOM_CERTIFICATE_INCLUDE_CHAIN_EXCEPT_ROOT
	   cPublicKey               := StrTran( oCAPICOMSigner:Certificate:Export( CAPICOM_ENCODE_BASE64 ), Chr(13) + Chr(10), "" )
	   
	   oCAPICOMTimeStamp := CreateObject( "CAPICOM.Attribute" )
       oCAPICOMTimeStamp:Name  := CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME
       oCAPICOMTimeStamp:Value := DateTime()
       oCAPICOMSigner:AuthenticatedAttributes:Add( oCAPICOMTimeStamp )
       
       oCAPICOMSignedData := CreateObject( "CAPICOM.SignedData.1" )
       oCAPICOMSignedData:Content := cDigestValue
	   
	   // segundo parametro falso, apenas retona assinatura do texto, não inclui no texto
	   cSignature := StrTran( oCAPICOMSignedData:Sign( oCAPICOMSigner, .F., nEncode ), Chr(13) + Chr(10), "" )
	   
return cSignature


Partindo para os próximos. ( ITAÚ e SICOOB). API'S.

Abraço e espero que ajude.....

Link to comment
Share on other sites

Me esqueci de adicionar o arquivo sefaz_capicom.ch


#define CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME             0
#define CAPICOM_AUTHENTICATED_ATTRIBUTE_DOCUMENT_NAME            1
#define CAPICOM_AUTHENTICATED_ATTRIBUTE_DOCUMENT_DESCRIPTION     2

#define CAPICOM_CERTIFICATE_FIND_SHA1_HASH                       0
#define CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME                    1
#define CAPICOM_CERTIFICATE_FIND_ISSUER_NAME                     2
#define CAPICOM_CERTIFICATE_FIND_ROOT_NAME                       3
#define CAPICOM_CERTIFICATE_FIND_TEMPLATE_NAME                   4
#define CAPICOM_CERTIFICATE_FIND_EXTENSION                       5
#define CAPICOM_CERTIFICATE_FIND_EXTENDED_PROPERTY               6
#define CAPICOM_CERTIFICATE_FIND_APPLICATION_POLICY              7
#define CAPICOM_CERTIFICATE_FIND_CERTIFICATE_POLICY              8
#define CAPICOM_CERTIFICATE_FIND_TIME_VALID                      9
#define CAPICOM_CERTIFICATE_FIND_TIME_NOT_YET_VALID              10
#define CAPICOM_CERTIFICATE_FIND_TIME_EXPIRED                    11
#define CAPICOM_CERTIFICATE_FIND_KEY_USAGE                       12

#define CAPICOM_CERTIFICATE_INCLUDE_CHAIN_EXCEPT_ROOT            0
#define CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN                  1
#define CAPICOM_CERTIFICATE_INCLUDE_END_ENTITY_ONLY              2

// CAPICOM Chain check flag
#define CAPICOM_CHECK_NONE                                       &H00000000
#define CAPICOM_CHECK_TRUSTED_ROOT                               &H00000001
#define CAPICOM_CHECK_TIME_VALIDITY                              &H00000002
#define CAPICOM_CHECK_SIGNATURE_VALIDITY                         &H00000004
#define CAPICOM_CHECK_ONLINE_REVOCATION_STATUS                   &H00000008
#define CAPICOM_CHECK_OFFLINE_REVOCATION_STATUS                  &H00000010
#define CAPICOM_CHECK_COMPLETE_CHAIN                             &H00000020
#define CAPICOM_CHECK_NAME_CONSTRAINTS                           &H00000040
#define CAPICOM_CHECK_BASIC_CONSTRAINTS                          &H00000080
#define CAPICOM_CHECK_NESTED_VALIDITY_PERIOD                     &H00000100
#define CAPICOM_CHECK_ONLINE_ALL                                 &H000001EF
#define CAPICOM_CHECK_OFFLINE_ALL                                &H000001F7

#define CAPICOM_ENCRYPTION_ALGORITHM_RC2                         0
#define CAPICOM_ENCRYPTION_ALGORITHM_RC4                         1
#define CAPICOM_ENCRYPTION_ALGORITHM_DES                         2
#define CAPICOM_ENCRYPTION_ALGORITHM_3DES                        3
#define CAPICOM_ENCRYPTION_ALGORITHM_AES                         4 // v2.0

#define CAPICOM_ENCRYPTION_KEY_LENGTH_MAXIMUM                    0
#define CAPICOM_ENCRYPTION_KEY_LENGTH_40_BITS                    1
#define CAPICOM_ENCRYPTION_KEY_LENGTH_56_BITS                    2
#define CAPICOM_ENCRYPTION_KEY_LENGTH_128_BITS                   3
#define CAPICOM_ENCRYPTION_KEY_LENGTH_192_BITS                   4 // AES v2.0
#define CAPICOM_ENCRYPTION_KEY_LENGTH_256_BITS                   5 // AES v2.0

#define CAPICOM_ENCODE_ANY                                       0xffffffff
#define CAPICOM_ENCODE_BASE64                                    0
#define CAPICOM_ENCODE_BINARY                                    1

#define CAPICOM_EXPORT_DEFAULT                                   0
#define CAPICOM_EXPORT_IGNORE_PRIVATE_KEY_NOT_EXPORTABLE_ERROR   1

#define CAPICOM_HASH_ALGORITHM_SHA1                              0
#define CAPICOM_HASH_ALGORITHM_MD2                               1
#define CAPICOM_HASH_ALGORITHM_MD4                               2
#define CAPICOM_HASH_ALGORITHM_MD5                               3
#define CAPICOM_HASH_ALGORITHM_SHA_256                           4
#define CAPICOM_HASH_ALGORITHM_SHA_384                           5
#define CAPICOM_HASH_ALGORITHM_SHA_512                           6

#define CAPICOM_KEY_STORAGE_DEFAULT                              0
#define CAPICOM_KEY_STORAGE_EXPORTABLE                           1
#define CAPICOM_KEY_STORAGE_USER_PROTECTED                       2

#define CAPICOM_MY_STORE                                         "My"

#define CAPICOM_PROPID_KEY_PROV_INFO                             2

#define CAPICOM_STORE_OPEN_READ_ONLY                             0
#define CAPICOM_STORE_OPEN_READ_WRITE                            1
#define CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED                       2
#define CAPICOM_STORE_OPEN_EXISTING_ONLY                         128
#define CAPICOM_STORE_OPEN_INCLUDE_ARCHIVED                      256

#define CAPICOM_STORE_SAVE_AS_SERIALIZED                         0
#define CAPICOM_STORE_SAVE_AS_PKCS7                              1
#define CAPICOM_STORE_SAVE_AS_PFX                                2

#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

// CAPICOM Chain check flag
#define CAPICOM_TRUST_IS_NOT_TIME_VALID                          &H00000001
#define CAPICOM_TRUST_IS_NOT_TIME_NESTED                         &H00000002
#define CAPICOM_TRUST_IS_REVOKED                                 &H00000004
#define CAPICOM_TRUST_IS_NOT_SIGNATURE_VALID                     &H00000008
#define CAPICOM_TRUST_IS_NOT_VALID_FOR_USAGE                     &H00000010
#define CAPICOM_TRUST_IS_UNTRUSTED_ROOT                          &H00000020
#define CAPICOM_TRUST_REVOCATION_STATUS_UNKNOWN                  &H00000040
#define CAPICOM_TRUST_IS_CYCLIC                                  &H00000080
#define CAPICOM_TRUST_INVALID_EXTENSION                          &H00000100
#define CAPICOM_TRUST_INVALID_POLICY_CONSTRAINTS                 &H00000200
#define CAPICOM_TRUST_INVALID_BASIC_CONSTRAINTS                  &H00000400
#define CAPICOM_TRUST_INVALID_NAME_CONSTRAINTS                   &H00000800
#define CAPICOM_TRUST_HAS_NOT_SUPPORTED_NAME_CONSTRAINT          &H00001000
#define CAPICOM_TRUST_HAS_NOT_DEFINED_NAME_CONSTRAINT            &H00002000
#define CAPICOM_TRUST_HAS_NOT_PERMITTED_NAME_CONSTRAINT          &H00004000
#define CAPICOM_TRUST_HAS_EXCLUDED_NAME_CONSTRAINT               &H00008000
#define CAPICOM_TRUST_IS_OFFLINE_REVOCATION                      &H01000000
#define CAPICOM_TRUST_NO_ISSUANCE_CHAIN_POLICY                   &H02000000
#define CAPICOM_TRUST_IS_PARTIAL_CHAIN                           &H00010000
#define CAPICOM_TRUST_CTL_IS_NOT_TIME_VALID                      &H00020000
#define CAPICOM_TRUST_CTL_IS_NOT_SIGNATURE_VALID                 &H00040000
#define CAPICOM_TRUST_CTL_IS_NOT_VALID_FOR_USAGE                 &H00080000
#define KNOWN_TRUST_STATUS_MASK                                  &H030FFFFF

#define CAPICOM_VERIFY_SIGNATURE_ONLY                            0
#define CAPICOM_VERIFY_SIGNATURE_AND_CERTIFICATE                 1

Manual_Registro_de_Boleto_Bancario_Online - Guia de integração Versão 2.2 janeiro/2019

http://fivewin.com.br/index.php?/files/file/1123-manual_registro_de_boleto_bancario_online/

Para testar a criptografia.

https://redkestrel.co.uk/products/decoder/

Link to comment
Share on other sites

Exemplo prático.

 

#include "FiveWin.ch"
#include "common.ch"
#include "postgres.ch"
#include "report.ch"
#include "inkey.ch"
#include "hbgtinfo.ch"
#include "hbclass.ch"
#include "tip.ch"
#include "sefaz_capicom.ch"

// Créditos José Quintas ( assinaturacapicom.prg ) // sefazclass...
// Com alterações..

function TesteCapicom

         LOCAL narquivoJSON, cSignatureValue, cDigestValue, cPublicKey
         
		 narquivoJSON := '{"nuCPFCNPJ":"123456789","filialCPFCNPJ":"0001","ctrlCPFCNPJ":"39","cdTipoAcesso":"2","clubBanco":"0","cdTipoContrato":"0","nuSequenciaContrato":"0"'
         narquivoJSON += '"idProduto":"09","nuNegociacao":"123400000001234567","cdBanco":"237","eNuSequenciaContrato":"0","tpRegistro":"1","cdProduto":"0","nuTitulo":"0"'
         narquivoJSON += '"nuCliente":"123456","dtEmissaoTitulo":"25.05.2017","dtVencimentoTitulo":"20.06.2017","tpVencimento":"0","vlNominalTitulo":"100","cdEspecieTitulo":"04"'
         narquivoJSON += '"tpProtestoAutomaticoNegativacao":"0","prazoProtestoAutomaticoNegativacao":"0","controleParticipante":"","cdPagamentoParcial":"","qtdePagamentoParcial":"0"'
         narquivoJSON += '"percentualJuros":"0","vlJuros":"0","qtdeDiasJuros":"0","percentualMulta":"0","vlMulta":"0","qtdeDiasMulta":"0","percentualDesconto1":"0","vlDesconto1":"0"'
         narquivoJSON += '"dataLimiteDesconto1":"","percentualDesconto2":"0","vlDesconto2":"0","dataLimiteDesconto2":"","percentualDesconto3":"0","vlDesconto3":"0","dataLimiteDesconto3":""'
         narquivoJSON += '"prazoBonificacao":"0","percentualBonificacao":"0","vlBonificacao":"0","dtLimiteBonificacao":"","vlAbatimento":"0","vlIOF":"0","nomePagador":"Cliente Teste"'
         narquivoJSON += '"logradouroPagador":"rua Teste","nuLogradouroPagador":"90","complementoLogradouroPagador":"","cepPagador":"12345","complementoCepPagador":"500","bairroPagador":"bairro Teste"'
         narquivoJSON += '"municipioPagador":"Teste","ufPagador":"SP","cdIndCpfcnpjPagador":"1","nuCpfcnpjPagador":"12345648901234","endEletronicoPagador":"","nomeSacadorAvalista":""'
         narquivoJSON += '"logradouroSacadorAvalista":"","nuLogradouroSacadorAvalista":"0","complementoLogradouroSacadorAvalista":"","cepSacadorAvalista":"0","complementoCepSacadorAvalista":"0"'
         narquivoJSON += '"bairroSacadorAvalista":"","municipioSacadorAvalista":"","ufSacadorAvalista":"","cdIndCpfcnpjSacadorAvalista":"0","nuCpfcnpjSacadorAvalista":"0","endEletronicoSacadorAvalista":""}'
		 
		 xnurlbanco := "https://cobranca.bradesconetempresa.b.br/ibpjregistrotitulows/registrotitulohomologacao"
		 
         xncertificado = ""     // Certificado instalado no store do WINDOWS......
                                // ou
		 xnpfxcertificado = ""  // Nome do arquivo .pfx
		 xnpfxsenha = ""        // Certificado em arquivo PFX.

		 //1-hb_SHA1(),224-hb_SHA224(),256-hb_SHA256(),384-hb_SHA384(),512-hb_SHA512()
		 cDigestValue    := CapicomClass():HashData(narquivoJSON,256)
		 cSignatureValue := CapicomClass():Sign( cDigestValue, , , @cPublicKey )
		 cDigestValue     = CapicomClass():VerifySignature( cSignatureValue )
		 if IsValidSignatureCapicom( cDigestValue, cSignatureValue ) = .f.
		    return
		 endif

         // Certificado.......
		 //? cPublicKey
		 
		 // criptografia a ser enviado para o banco
		 //? cSignatureValue
		 
         _cresposta := ""
         try
		   _oserver := CreateObject( "MSXML2.XMLHTTP" )
		   _oserver:Open( "POST", xnurlbanco, .F. )
		   _oserver:SetRequestHeader("Content-Type","application/json")
	       _oserver:Send(cSignatureValue)
	       WHILE _oserver:readyState != 4
	             _oserver:WaitForResponse( 500 )
	       end
			_cresposta := _oserver:responseText
			msginfo(_cresposta )
	     catch
	       msgstop("Erro no envio do arquivo json do boleto para o Bradesco.","Atenção")
	     end
return

/*
http://www.pctoledo.com.br/forum/viewtopic.php?f=43&t=18664
*/
//Boleto operações com certificado digital e assinatura
function boleto_CertificadoEscolhe()
         LOCAL dValidFrom, dValidTo
         try
		   cCertificado := boleto_CapicomEscolheCertificado()
           dValidFrom   := boleto_CapicomCertificado( cCertificado ):ValidFromDate
           dValidTo     := boleto_CapicomCertificado( cCertificado ):ValidToDate
		 catch
	       msgstop("Certificado não selecionado.","Atenção")
		 end
return nil
function boleto_CapicomEscolheCertificado( dValidFrom, dValidTo )
         local oCertificado, oCapicomStore, cNomeCertificado := "NENHUM", oColecao
         
		 oCapicomStore        := CreateObject( "CAPICOM.Store" )
         oCapicomStore:Open( CAPICOM_CURRENT_USER_STORE, 'My', CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED )
		 oColecao         := oCapicomStore:Certificates()
         do case
         case oColecao:Count() == 1
              dValidFrom       := oColecao:item(1):ValidFromDate
              dValidTo         := oColecao:item(1):ValidToDate
              cNomeCertificado := oColecao:item(1):SubjectName
         case oColecao:Count() > 1
              oCertificado     := oColecao:Select( "Selecione o certificado para uso nos boletos.","Selecione o certificado", .F. )
              dValidFrom       := oCertificado:item(1):ValidFromDate
              dValidTo         := oCertificado:item(1):ValidToDate
              cNomeCertificado := oCertificado:item(1):SubjectName
         endcase
		 if "CN=" $ cNomeCertificado
            cNomeCertificado := Substr( cNomeCertificado, At( "CN=", cNomeCertificado ) + 3 )
            if "," $ cNomeCertificado
               cNomeCertificado := Substr( cNomeCertificado, 1, At( ",", cNomeCertificado ) - 1 )
			endif
         endif
return cNomeCertificado
function boleto_CapicomCertificado( cNomeCertificado )
         local oCapicomStore, oColecao, oCertificado, nCont
         oCapicomStore := CreateObject( "CAPICOM.Store" )
         oCapicomStore:Open( CAPICOM_CURRENT_USER_STORE, "My", CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED )
         oColecao := oCapicomStore:Certificates()
         for nCont = 1 TO oColecao:Count()
			 if cNomeCertificado $ oColecao:Item( nCont ):SubjectName
                oCertificado := oColecao:Item( nCont )
                exit
             endif
         next
return oCertificado
function IsValidSignatureCapicom( cDigestValue, cSignatureValue )
         if cDigestValue = nil .OR. cSignatureValue = nil
            return .f.
         endif
return CapicomClass():VerifySignature( cSignatureValue ) == cDigestValue

CREATE CLASS CapicomClass
       METHOD SelectCertificate()
       METHOD VerifySignature( cSignedData )
       METHOD HashData( cData, nAlgorithm )
       METHOD Sign( cDigestValue, oCAPICOMcert, nEncode, cPublicKey )
ENDCLASS

METHOD SelectCertificate() CLASS CapicomClass
         local oCertificado, oCapicomStore, cNomeCertificado := "NENHUM", oColecao
         
		 oCapicomStore        := CreateObject( "CAPICOM.Store" )
         oCapicomStore:Open( CAPICOM_CURRENT_USER_STORE, 'My', CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED )
		 oColecao         := oCapicomStore:Certificates()
         do case
         case oColecao:Count() == 1
              dValidFrom       := oColecao:item(1):ValidFromDate
              dValidTo         := oColecao:item(1):ValidToDate
              cNomeCertificado := oColecao:item(1):SubjectName
         case oColecao:Count() > 1
              oCertificado     := oColecao:Select( "Selecione o certificado para uso nos boletos.","Selecione o certificado", .F. )
              dValidFrom       := oCertificado:item(1):ValidFromDate
              dValidTo         := oCertificado:item(1):ValidToDate
              cNomeCertificado := oCertificado:item(1):SubjectName
         endcase
		 if "CN=" $ cNomeCertificado
            cNomeCertificado := Substr( cNomeCertificado, At( "CN=", cNomeCertificado ) + 3 )
            if "," $ cNomeCertificado
               cNomeCertificado := Substr( cNomeCertificado, 1, At( ",", cNomeCertificado ) - 1 )
			endif
         endif
		 onselecionado = boleto_CapicomCertificado( cNomeCertificado )
return onselecionado
	   
return oCertificate:Item( 1 )

METHOD VerifySignature( cSignedData ) CLASS CapicomClass
       local oCapicom
       if cSignedData == nil
          return nil
       endif
       oCapicom := CreateObject( "CAPICOM.SignedData.1" )
       oCapicom:Verify( cSignedData, .F., CAPICOM_VERIFY_SIGNATURE_ONLY )
RETURN oCapicom:Content

METHOD HashData( cData, nAlgorithm ) CLASS CapicomClass
       if cData = NIL
          cData := Dtos( Date() ) + Time()
       else
		  cData = alltrim(cData)
	   endif
	   if nAlgorithm = 1
	      _ShaAlg = StrToHex(hb_SHA1(cData))
	   elseif nAlgorithm = 224
	      _ShaAlg = StrToHex(hb_SHA224(cData))
	   elseif nAlgorithm = 256
	      _ShaAlg = StrToHex(hb_SHA256(cData))
	   elseif nAlgorithm = 384
	      _ShaAlg = StrToHex(hb_SHA384(cData))
	   elseif nAlgorithm = 512
	      _ShaAlg = StrToHex(hb_SHA512(cData))
	   else
	      _ShaAlg = StrToHex(hb_SHA1(cData))
	   endif
	   _ShaAlg = zHexToBinary(_ShaAlg)
return(StrTran(HB_Base64Encode(_ShaAlg,len(_ShaAlg)),Chr(13) + Chr(10), "" ))

function zHexToBinary(cHex)
         local nLenBin, nX, nPos, cBinNumber, cCharHex, cBinBase
         aHexBinary  := { {"0","0000"},{"1","0001"},{"2","0010"},{"3","0011"},{"4","0100"},{"5","0101"},;
                          {"6","0110"},{"7","0111"},{"8","1000"},{"9","1001"},{"A","1010"},{"B","1011"},;
                          {"C","1100"},{"D","1101"},{"E","1110"},{"F","1111"} }
         cBinNumber := ""
         cHex := alltrim(cHex)
         for nX := len(cHex)  to 1 step -1
             cCharHex := substr(cHex, -nX, 1)
             nPos := ascan(aHexBinary, { |a| a[1] == substr(cHex, -nX, 1)} )
             cBinBase := aHexBinary[nPos,2]
             cBinNumber := cBinNumber + cBinBase
         next
return(cBinNumber)

METHOD Sign( cDigestValue, oCAPICOMCert, nEncode, cPublicKey ) CLASS CapicomClass
       local oCAPICOMSignedData, oCAPICOMSigner, oCAPICOMTimeStamp, cSignature
       if cDigestValue = nil
          return nil
       endif
       if nEncode = nil
          nEncode := CAPICOM_ENCODE_BASE64
       endif
       oUtil := CreateObject( "CAPICOM.Utilities" )
       oCAPICOMSigner := CreateObject( "CAPICOM.Signer.2" ) // versao 2
       if oCAPICOMCert = nil
          if empty(xncertificado) // Certificado instalado no store do WINDOWS......
             if !empty(xnpfxcertificado) .and. !empty(xnpfxsenha) // Certificado em arquivo PFX.
				oCert := CreateObject( "CAPICOM.Certificate" )
                oCert:Load( xnpfxcertificado, xnpfxsenha, 1, 0 )
				oCapicomStore := CreateObject( "CAPICOM.Store" )
                oCapicomStore:open(CAPICOM_MEMORY_STORE, 'Memoria',CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED )
                oCapicomStore:Add( oCert )
				if oCapicomStore:item(1):ValidToDate <= ldate
				   msgstop("Certificado " + alltrim(xnpfxcertificado) + " VENCIDO!!!","Atenção")
				   return nil
				endif
				oCAPICOMCert := oCapicomStore:item(1)
			 else
			    oCAPICOMCert := ::SelectCertificate() // Escolhe o certificado.
			 endif
		  else
		     oCAPICOMCert := boleto_CapicomCertificado( alltrim(xncertificado) )
	      endif
          if oCAPICOMCert = nil
             return nil
          endif
          oCAPICOMSigner:Certificate := oCAPICOMcert
       else
          oCAPICOMSigner:Certificate := oCAPICOMcert:DefaultInterface
       endif
       if ! ( oCAPICOMSigner:Certificate:HasPrivateKey;
          .and. Dtos( oCAPICOMSigner:Certificate:ValidFromDate ) <= Dtos( Date() ) ;
          .and. Dtos( oCAPICOMSigner:Certificate:ValidToDate ) >= Dtos( Date() ) )
          return nil
       endif
	   oCAPICOMSigner:Options   := CAPICOM_CERTIFICATE_INCLUDE_CHAIN_EXCEPT_ROOT
	   cPublicKey               := StrTran( oCAPICOMSigner:Certificate:Export( CAPICOM_ENCODE_BASE64 ), Chr(13) + Chr(10), "" )
	   
	   oCAPICOMTimeStamp := CreateObject( "CAPICOM.Attribute" )
       oCAPICOMTimeStamp:Name  := CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME
       oCAPICOMTimeStamp:Value := DateTime()
       oCAPICOMSigner:AuthenticatedAttributes:Add( oCAPICOMTimeStamp )
       
       oCAPICOMSignedData := CreateObject( "CAPICOM.SignedData.1" )
       oCAPICOMSignedData:Content := cDigestValue
	   
	   // segundo parametro falso, apenas retona assinatura do texto, não inclui no texto
	   cSignature := StrTran( oCAPICOMSignedData:Sign( oCAPICOMSigner, .F., nEncode ), Chr(13) + Chr(10), "" )
	   
return cSignature

 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...