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