Ir para conteúdo
  • Cadastre-se

Douglas Conceição

Membros
  • Total de ítens

    50
  • Registro em

  • Última visita

Posts postados por Douglas Conceição

  1. 2 horas atrás, Victor H. Gonzales - Panda disse:

    Anexa a unit aqui no topico, envie os dados para consulta para testes para [email protected] e vincule no corpo esse topico.

    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.

  2. 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.
     

     

  3. 21 horas atrás, DouglasDll disse:

    Boa tarde.. uma duvida...

    Conseguimos acompanhar o andamento desse ticket interno?

     

    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.

  4. 3 horas atrás, wilmar disse:

    Douglas por favor ver o que estou fazendo errado rs

    cnpj teste.rar 898.57 kB · 6 downloads

    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.

    ImagemTeste.png

  5. 43 minutos atrás, wilmar disse:

    Fiz tudo certo mas não entra no evento Chromium1AfterCreated nem no Chromium1LoadEnd
    o que fiz de errado 

    No create do seu formulario, colocou este codigo?
     

    Chromium1.CreateBrowser(CEFWindowParent1);

     

  6. 30 minutos atrás, wilmar disse:

    Douglas estou com esse erro no Chromium identificador não declarado: 'ICefBrowser',
    sabe me informa qual unit declarar. Meu delphi rio

    Voce instalou a biblioteca do CEF4Delphi ?
    Aqui no meu quando coloquei este comando que me passou, verifiquei que fica na unit    uCEFInterfaces.

  7. 4 minutos atrás, Sandro Felipe Adad disse:

    So que deixe essa tela redimensionavel, acabo de pegar um captcha diferente retornado pela receita.

    Como é o deploy do projeto chromium, o que precisa ser distribuido junto a aplicação delphi?

    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.

    • Curtir 1
  8. 4 minutos atrás, wilmar disse:

    Boa tarde!! ficou top!! mas onde vai esse código, onde colocar o link

    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.

    • Curtir 2
  9. 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...

    beeimgtmp-20230914-141905.png

    • Curtir 2
  10. 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;	

     

  11. 9 minutos atrás, FSoftware disse:

    Opa, obrigado, também achei outra solução, para alimentar o componente eu salvou o conteúdo do meu Field ,onde esta meu certificado no BD, em uma StringList e dou um SaveToFile e passo o caminho onde salvei esse arquivo 

    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.

  12. 57 minutos atrás, FSoftware disse:

    No meu caso tambem gostaria de guardar o certificado no banco e utiliza-lo alimentando o componente, e sou estou conseguindo passando o caminho onde esta o arquivo, Alguem poderia ajudar como solucionar ?

    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.

  13. 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.

  14. 23 minutos atrás, Douglas Conceição disse:

    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 4.61 kB · 0 downloads GerarNfseEnvio_MeuPrograma.xml 4.61 kB · 0 downloads GerarNfseResposta_ExemploACBr.xml 2.13 kB · 0 downloads GerarNfseResposta_MeuPrograma.xml 245 B · 0 downloads

    Descobri o motivo do erro, é simplismente porque o cnpj estava de outra empresa!

  15. 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

  16. 59 minutos atrás, Daniel InfoCotidiano disse:

    Mas não seria uma boa prática enviar todos os dados?
    Se você enviar uma instrução de protesto não vai ser rejeitado a instrução por falta de dados?
    Como vão notificar o protesto sem os dados ?

    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.

  17. 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.

  18. 1 minuto atrás, Juliomar Marchetti disse:

    Mas porque se tem o ACBrBoleto e o mesmo já faz isso pra ti!

    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 ?

  19. 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;


     

    Img2.png

    Img3.png

    Img1.png

×
×
  • 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.