• 0
daniel.uramg

Ajuda para re-autenticar com refresh_token

Question

Olá pessoal,

bom primeiramente deixa eu dizer que meu conhecimento em PHP é bem básico, por isso meu aplicativo é uma enorme POG. Estou aprendendo com a necessidade.

Eu tenho um aplicativo em javascript (um complemento do Chrome) para pegar o código de rastreamento das vendas e cadastrar num serviço de rastreamento, a aplicação não "trabalha sozinha", eu abro os detalhes de cada venda e o Javascript pega o ID da venda e faz um request no meu PHP que por sua vez captura as informações da venda na API no ML.

A rotina no JS primeiro verifica se o pacote já foi adicionado, se já tiver sido nem continua a execução pois não precisa (quando ele executa armazena uma variável local no navegador para posterior checagem).

Então supondo que o pacote ainda não foi adicionado, o JS faz uma requisição com Ajax no PHP hospedado no meu servidor que tenta capturar o tracking_number na API, se não tiver esta informação geralmente é porque meu acesso expirou então ele abre uma janela chamando o PHP que me autentica na aplicação, e em seguida tenta novamente obter o tracking_number.

Blz funciona, só que toda vez (se passar de 6 horas) ele não consegue obter o rastreamento e abre a janela para me re-autenticar.

Gostaria de uma ajuda de como usar o refresh_token para o próprio servidor requisitar o novo access_token sem a necessidade desse vai-e-vem que eu estou fazendo.

Este é o PHP que faz a autenticação e grava o acess_token num TXT que é lido pelo outro PHP que tenta obter o tracking_number:

<?php
session_start('Login');
require 'meli.php';
$meli = new Meli('1234567890', 'abcdefg', $_SESSION['access_token'], $_SESSION['refresh_token']);
if($_GET['code'] || $_SESSION['access_token']) {
	// If code exist and session is empty
	if($_GET['code'] && !($_SESSION['access_token'])) {
		// If the code was in get parameter we authorize
		$user = $meli->authorize($_GET['code'], 'https://www.meusite.com/index.php');
		
		// Now we create the sessions with the authenticated user
		$_SESSION['access_token'] = $user['body']->access_token;
		$_SESSION['expires_in'] = time() + $user['body']->expires_in;
		$_SESSION['refresh_token'] = $user['body']->refresh_token;
	} else {
		// We can check if the access token in invalid checking the time
		if($_SESSION['expires_in'] < time()) {
			try {
				// Make the refresh proccess
				$refresh = $meli->refreshAccessToken();
				// Now we create the sessions with the new parameters
				$_SESSION['access_token'] = $refresh['body']->access_token;
				$_SESSION['expires_in'] = time() + $refresh['body']->expires_in;
				$_SESSION['refresh_token'] = $refresh['body']->refresh_token;
			} catch (Exception $e) {
			  	echo "Exception: ",  $e->getMessage(), "\n";
			}
		}
	}
	//armazena dados da sessão
	unlink("token.txt"); //primeiro apaga o arquivo
	$fp = fopen("token.txt", 'a');
	fwrite($fp, $_SESSION['access_token']);
	fclose($fp);
	
	//grava nome do usuario
	date_default_timezone_set('America/Sao_Paulo');
	$datahora = date("d/m/y - G:i");
	$params = array('access_token' => $_SESSION['access_token']);
	$userinfo = "/users/me";
	$user_info = $meli->get($userinfo, $params);
	$username = $user_info['body']->nickname;
	$email = $user_info['body']->email;
	$fp = fopen("users.html", 'a');
	fwrite($fp, "<p>" .$datahora. " - " .$username. " - " .$email. "</p>\n");
    fclose($fp);
	
	//exibe informações da sessão
	echo '<pre>';
		print_r($_SESSION);
	echo '</pre>';
	echo '<body onload="javascript: window.close()"></body>';
	
} else {
	echo '<body onload="javascript: location.href=\'' . $meli->getAuthUrl('https://www.meusite.com/index.php') . '\'"></body>';
}

 

Share this post


Link to post
Share on other sites

6 answers to this question

Recommended Posts

  • 0

Consegui.

Index.php:

<?php
header("Access-Control-Allow-Origin: *");
header("Content-Type: text/html; charset=UTF-8");

//session_start('Login');
require 'dependences/meli.php';
require 'dependences/dados.php';

$meli = new Meli($app_id, $secret_key, $_SESSION['access_token'], $_SESSION['refresh_token']);
if($_GET['code'] || $_SESSION['access_token']) {
	// If code exist and session is empty
	if($_GET['code'] && !($_SESSION['access_token'])) {
		// If the code was in get parameter we authorize
		$user = $meli->authorize($_GET['code'], $url_callback);
		// Now we create the sessions with the authenticated user
		$_SESSION['access_token'] = $user['body']->access_token;
		$_SESSION['expires_in'] = time() + $user['body']->expires_in;
		$_SESSION['refresh_token'] = $user['body']->refresh_token;
	} else {
		// We can check if the access token in invalid checking the time
		if($_SESSION['expires_in'] < time()) {
			try {
				// Make the refresh proccess
				$refresh = $meli->refreshAccessToken();
				// Now we create the sessions with the new parameters
				$_SESSION['access_token'] = $refresh['body']->access_token;
				$_SESSION['expires_in'] = time() + $refresh['body']->expires_in;
				$_SESSION['refresh_token'] = $refresh['body']->refresh_token;
			} catch (Exception $e) {
			echo "1 catch\n";
			  	echo "Exception: ",  $e->getMessage(), "\n";
			}
		}
	}

//Chama o PHP que salva o token no XML do usuário
require 'dependences/save_token.php';

//exibe informações da sessão
echo '<pre>';
	print_r($_SESSION);
echo '</pre>';
echo '<body onload="javascript: window.close()"></body>';
	
} else {
	echo '<body onload="javascript: location.href=\'' . $meli->getAuthUrl($url_callback) . '\'"></body>';
}

save_token.php

<?php
//Arquivo chamado para gravar os dados do usuário no XML

//variávels
$params = array('access_token' => $_SESSION['access_token']);
$userinfo = "/users/me";
$user_info = $meli->get($userinfo, $params);
$username = $user_info['body']->nickname;
$userid = $user_info['body']->id;

//Array com os dados do usuário
$dados = array();
$dados[0]['user_id'] = $userid;
$dados[0]['user_name'] = $username;
$dados[0]['access_token'] = $_SESSION['access_token'];
$dados[0]['refresh_token'] = $_SESSION['refresh_token'];
$dados[0]['expires_in'] = $_SESSION['expires_in'];

// Receberá todos os dados do XML
$xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
$xml .= "<users>\n\t<user>\n";
// Loop dos valores
for ( $i = 0; $i < count( $dados ); $i++ ) {
 $xml .= "\t\t<user_id>" . $dados[$i]['user_id'] . "</user_id>\n";
 $xml .= "\t\t<user_name>" . $dados[$i]['user_name'] . "</user_name>\n";
 $xml .= "\t\t<access_token>" . $dados[$i]['access_token'] . "</access_token>\n";
 $xml .= "\t\t<refresh_token>" . $dados[$i]['refresh_token'] . "</refresh_token>\n";
 $xml .= "\t\t<expires_in>" . $dados[$i]['expires_in'] . "</expires_in>\n";
}
$xml .= "\t</user>\n</users>";
//Armazena os dados no XML do usuário
$fp = fopen('users/' . $username . '.xml', 'w+');
fwrite($fp, $xml);
fclose($fp);
?>

 

dados.php:

<?php
//Variáveis para serem lidas pelos outros arquivos

$app_id = '1111111111111';
$secret_key = 'xxxxxxxxxxxxxxxxxxxx';
$url_callback = 'https://www.wwwwwwwww.com/index.php';
?>

get_tn.php:

<?php

header("Access-Control-Allow-Origin: *");
header("Content-Type: application/javascript; charset=UTF-8");
session_start('Get Order Info');
require 'dependences/meli.php';
require 'dependences/dados.php';

//Variáveis recebidos na URL
$order_number = $_GET['order'];
$username = $_GET['username'];

//Lê o XML com os dados do usuário
$user_file = simplexml_load_file('users/' .$username.'.xml');
$user_id = $user_file->user[0]->user_id;
$access_token = $user_file->user[0]->access_token;
$refresh_token = $user_file->user[0]->refresh_token;
$expires_in = $user_file->user[0]->expires_in;
//echo "" .$user_id. "\n" .$access_token. "\n" .$refresh_token. "\n" .$expires_in. "\n"; //debug

//Chama o SDK
$meli = new Meli($app_id, $secret_key, $access_token, $refresh_token);

//Checa se a sessão expirou para renovar o token
//$conta = $expires_in-time(); //debug
//echo "Token expira em: " .$conta/60/60 . " horas\n"; //debug
if($expires_in < time()) {
	try {
		// Make the refresh proccess
		$refresh = $meli->refreshAccessToken();
		// Now we create the sessions with the new parameters
		$access_token = $refresh['body']->access_token;
		$expires_in = time() + $refresh['body']->expires_in;
		$refresh_token = $refresh['body']->refresh_token;
		require 'dependences/save_token.php'; //Chama o arquivo para armazenar os novos dados du usuário
	} catch (Exception $e) {
	echo "1 catch\n";
		echo "Exception: ",  $e->getMessage(), "\n";
	}
}

$params = array('access_token' => $access_token);
$order = "/orders/" .$order_number. "/shipments"; //dados da venda como Tracking Number
$response = $meli->get($order, $params);
$order2 = "/orders/" .$order_number. ""; //dados da venda como Email
$response2 = $meli->get($order2, $params);

//Exibe retorno
	print_r ($response);
	print_r ($response2);
?>

 

Share this post


Link to post
Share on other sites
  • 1
On 22/07/2017 at 0:05 PM, daniel.uramg said:

Estou tentando fazer com base na documentação mas não sei se trocaram a URL, pois me retorna erro 404.

A URL de reautenticar conforme http://developers.mercadolibre.com/pt-br/server-side/ é 


https://api.mercadolibre.com/oauth/token?grant_type=refresh_token&client_id=APP_ID&client_secret=SECRET_KEY&refresh_token=REFRESH_TOKEN

mas aqui da erro de página não encontrada..

Eu tbm to com o msm problema inclusive eu tinha um codigo como esse q vc mostrou anteriormente e funcionava até com tokens de semanas atras e agr o meu codigo parou de funcionar e esse codigo da documentação retorna 404 

Share this post


Link to post
Share on other sites
  • -1

Estou tentando fazer com base na documentação mas não sei se trocaram a URL, pois me retorna erro 404.

A URL de reautenticar conforme http://developers.mercadolibre.com/pt-br/server-side/ é 

https://api.mercadolibre.com/oauth/token?grant_type=refresh_token&client_id=APP_ID&client_secret=SECRET_KEY&refresh_token=REFRESH_TOKEN

mas aqui da erro de página não encontrada..

Share this post


Link to post
Share on other sites
  • -1
4 hours ago, daniel.uramg said:

Complicado este fórum, me parece que toda dica na maioria dos posts é "Leia a documentação"...

é porque quase todas as perguntas (como esta sua), são de coisas que estão na documentação ... infelizmente a maioria vem no fórum não para aprender ou colaborar, mas sim querendo códigos prontos... triste realidade...

Share this post


Link to post
Share on other sites
  • -2

Olá @daniel.uramg

esse assunto do refresh token já foi bastante discutido por aqui, pesquise no fórum que irá encontrar muito material sobre isso (incluindo códigos de exemplo), além do material da documentação

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