Ir para conteúdo
  • Cadastre-se

Douglas Conceição

Membros
  • Total de ítens

    50
  • Registro em

  • Última visita

Tudo que Douglas Conceição postou

  1. ACBrConsultaCPF.pas
  2. Sobre os dados para consulta, teria outra solução para resolver isto, nao consegui autorização para disponibilizar o cpf do cliente para testes... estou sem meios para mostrar, posso tirar uma print e ocutar os dados e mandar para voces.
  3. Bom dia, estou com um probleminha na consulta de CPF. Pela primeira vez em nosso sistema apareceu um cliente na consulta que possui dois nomes, Nome Social e Nome Civil. Consultando no site, ira aparece os dois nomes, então tivemos que fazer algumas alterações para funcionar no nosso programinha e gostariam que voces adicionassem este codigo ao acbr ou se tivessem outra solução para este caso. Abaixo esta o codigo que gostaria que adicionasse: FNome := LerCampo(Resposta,'Nome:'); if trim(FNome) = '' then FNome := LerCampo(Resposta,'Nome Civil:'); AcbrConsultaCPF.pas E mais em baixo, esta o jeito que retorna no arquivo, um cliente com dois nomes... Aguardo retorno, qualquer coisa estou a disposição para informar mais algo caso precise.
  4. De uma olhada nos comentários acima, as vezes algum resolve seu problema, postei um projeto de teste também, mudando a forma de como funciona, caso se interesse.
  5. @wilmar Ta na mão o exemplo. https://drive.google.com/file/d/1IB_Z5G2hn0Cr4ffgBhuowj7sedQimqbO/view?usp=sharing Ele só ta meio feio, mas como é exemplo da para vc ter uma base para implementar no seu projeto né.
  6. O que esta faltando é o codigo que inicializa ele, voce ira colocar o codigo na raiz do projeto, na view source, abaixo como é para ficar... program Teste; uses Vcl.Forms, uTInject.ConfigCEF, UConsulta in 'UConsulta.pas' {FConsulta}; {$R *.res} begin If not GlobalCEFApp.StartMainProcess then Exit; Application.Initialize; Application.MainFormOnTaskbar := True; Application.CreateForm(TFConsulta, FConsulta); Application.Run; end. E esta faltando algumas dll tambem do CEF, irei disponibilizar a dll, coloque junto com o exe do projeto. https://drive.google.com/file/d/1m4Wa69JqdMc1CkiY6gEVogoksj_KbDkH/view?usp=sharing Ah, e sobre sua função de retornar dados, é de outro jeito, nao acho que deste jeito de certo.
  7. No create do seu formulario, colocou este codigo? Chromium1.CreateBrowser(CEFWindowParent1);
  8. Voce instalou a biblioteca do CEF4Delphi ? Aqui no meu quando coloquei este comando que me passou, verifiquei que fica na unit uCEFInterfaces.
  9. Na verdade, testamos com todos os tamanhos e encaixou certinho, como a tela ficou pequena acredito que ele identifica achando que é um celular e redmensiona ela conforme, sobre os arquivos nao sei ao certo pois nao precisamos de um para rodar, porque ja usamos um recurso de mensagens automaticas de whatsapp em nosso programa e ele usa o Chromium, o arquivo que ele solicitada era o CEF4Bin, que vinha junto com a instalação deste programa, mas acredito que todas as dll que o chromium precisa esta nele mesmo. https://github.com/salvadordf/CEF4Delphi Talvez este arquivo resolva, nao sei se é igual ao que tenho aqui, ate enviaria mas ele zipado é acima do limite de arquivo que da para enviar por aqui.
  10. No evento ChromiumLoadEnd do componente, e o link vai no evento AfterCreated... No Create do Form vc cria o Chromium... Chromium1.CreateBrowser(CEFWindowParent1); E no afterCreated faz o seguinte... procedure Chromium1AfterCreated(Sender: TObject;const browser: ICefBrowser); begin inherited; ///PostMessage(Handle, CEF_AFTERCREATED, 0, 0); Chromium1.LoadURL('https://solucoes.receita.fazenda.gov.br/Servicos/cnpjreva/Cnpjreva_Solicitacao.asp?cnpj=' +cxMaskEditCPF.Text); end; Foi pego os dados do html, igual o amigo do projeto mais acima.
  11. Boa Tarde, nos aqui da minha empresa conseguimos contornar o problema de uma forma diferente, nao tem como eu mandar o projeto pois ja esta dentro do nosso projeto oficial, nao por fora. Mas irei passar os códigos que usamos. Resumindo, usamos o TChromiun e conectamos na pagina diretamente, porem para ficar visivelmente mais bonito, colocamos um codigo para retirar da pagina tudo que não é preciso. if frame.IsMain then begin // remove elemento Chromium1.Browser.MainFrame.ExecuteJavaScript('document.getElementById("barra-brasil").remove();', '', 0); // remove elemento Chromium1.Browser.MainFrame.ExecuteJavaScript( 'var elementos = document.getElementsByTagName("' + 'header' + '");' + 'for (var i = elementos.length - 1; i >= 0; i--) {' + ' elementos[i].parentNode.removeChild(elementos[i]);' + '}', '', 0 ); // remove elemento Chromium1.Browser.MainFrame.ExecuteJavaScript( 'var elementos = document.getElementsByTagName("' + 'ul' + '");' + 'for (var i = elementos.length - 1; i >= 0; i--) {' + ' elementos[i].parentNode.removeChild(elementos[i]);' + '}', '', 0 ); // remove elemento Chromium1.Browser.MainFrame.ExecuteJavaScript( 'var elementos = document.getElementsByClassName("' + 'footer-wrapper' + '");' + 'for (var i = elementos.length - 1; i >= 0; i--) {' + ' elementos[i].parentNode.removeChild(elementos[i]);' + '}', '', 0 ); // ajuste css do elemento Chromium1.Browser.MainFrame.ExecuteJavaScript( 'var elementos = document.getElementsByClassName("' + 'col-md-8 form-group' + '");' + 'for (var i = elementos.length - 1; i >= 0; i--) {' + ' elementos[i].className = "col-md-10 form-group";' + '}', '', 0 ); // remove elemento JavaScriptAux := 'var divElement = document.querySelector(".col-md-12");' + 'if (divElement) {' + ' var h4Element = divElement.querySelector("h4");' + ' if (h4Element) {' + ' h4Element.remove();' + ' }' + ' var pElements = divElement.querySelectorAll("p");' + ' if (pElements.length > 0) {' + ' pElements[0].remove();' + ' }' + '}'; Chromium1.Browser.MainFrame.ExecuteJavaScript(JavaScriptAux, '', 0); JavaScriptAux := 'var bodyElement = document.body;' + 'if (bodyElement) {' + ' bodyElement.style.paddingTop = "30px";' + // Substitua "10px" pelo valor desejado '}'; // Execute o código JavaScript no TChromium Chromium1.Browser.MainFrame.ExecuteJavaScript(JavaScriptAux, '', 0); // bloqueia edicao do cnpj Chromium1.Browser.MainFrame.ExecuteJavaScript( 'document.getElementById("' + 'cnpj' + '").readOnly = true;' , '', 0 ); // remove elemento Chromium1.Browser.MainFrame.ExecuteJavaScript( 'var elementos = document.getElementsByClassName("' + 'btn btn-secondary' + '");' + 'for (var i = elementos.length - 1; i >= 0; i--) {' + ' elementos[i].parentNode.removeChild(elementos[i]);' + '}', '', 0 ); CEFWindowParent1.Visible := true; // lê o html da pagina e obtem o dados if (Chromium1.Browser.MainFrame.Url = 'https://solucoes.receita.fazenda.gov.br/Servicos/cnpjreva/Cnpjreva_Comprovante.asp') then begin Chromium1.RetrieveHTML(); Pesquisou := true; PanelNavegador.Visible := false; end; end; ------------- Chromium1LoadEnd Abaixo uma imagem de como ficou...
  12. ACBrBoleto.pas ACBrBoletoWS.Rest.OAuth.pas ACBrBoletoWS.Rest.pas
  13. Bom dia, aqui estão as alterações necessárias que eu fiz para funcionar do método que passa o texto dos arquivos diretamente, ao invés de passar o local do arquivo. //ACBrBoleto.pas // adicionado essas properties property Certificado: AnsiString read FCertificado write SetCertificado; property ChavePrivada: AnsiString read FChavePrivada write SetChavePrivada; ... procedure TACBrWebService.SetCertificado(const Value: AnsiString); begin FCertificado := Value; FArquivoCRT := EmptyStr; end; procedure TACBrWebService.SetChavePrivada(const Value: AnsiString); begin FChavePrivada := Value; FArquivoKEY := EmptyStr; end; // ao usar, passar direto o conteúdo do certificado ao invés do arquivo. // WebService.ArquivoCRT := 'C:\douglas\Boleto\Sicoob\SicoobCertificado.pem'; // WebService.ArquivoKEY := 'C:\douglas\Boleto\Sicoob\SicoobChavePrivada.key'; WebService.Certificado := MemoCertificado.Lines.Text; WebService.ChavePrivada := MemoKey.Lines.Text; // ACBrBoletoWS.Rest.pas uses ACBrOpenSSLUtils; // modificado a função de definir o certificado. procedure TBoletoWSREST.DefinirCertificado; begin BoletoWS.ArquivoCRT := Boleto.Configuracoes.WebService.ArquivoCRT; BoletoWS.ArquivoKEY := Boleto.Configuracoes.WebService.ArquivoKEY; // Adicionando a chave privada if NaoEstaVazio(BoletoWS.ChavePrivada) then begin if StringIsPEM(BoletoWS.ChavePrivada) then HTTPSend.Sock.SSL.PrivateKey := ConvertPEMToASN1(BoletoWS.ChavePrivada) else HTTPSend.Sock.SSL.PrivateKey := BoletoWS.ChavePrivada; end else if NaoEstaVazio(BoletoWS.ArquivoKEY) then HttpSend.Sock.SSL.PrivateKeyFile := BoletoWS.ArquivoKEY; // Adicionar o certificado if NaoEstaVazio(BoletoWS.Certificado) then begin if StringIsPEM(BoletoWS.Certificado) then HTTPSend.Sock.SSL.Certificate := ConvertPEMToASN1(BoletoWS.Certificado) else HTTPSend.Sock.SSL.Certificate := BoletoWS.Certificado; end else if NaoEstaVazio(BoletoWS.ArquivoCRT) then HTTPSend.Sock.SSL.CertificateFile := BoletoWS.ArquivoCRT; end; // ACBrBoletoWS.Rest.OAuth.pas uses ACBrOpenSSLUtils; // modificado o create para ler o certificado constructor TOAuth.Create(ASSL: THTTPSend; AACBrBoleto : TACBrBoleto = nil ); begin if Assigned(ASSL) then FHTTPSend := ASSL; FACBrBoleto := AACBrBoleto; // adiciona a chave privada if NaoEstaVazio(AACBrBoleto.Configuracoes.WebService.ChavePrivada) then begin if StringIsPEM(AACBrBoleto.Configuracoes.WebService.ChavePrivada) then FHTTPSend.Sock.SSL.PrivateKey := ConvertPEMToASN1(AACBrBoleto.Configuracoes.WebService.ChavePrivada) else FHTTPSend.Sock.SSL.PrivateKey := AACBrBoleto.Configuracoes.WebService.ChavePrivada; end else if NaoEstaVazio(AACBrBoleto.Configuracoes.WebService.ArquivoKEY) then FHTTPSend.Sock.SSL.PrivateKeyFile := AACBrBoleto.Configuracoes.WebService.ArquivoKEY; // adiciona o certificado if NaoEstaVazio(AACBrBoleto.Configuracoes.WebService.Certificado) then begin if StringIsPEM(AACBrBoleto.Configuracoes.WebService.Certificado) then FHTTPSend.Sock.SSL.Certificate := ConvertPEMToASN1(AACBrBoleto.Configuracoes.WebService.Certificado) else FHTTPSend.Sock.SSL.Certificate := AACBrBoleto.Configuracoes.WebService.Certificado; end else if NaoEstaVazio(AACBrBoleto.Configuracoes.WebService.ArquivoCRT) then FHTTPSend.Sock.SSL.CertificateFile := AACBrBoleto.Configuracoes.WebService.ArquivoCRT; FAmbiente := AACBrBoleto.Configuracoes.WebService.Ambiente; FClientID := AACBrBoleto.Cedente.CedenteWS.ClientID; FClientSecret := AACBrBoleto.Cedente.CedenteWS.ClientSecret; FScope := AACBrBoleto.Cedente.CedenteWS.Scope; FURL := ''; FContentType := ''; FGrantType := ''; FToken := ''; FExpire := 0; FErroComunicacao := ''; FPayload := False; FAuthorizationType := atBearer; end;
  14. Assim, vc fica criando o arquivo toda vez que for usar ele né, é uma alternativa mesmo, a que vou postar mexe só nos fontes do acbr e funciona, vamos vê se eles vão alterar, até a tarde eu posto.
  15. Opa amigo, eu consegui só que tive que alterar nos fontes do acordo, amanhã eu monto um esquema e posto aqui para ver se eles atualizam para todo mundo ou vc mesmo vai lá e muda.
  16. Exemplo de como eu uso no pix e funciona da maneira que eu gostaria que funcionasse no boleto: ACBrPSPSicoob1.ChavePrivada := FieldByName('privatekeypixsicoob').AsAnsiString; ACBrPSPSicoob1.Certificado := FieldByName('certificadopixsicoob').AsAnsiString;
  17. Boa Tarde! Estou fazendo a integração do ACBrBoleto para o banco Sicoob e estou passando por um problema, a questão é a seguinte.. Consegui fazer o ACBrBoleto Exemplo funcionar perfeitamente, porem para colocar em meu sistema eu precisava que uma parte fosse diferente, em relação a validação que o Sicoob exige, que é o certificado. No exemplo acbr é passado da seguinte forma: WebService.ArquivoCRT := 'C:\douglas\Boleto\Sicoob\SicoobCertificado.pem'; WebService.ArquivoKEY := 'C:\douglas\Boleto\Sicoob\SicoobChavePrivada.key'; Entretanto, ao invés de passar o caminho do arquivo, eu gostaria de passar o conteúdo do arquivo, pois eu tenho o conteúdo salvo em meu banco de dados, assim nao precisando do arquivo. Eu ja realizo isso pelo ACBrPix, pois la tem uma propriedade que recebe deste jeito, porem aqui no boleto nao achei esta opção de passar diretamente. Como eu queria passar: WebService.ArquivoCRT := '-----BEGIN CERTIFICATE-----' + 'MIIHPTCCBSWgAwIBAgIIMD8iBARHZXwwDQYJKoZIhvcNAQELBQAwWTELMAkGA1UE' ... + 'WHKi5RGWwQdjo9vXRTB4cTsnrbenvNrivJPAShPXQjbm' + '-----END CERTIFICATE-----'; WebService.ArquivoKEY := '-----BEGIN RSA PRIVATE KEY-----' + 'MIIEowIBAAKCAQEAgMDt48BLEuk/+gDX+PugSWMwxpK87SImir4n3a2A75FOvZkm' ... + 'sSlkF0VJ3sXN/tpQf3c3kQFvKBmlbcsMG8s58GPkpuNAzUrod2Vk' + '-----END RSA PRIVATE KEY-----'; Adentrando mais o codigo, encontrei o metodo que faz esta validação que é o define certificado: procedure TBoletoWSREST.DefinirCertificado; begin BoletoWS.ArquivoCRT := Boleto.Configuracoes.WebService.ArquivoCRT; BoletoWS.ArquivoKEY := Boleto.Configuracoes.WebService.ArquivoKEY; // Adicionando o Certificado if NaoEstaVazio(BoletoWS.ArquivoCRT) then HTTPSend.Sock.SSL.CertificateFile := BoletoWS.ArquivoCRT; if NaoEstaVazio(BoletoWS.ArquivoKEY) then HTTPSend.Sock.SSL.PrivateKeyFile := BoletoWS.ArquivoKEY; { if NaoEstaVazio(BoletoWS.ArquivoCRT) then HTTPSend.Sock.SSL.Certificate := BoletoWS.ArquivoCRT; if NaoEstaVazio(BoletoWS.ArquivoKEY) then HTTPSend.Sock.SSL.PrivateKey := BoletoWS.ArquivoKEY; Metodo que achei mas nao consegui fazer funcionar } end; Tentei utilizar trocando o CertificateFile por apenas Certificate, porem nao consegui fazer funcionar. Gostaria de saber se alguem ja passou por um problema parecido ou se tem algum outro metodo de fazer o que eu quero, que é passar estes dados por string e nao colocando o caminho do arquivo. Agradeço a ajuda.
  18. Descobri o motivo do erro, é simplismente porque o cnpj estava de outra empresa!
  19. Boa Tarde, gostaria de uma ajuda com um erro. Estou tentando passar os dados do projeto NFSex da ACBr, para a emissão de NFSe do meu sistema, porem estou com um erro que não consegui descobrir o que pode ser. No exemplo do ACBr eu consegui emitir normalmente, vou deixar em baixo linkado o xml de envio do Exemplo e de meu programa, e o arquivo de retorno dos dois. Para deixar mais explicito o erro, irei linkar abaixo. GerarNfseResposta xmlns="http://megasoftarrecadanet.com.br/xsd/nfse_v01.xsd"> <ListaMensagemRetorno> <MensagemRetorno> <Codigo>L000</Codigo> <Mensagem>Economico não encontrado</Mensagem> </MensagemRetorno> </ListaMensagemRetorno> </GerarNfseResposta> GerarNfseEnvio_ExemploACBr.xml GerarNfseEnvio_MeuPrograma.xml GerarNfseResposta_ExemploACBr.xml GerarNfseResposta_MeuPrograma.xml
  20. Realmente, então suponho que seja melhor adicionar uma validação de campos obrigatórios ao invés de tratar o erro na linha que marquei. É melhor assim para os dados completos, e que se estiver sem não vai acontecer um erro e não informar nada, como esta acontecendo hj.
  21. Boa Tarde, gostaria de fazer uma sugestão. Segue o código abaixo: try JsonDadosPagador.Add('tipoInscricao').Value.AsInteger := StrToInt(IfThen(Length( OnlyNumber(ATitulo.Sacado.CNPJCPF)) = 11,'1','2')); JsonDadosPagador.Add('numeroInscricao').Value.AsNumber := StrToInt64(OnlyNumber(ATitulo.Sacado.CNPJCPF)); JsonDadosPagador.Add('nome').Value.AsString := ATitulo.Sacado.NomeSacado; JsonDadosPagador.Add('endereco').Value.AsString := ATitulo.Sacado.Logradouro + ' ' + ATitulo.Sacado.Numero; JsonDadosPagador.Add('cep').Value.AsInteger := StrToInt(OnlyNumber(ATitulo.Sacado.CEP)); //ERRO AQUI JsonDadosPagador.Add('cidade').Value.AsString := ATitulo.Sacado.Cidade; JsonDadosPagador.Add('bairro').Value.AsString := ATitulo.Sacado.Bairro; JsonDadosPagador.Add('uf').Value.AsString := ATitulo.Sacado.UF; //JsonDadosPagador.Add('telefone').Value.AsString := JsonPairPagador := TJsonPair.Create(AJson, 'pagador'); try JsonPairPagador.Value.AsObject := JsonDadosPagador; AJson.Add('pagador').Assign(JsonPairPagador); finally JsonPairPagador.Free; end; finally JsonDadosPagador.Free; end; Eu estava verificando a documentação do Banco do Brasil, e na integração com boleto, os unicos campos obrigatórios para o preenchimento da parte do Pagador são: tipoInscricao e numeroInscricao. Quando fui realizar um teste onde o pagador não tem CEP, deu um erro na linha acima, na unit ACBrBoletoW_BancoBrasil_API, pois esta convertendo uma string vazia para um inteiro. Se puder adicionar uma validação, fico agradecido, que ai não precisa de colocar CEP obrigatório, já que para o Banco do Brasil não é, n sei para os outros bancos ainda.
  22. Cara, me ajudou muito. Já tinha feito a integração quase toda na mão, mas o que vale é a experiência, obrigado!
  23. Acbr boleto nao faz o que eu quero, que é enviar imediatamente o boleto, fazer as consultas da situação de como esta, identificar que ja esta pago, tipo como o NFE funciona, ou faz e eu nao to sabendo ?
  24. Bom dia, estou tentando fazer uma integração de boleto com o Banco do Brasil, usando o RestRequest, quando eu faço o POST pelo POSTMAN, vai tudo 100%, porem quando eu tento colocar em meu projeto delphi, da Bad Request. Os parâmetros que eu tenho que passar sao: - URL Header - Authorization - Content_type - Content_lenght - Host Body - Grand_Type - Scope Passando somente estes, no POSTMAN funciona. porem em meu código não vai, irei deixar uma imagem do POSTMAN e meu código como exemplo, se puderem me ajudar, muito agradecido. procedure TFRMFI056A.GeraToken; var AuthHeaderValue: String; ClientId, ClientSecret: String; Content: TStringStream; ContentLength: string; RequestBody: TStringStream; begin ClientId := BaGeralModel.Clientidpixbb; ClientSecret := BaGeralModel.Clientsecretpixbb; try RESTClient4.BaseURL := 'https://oauth.hm.bb.com.br/oauth/token'; AuthHeaderValue := 'Basic xxxxCodigoBasicAquixxxx; RESTRequest4.Params.AddHeader('Authorization', AuthHeaderValue); RESTRequest4.Params.ParameterByName('Authorization').Options := [poDoNotEncode]; RequestBody := TStringStream.Create('grant_type=client_credentials&scope=cobrancas.boletos-requisicao+cobrancas.boletos-info'); RESTRequest4.ClearBody; RESTRequest4.AddBody(RequestBody, TRESTContentType.ctAPPLICATION_X_WWW_FORM_URLENCODED); RESTRequest4.Params.AddHeader('Content-Type', 'application/x-www-form-urlencoded'); ContentLength := IntToStr(RequestBody.Size); RESTRequest4.Params.AddHeader('Content-Length', ContentLength); // Adicionar Host ao cabeçalho RESTRequest4.Params.AddHeader('Host', 'oauth.hm.bb.com.br'); try RESTRequest4.Execute; if RESTResponse4.StatusCode = 404 then begin // Exibir o conteúdo da resposta em um Memo ou mostrar uma mensagem de erro Memo1.Lines.Text := RESTResponse4.Content; ShowMessage('Erro 404: O recurso solicitado não foi encontrado.'); end; except on E: Exception do begin // Exibir mensagem de erro genérica Memo1.Lines.Text := RESTResponse4.Content; ShowMessage('Erro ao tentar realizar a solicitação: ' + E.Message); end; end; finally end; end;
  25. Bom dia, consegui a solução, na verdade o provedor Megasoft nao tem uma URL de homologação, a URL de produção e de teste sao as mesmas, se ta em homologação ou em produção, é eles que mudam la no site deles, confirmei isso com eles e eles ja mudaram para produção aqui para mim, agora tudo esta funcionando, muito obrigado!
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.