Wellington Vieira Posted July 22, 2020 Report Share Posted July 22, 2020 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/sefazclasshttps://github.com/fernandoathayde/hbnfehttp://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..... Quote Link to comment Share on other sites More sharing options...
Wellington Vieira Posted July 23, 2020 Author Report Share Posted July 23, 2020 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/ aferra 1 Quote Link to comment Share on other sites More sharing options...
Wellington Vieira Posted July 24, 2020 Author Report Share Posted July 24, 2020 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 Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.