Ir para conteúdo
  • Cadastre-se

dev botao

  • Este tópico foi criado há 1556 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Postado

Pessoal, queria uma força de quem está tentando fazer integração do iFood ou de quem souber resolver este problema. Abaixo o trexo do código:

var
  Indy: TidHTTP;
  sURL: WideString;
  ssResponse: TStringStream;
  sToken: String;
begin
  sToken := memo1.Lines.Text;
  sURL := 'https://pos-api.ifood.com.br/v3.0/orders/'+ edtReference.text;
  ssResponse := TStringStream.Create;
  Indy := TidHTTP.Create;
  try
    with Indy do
    begin
//      Request.Clear;
//      Request.ContentType         := 'application/json';
//      Request.Charset             := 'UFT-8';
//      Request.BasicAuthentication := False;
//      Request.CustomHeaders.Clear;
//      Request.CustomHeaders.AddValue('Content-Type', 'application/json');
      ProtocolVersion := pv1_1;
      Request.CustomHeaders.AddValue('Authorization', 'Bearer ' + sToken);
//      Request.CustomHeaders.AddValue('cache-control', 'no-cache');
//      Request.Accept := 'application/json';

      Get(sURL, ssResponse);
    end;
  except on E: EIdHTTPProtocolException do
      if not (E.ErrorCode in [200,201,202]) and not(E.ErrorCode = 404) then
        MessageDlg( 'Erro de Requisição' + #13#10 + 'Code: ' + IntToStr(E.ErrorCode) + ' ' + E.Message , mtInformation, [mbOK], 0 );
  end;

Pois bem. Estou tentando fazer  requisições dos endpoints de Orders do ifood, segue link com a decumentação: https://developer.ifood.com.br/reference#eventspolling.

Estou conseguindo pegar o Token, com o token faço o Polling sem problemas. Quando chego na parte da mudança de status dos pedidos, encontro sempre o seguinte erro '401 - Unauthorized', sergundo o ifood o seguinte erro ocorre por conta que o token não ser valido. Mas o mesmo token no PostMan faz a requisição.

Já tentei até acrescentar os header no postMan, ja tirei todos os Header deixando apenas o Authorization. Então recorro a este forum, e pergunto alguém tem alguma ideia do que seja?

  • 1 mês depois ...
  • 3 meses depois ...
Postado

 

Em 20/05/2020 at 10:14, Michele disse:

Bom dia, como vc preencheu os parâmetros pra rodar o polling, não estou conseguindo, dá esse erro que vc falou.

2 horas atrás, Daniel Luis Dias disse:

Também estou com o mesmo problema. Alguém resolveu?

Ola Michele e Daniel, se estiverem precisando ou para alguém que tenha a mesma dúvida vou postar trechos de códigos que usei para estar conseguindo o token.

TParametros = class
  private
    FGrantType: String;
    FClientId: String;
    FClientSecret: String;
    FPassword: String;
    FUsername: String;
    FMerchant: String;
  public
    property Merchant: String read FMerchant write FMerchant;
    property ClientId: String read FClientId write FClientId;
    property ClientSecret: String read FClientSecret write FClientSecret;
    property GrantType: String read FGrantType write FGrantType;
    property Username: String read FUsername write FUsername;
    property Password: String read FPassword write FPassword;

    constructor Create;
  end;

No create desta Classe eu carrego os parâmetros, inicialmente eu coloquei em um arquivo ini

constructor TParametros.Create;
var
  oIni: TIniFile;
begin
  oIni := TIniFile.Create(TNjFunc.GetIniFileName);
  try
    FMerchant     := TNjFunc.Decrypt(oIni.ReadString('iFood','Merchant',''));
    FClientId     := TNjFunc.Decrypt(oIni.ReadString('iFood','ClientId',''));
    FClientSecret := TNjFunc.Decrypt(oIni.ReadString('iFood','ClientSecret',''));
    FGrantType    := TNjFunc.Decrypt(oIni.ReadString('iFood','GrantType',''));
    FUsername     := TNjFunc.Decrypt(oIni.ReadString('iFood','Username',''));
    FPassword     := TNjFunc.Decrypt(oIni.ReadString('iFood','Password',''));
  finally
    FreeAndNil(oIni);
  end;
end;

Após eu tenho uma outra classe que faz as requisições dos outros EndPoints, mas está faz requisição do Token

function TResquestIFOOD.GetToken: Boolean;
var
  slParams: TStringList;
  ssResponse: TStringStream;
  soResponse: ISuperObject;
  sURL: String;
  {$REGION 'CARREGA CREDENCIAIS'}
  procedure LoadParams;
  begin
    with slParams do
    begin
      Add('client_id='     + FParams.ClientId);
      Add('client_secret=' + FParams.ClientSecret);
      Add('grant_type='    + FParams.GrantType);
      Add('username='      + FParams.Username);
      Add('password='      + FParams.Password);
    end;
  end;
  {$ENDREGION}

begin
  Result := False;
  //Montando URL
  sURL := FURL;
  sURL := sURL + '/oauth/token';

  slParams := TStringList.Create;
  ssResponse := TStringStream.Create;
  LoadParams;

  try
    if TMethodUtils.POST(sURL, slParams, ssResponse, True, FToken, FAPI) then
    begin
      soResponse := SO(ssResponse.DataString);
      FToken := soResponse.S['access_token'];
      Result := True
    end;
  finally
    FreeAndNil(ssResponse);
    FreeAndNil(slParams);
  end;
end;

Na época eu estava com erro ao fazer o Polling, a URL estavá correta e o token também. Porém o header que eu estava mandando que estava errado. Então quando é para conseguir pegar o Token eu uso um tipo de Header e para os demais endspoints eu uso outro. Segue abaixo:

if pIsGetToken then
begin
	Request.Accept := 'application/json';
end
else
begin
	Request.Clear;
	Request.ContentType  := 'application/json';
	Request.CustomHeaders.AddValue('Authorization', 'Bearer ' + pToken);
end;

Obs:

Usamos Delphi 10.3

Para Parse e criação de objetos Json: https://github.com/onryldz/x-superobject

 

  • Curtir 2
  • Obrigado 1
  • Este tópico foi criado há 1556 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.
Visitante
Este tópico está agora fechado para novas respostas
×
×
  • 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.