Ir para conteúdo
  • Cadastre-se

dev botao

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

Recommended Posts

Postado

Olá bom dia a todos, como assunto 'diversos' do delphi gostaria de saber se alguém por aqui já consumiu a API do iFOOD via delhi com indy, rest.. etc, peguei alguns exemplos mas não obtive sucesso na tarefa, ainda não consegui retornar nem o token via json ( eles trabalham com token, pega a chave com validacao de usuario e senha e trabalha com ela até vencer, esta é a primeira etapa apenas e a mais simples ), fico grato por qualquer ajuda possível, exemplos e código são muito bem vindos, desde já agradeço a todos.

Postado
Em 30/05/2019 at 08:58, AlexBecker disse:

Olá bom dia a todos, como assunto 'diversos' do delphi gostaria de saber se alguém por aqui já consumiu a API do iFOOD via delhi com indy, rest.. etc, peguei alguns exemplos mas não obtive sucesso na tarefa, ainda não consegui retornar nem o token via json ( eles trabalham com token, pega a chave com validacao de usuario e senha e trabalha com ela até vencer, esta é a primeira etapa apenas e a mais simples ), fico grato por qualquer ajuda possível, exemplos e código são muito bem vindos, desde já agradeço a todos.

tente isso pois a forma de autenticação é a mesma. eu consegui usando esse link (tambem uso woocommerce assim) :

https://developers-forum.mercadolibre.com/topic/1675-delphi-7-token-autenticação/

vc ja fez o cadastro para poder utilizar a api do ifood. é necessário  enviar um email com seus dados para ter acesso a api

fora isso é só seguir o link acima

Postado

Você pode converter o JSON em DataSet, eu particularmente acho bem mais fácil.

  • client_id e client_secret: Obtido através do cadastro da SoftHouse no site do iFood.
  • username e password: Obtido através do cadastro do seu cliente no site do IFood. Ou seja, devem ser variáveis no seu software.
var
IdHTTPConexao: TidHTTP;
aArg: TStringList;
begin
  IdHTTPConexao := TidHTTP.Create;
  aArg          := TStringList.Create;
  try
    aArg.Add('client_id='+FClientID);
    aArg.Add('client_secret='+FClientSecret);
    aArg.Add('grant_type=password');
    aArg.Add('username='+FUsername);
    aArg.Add('password='+FPassword);

    with IdHTTPConexao do
    begin
      Request.Accept := 'application/json';
      JsonToDataset(FDMemTable1, Post('https://pos-api.ifood.com.br/oauth/token', aArg));
    end;

    FDMemTable1.First;
    FToken   := FDMemTable1.FieldByName('access_token').AsString; //<-Guada esse token para as demais requisições
    FExpires := FDMemTable1.FieldByName('expires_in').AsString;   //<-Deve executar esse método novamente quando expirar
  finally
    IdHTTPConexao.Free;
    aArg.Free;
  end;
  • Após obter o Token é necessário dar GET no endpoint /events:polling a cada 30 segundos. É aqui que você recebe um resumo dos pedidos ainda não capturados.
var
IdHTTPConexao: TidHTTP;
JSONRetorno: TStringStream;
begin
  IdHTTPConexao := TidHTTP.Create;
  JSONRetorno   := TStringStream.Create('', TEncoding.UTF8);
  try
    with IdHTTPConexao 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');
      Request.CustomHeaders.AddValue('Authorization', 'bearer'+FToken);
      Request.CustomHeaders.AddValue('cache-control', 'no-cache');
      Request.Accept := 'application/json';
      Get('https://pos-api.ifood.com.br/v1.0/events%3Apolling', JSONRetorno);
      JsonToDataset(FDMemTableResumo, JSONRetorno.DataString);
    end;

    with FDMemTableResumo do
    begin
      First;
      while not Eof do
      begin
        FieldByName('id').AsString;            //<-Id do evento. Necessário guardar para limpar a fila depois de processar esse evento.
        FieldByName('code').AsString;          //<-Status retornado para o pedido (Confirmado, cancelado...).
        FieldByName('correlationId').AsString; //<-Código do pedido. Com esse código que você obtem o detalhamento do pedido.
        FieldByName('createdAt').AsString;     //<-Data de criação do evento.
        Next;
      end;
    end;
  finally
    IdHTTPConexao.Free;
    JSONRetorno.Free;
  end;
end;

Não vou postar um exemplo pois aqui o código fica grande e cada aplicação tratará diferente os resultados... Mas a lógica é a mesma. Não esqueça de alterar o status do pedido quando processar ele. O status integration é obrigatório.

  • Após processar todos os pedidos, chegou a hora de limpar a fila... Alguns limpam a fila no final do dia. Mas particularmente eu prefiro limpar a fila a cada execução do polling.
IdHTTPConexao: TidHTTP;
aArg: TStringStream;
FIds: string;
begin
  FIds := '';
  with FDMemTableResumo do
  begin
    while not Eof do
    begin
      if FIds <> '' then
        FIds := FIds + ', ';
      FIds := FIds + '{"id":"'+FieldByName('id').AsString+'"}';
      Next;
    end;
  end;

  if FIds <> '' then
  begin
    FIds          := '['+FIds+']';
    IdHTTPConexao := TidHTTP.Create;
    aArg          := TStringStream.Create(FIds, TEncoding.UTF8);
    try
      with IdHTTPConexao 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');
        Request.CustomHeaders.AddValue('Authorization', 'bearer'+FToken);
        Request.CustomHeaders.AddValue('cache-control', 'no-cache');
        Request.Accept := 'application/json';
        Post('https://pos-api.ifood.com.br/v1.0/events/acknowledgment', aArg);
      end;
    finally
      aArg.Free;
      IdHTTPConexao.Free;
    end;
  end;

Enfim, é mais ou menos isso... Claro, da pra otimizar muito esse código. Deixei da forma mais simples possível. Uma outra solução seria utilizar RestClient ao invés do Indy..

Vou deixar alguns links bem legais explicando com mais detalhes o funcionamento:

Documentação iFood

A função JsonToDataSet pode ser encontrada aqui.

Palestra do Kleberson Toro para o CodeRage Brasil 2019

Fórum do iFood

Ah, uma observação... Na documentação do iFood já podemos notar que existe uma versão 2.0 para a API. A mesma está liberada apenas para /orders. Então caso for integrar, já use o novo endrpoints

  • Curtir 1
Postado (editado)

Muito obrigados pelos exemplos postados até agora, são de GIGANTE ajuda, estou conseguindo consumir a api, por enquanto no tratamento do evento polling ainda mas caminhando, obrigado a todos, se alguem quiser postar mais sobre os eventos de CANCELAMENTO, ACEITAÇÃO e REJEIÇÃO de pedidos, ou se tiver outros código a contribuir fico muito grato mesmo!  notei que quando faço o pedido pelo site do ifood como usuário cadastrado eu devo enviar um evento ou de cancelamento ou de aceitação, se eu estiver utilizando o gerenciador do ifood instalado em meu pc ele fica simulando o toque do telefone por até 3 minutos e por ele eu consigo confirmar ou cancelar o evento, porém na minha aplicação ainda não cheguei neste ponto.

Editado por AlexBecker
inclusão de mais detalhes.
  • Este tópico foi criado há 2004 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

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

The popup will be closed in 10 segundos...