• 0
felipe.ksw

Gerar novo token como php puro

Question

Pessoal, boa tarde.

Eu estou com dificuldades de entender a documentação da API para gerar um novo token. Hoje, quando o cliente precisa ele acessa esse link: http://developers.mercadolibre.com/pt-br/automovel-autenticacao-autorizacao/#token  para gerar o token e posteriormente executar os relatórios que ele precisa. Essa é a forma que foi desenvolvido para ele.

Mas como quero automatizar uma verificação, queira colocar na cron uma tarefa recorrente e para isso vou precisar gerar novos tokens a cada 6 horas que eu também colocaria como uma outra tarefa na cron.

O problema é que não estou conseguindo me entender com as chamadas curl para essa finalidade... Segue abaixo parte do codigo que estou usando, ele não me retorna nada, nenhuma msg...
 

$client_id = '232114xxxxxxxx';
$client_secret = 'h0UuuufVHXGaCjxxxxxxxxxxxxx';
$code = 'TG-5addf4a2e4b0a6add07c1556-xxxxxxxxxx';
$urlReturn = 'https://www.mercadopago.com';

$chUrl = 'https://api.mercadolivre.com/oauth/token?grant_type=authorization_code&client_id='.$client_id.'&client_secret='.$client_secret.'&code='.$code.'&redirect_uri='.$urlReturn;

$cabecalho = array (
    'Accept: application/json',
    'Content-Type: application/x-www-form-urlencoded',
    'User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:13.0) Gecko/20100101 Firefox/13.0'
);

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL,            $chUrl);    
curl_setopt($ch, CURLOPT_HTTPHEADER,     $cabecalho);

curl_setopt($ch, CURLOPT_POST,           true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

$resposta = curl_exec($ch);

// DEBUG
echo $resposta.PHP_EOL;

$arrRet = json_decode($resposta, true);

echo $arrRet['access_token'];

// DEBUG
print_r ( $arrRet );

 

O que estou fazendo de errado?

 

Obrigado

Felipe

Share this post


Link to post
Share on other sites

10 answers to this question

Recommended Posts

  • 0

Felipe,

a url de retorno tem que ser o mesmo endereço que você cadastrou na aplicação e um endereço que você tenha acesso, pois não terá como ver o retorno se mandar para o MercadoPago.
Este passo só é utilizado na autorização de uso da aplicação pelo cliente, não é para renovação de token.
Renovação de token você utiliza o refresh_token.

 

 

Share this post


Link to post
Share on other sites
  • 0

O que você está fazendo errado é não ler a documentação (ou ler no local errado). Nesta mesma página que você informou tem a informação do que precisa fazer. Você precisa criar um aplicativo e usá-lo para a autorização, conforme o item “Autorização Server-Side”. Siga o fluxo lá. Quando o usuário fizer a autorização você precisa guardar o token, o refresh_token e é bom ver a validade (expires_in). Quando o token expirar, você precisa fazer um Refresh, usando o refresh_token armazenado no processo anterior.

Siga o passo a passo, pois lá está explicado isso, inclusive tem até desenho do fluxo.

 

Share this post


Link to post
Share on other sites
  • 0

OK,

a documentação que li é a mesma passada (Autorização Server-Side)... fiz os passos iniciais (tudo via browser) e funcionaram... peguei o auth code, e solicitei o token, funcionou tudo certinho via browser... Mas na hora de automatizar me deparei com esse primeiro problema que coloquei acima.

Sobre o url de retorno, como eu posso fazer se estou tentando gerar um token a partir de um servidor dentro da rede do cliente? Não tenho uma url de callback. Deixei a do mercado pago (exemplos), pois funcionou quando fiz a chamada direta no browser... mas não sei qual está registrada na aplicação, amanhã confirmo com o cliente.

Eu ainda não consegui chegar na parte do refresh_token...

Bom, olhando as chamadas do curl, parecem OK ou tem algum parametro/config que estou fazendo de errado?

Obrigado

 

Share this post


Link to post
Share on other sites
  • 0

obrigatoriamente tem que existir uma URL de retorno para gerar o token ("primeiro acesso"), após ter o token não é necessário URL de retorno para o fluxo server-side... como disse, recomendo dar uma estudada no oAuth2 antes pois essa é uma característica desse tipo de autenticação

Share this post


Link to post
Share on other sites
  • 0

Bom,

como estava consufo parti do zero. Criei um aplicativo novo e usei a chamda https://auth.mercadolibre.com.ar/authorization?response_type=code&client_id=App_id 

ele me direcionou para a tela para permitir esse novo app, confirmei e ele me direcionou direto para a minha URL de retorno já com o access_token (com data de expiração) e não com o AUTHORIZATION_CODE como está na documentação.

Nesse ponto a dúvida é : tem algum problema isso uma vez que me retornou um token válido?

A dúvida seguinte é: daqui 6 horas esse token vai expirar e vou precisar fazer o refresh com essa chamada: https://api.mercadolibre.com/oauth/token?grant_type=refresh_token&client_id=APP_ID&client_secret=SECRET_KEY&refresh_token=REFRESH_TOKEN

onde o REFRESH_TOKEN é esse token que eu gerei anteriormente e está expirado, certo?

Obrigado

Share this post


Link to post
Share on other sites
  • 0
9 hours ago, felipe.ksw said:

Bom,

como estava consufo parti do zero. Criei um aplicativo novo e usei a chamda https://auth.mercadolibre.com.ar/authorization?response_type=code&client_id=App_id

ele me direcionou para a tela para permitir esse novo app, confirmei e ele me direcionou direto para a minha URL de retorno já com o access_token (com data de expiração) e não com o AUTHORIZATION_CODE como está na documentação.

Nesse ponto a dúvida é : tem algum problema isso uma vez que me retornou um token válido?

A dúvida seguinte é: daqui 6 horas esse token vai expirar e vou precisar fazer o refresh com essa chamada: https://api.mercadolibre.com/oauth/token?grant_type=refresh_token&client_id=APP_ID&client_secret=SECRET_KEY&refresh_token=REFRESH_TOKEN

onde o REFRESH_TOKEN é esse token que eu gerei anteriormente e está expirado, certo?

Obrigado

Refresh token vem junto com o acess token, são coisas diferentes

Share this post


Link to post
Share on other sites
  • 0
12 hours ago, felipe.ksw said:

Bom,

como estava consufo parti do zero. Criei um aplicativo novo e usei a chamda https://auth.mercadolibre.com.ar/authorization?response_type=code&client_id=App_id

ele me direcionou para a tela para permitir esse novo app, confirmei e ele me direcionou direto para a minha URL de retorno já com o access_token (com data de expiração) e não com o AUTHORIZATION_CODE como está na documentação.

Nesse ponto a dúvida é : tem algum problema isso uma vez que me retornou um token válido?

A dúvida seguinte é: daqui 6 horas esse token vai expirar e vou precisar fazer o refresh com essa chamada: https://api.mercadolibre.com/oauth/token?grant_type=refresh_token&client_id=APP_ID&client_secret=SECRET_KEY&refresh_token=REFRESH_TOKEN

onde o REFRESH_TOKEN é esse token que eu gerei anteriormente e está expirado, certo?

Obrigado

Ao criar o aplicativo você marcou a opção de offline_access? Só gera o refresh token se tiver esta opção marcada.

Vai vir tudo junto (access_token, refresh_token e expires_in) na chamada após usar o AUTHORIZATION_CODE. O expires_in é fixo e indica um período de 6 horas, mas recomendo usá-lo, caso algum dia o ML resolva aumentar ou reduzir este tempo. O ideal é somar à hora atual para saber quando vence o token, mas recomendo considerar uns minutos a menos por segurança (ou tentar renovar o access_token caso dê erro na hora de usá-lo). Lembrando que para renovar o token usa-se o refresh_token apenas e o token pode ser renovado antes ou mesmo depois de expirado. Não precisa renovar a cada 6 horas se não estiver fazendo uso do access_token neste período e não é recomendável ficar renovando em períodos muito curtos. Ao renovar, você recebe tudo novo (access_token, refresh_token e expires_in) e daí prá frente usa estes dados para as próximas chamadas.

Share this post


Link to post
Share on other sites
  • 0

opa...

Agora entendi bem o fluxo (depois de apanhar um pouco),  e também descobri o erro na minha configuração do curl.. Deu certo!

Como rotina, eu fiz um script para refresh que faz a busca pela chamada /users/me?access_token= e verifico se a 'chave' id bate com o id do cliente se nao bater é que o token expirou ai entro com o processo de refresh. Como solicitei o token inicial em uma hora cheia (13h00), coloquei o cron para executar a cada hora cheia + 1 minuto...

Ainda não expirou nenhum, mas acredito que vai funcionar de boa....

Obrigado pela Ajuda!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now