daniel.uramg

Members
  • Content Count

    13
  • Joined

  • Last visited

Posts posted by daniel.uramg


  1. Resolvido.

    Ao acessar a aplicação verifica se existe o user_id armazenado, caso não exista abre a janela de autenticação (login.php), no login.php após se autenticar com a API retorna

    echo "<script>
       window.opener.auth('$id', '$nickname', '$access_token', '$expires_in');
    </script>
    <body onload='javascript: window.close()'></body>";

     

    Aplicativo armazena os dados recebidos em cookie 

       function auth(user_id, nickname, access_token, expires_in){
            console.log('Usuário autenticado e dados armazenados.');
            gerarCookie("user_id", user_id, 365);
            gerarCookie("nickname", nickname, 365);
            gerarCookie("access_token", access_token, 1);
            gerarCookie("expires_in", expires_in, 1);
            location.reload();
        }

    Agora já tendo armazenado o ID do usuário e o expires_in consigo comparar o tempo de vencimento do token para renová-lo caso necessário.

     

    	var debug = 1;
    	var user_id = lerCookie("user_id");
    	var nickname = lerCookie("nickname");
    	var expires_in = lerCookie('expires_in');
    	var access_token = lerCookie('access_token');
    	var agora = Math.round(new Date().getTime()/1000);
    
    	if(! user_id){
    		if (debug == 1) console.log('Não existe id, abre janela para autenticação');
    		var janela = window.open("login.php","janela1","width=400, height=400, directories=no, location=no, menubar=no, scrollbars=no, status=no, toolbar=no, resizable=no");
    		if(janela==null){
    		  alert('Por favor desative o Bloqueador de Pop-ups para conseguir se autenticar.');
    		}
    	}else{
    		$('h1').before('<p id="loged" align="right">'+nickname+' <a href="#" id="logout">Sair</a></p>');
    		//requisita o access_token
    		if (expires_in < agora){
    			if (debug == 1) console.log('Token venceu, renovar..');
    			if (debug == 1) console.log('Agora: ' + agora);
    			if (debug == 1) console.log('expires_in: ' + expires_in);
    				$.getJSON("renew_token.php?user_id=" + user_id, function(retorno){
    					//se recebeu o token, grava ele
    					if (retorno.access_token){
    						gerarCookie("access_token", retorno.access_token, 1);
    						gerarCookie("expires_in", retorno.expires_in, 1);
    						location.reload();
    						//se não existir o token provavelmente o usuario nunca se autenticou, então abre a janela para autorizar o app
    					}else{
    						if (debug == 1) console.log('Token não existe, abre janela para autenticar');
    						window.open("login.php","janela1","width=400, height=400, directories=no, location=no, menubar=no, scrollbars=no, status=no, toolbar=no, resizable=no");
    					}
    				});
    			}
    		//requisita o access_token
    	}

     


  2. Olá,

    estou desenvolvendo uma aplicação simples que será 99% em JavaScript, como a SDK JS do ML está descontinuada a uns anos, somente a parte de autenticação fiz em PHP.

    Pretendo fazer a aplicação toda em JS para não consumir recursos do servidor, no primeiro acesso o app requisita o Aceess Token do servidor e armazena ele localmente, daí então todas as requisições que serão feitas à API do ML será feita via Ajax.

    O problema está sendo em como o Javascript vai requisitar o Access Token ao meu PHP do usuário em específico que estará acessando, no meu protótipo eu armazenei numa variável minha ID do ML, então passo esta ID para o servidor para requisitar o token:

        //requisita o access_token
        var user_id = '0000'; //Minha ID do ML
        var expires_in = GM_getValue('expires_in');
        var agora = Math.round(new Date().getTime()/1000);
        if (expires_in < agora || !expires_in){
            $.getJSON("https://meusite.com/renew_token.php?user_id=" + user_id, function(retorno){
                //se recebeu o token, grava ele
                if (retorno.access_token){
                    GM_setValue('access_token', retorno.access_token);
                    GM_setValue('expires_in', retorno.expires_in);
                }
                //se não existir o token provavelmente o usuario nunca se autenticou, então abre a janela para autorizar o app
                else{
                    window.open("https://meusite.com/login.php","janela1","width=600, height=600, directories=no, location=no, menubar=no, scrollbars=no, status=no, toolbar=no, resizable=no");
                }
            });
        }
        //requisita o access_token

    Assim está funcionando normalmente, mas não consegui pensar numa maneira de como o JS pode "pedir" um novo token ao PHP sem eu identificar de que usuário se trata. Se eu acessar diretamente o https://..../login.php ele me retorna o Token correto pois a SDK reconhece o usuário autenticado no navegador, porém também não consegui fazer este retorno "voltar" para o JavaScript.


  3. 1 hour ago, daniel.uramg said:

    Estou criando um aplicativo para subir os anúncios de minha loja virtual para o ML, porém empaquei que as imagens não estão subindo de maneira alguma.

    A URL da imagem está correta, fiz um teste de CORS (https://www.test-cors.org/) com a URL das imagens e está ok, com a imagem do Wikipedia que tem na documentação da API vai normalmente (http://developers.mercadolibre.com/pt-br/descricao-de-produtos/).

    Não recebo nenhum retorno da API sobre a imagem se subiu corretamente ou houve algum problema, alguém pode me dar uma orientação se tem alguma forma de eu debugar o retorno do ML para tentar encontrar a causa do problema?

    Meu site é hospedado com Apache, já ativei "Header set Access-Control-Allow-Origin "*"" no htaccess, uso o CloudFlare com SSL.

    Consegui resolver desativando o "Always use HTTPS" do CloudFlare.


  4. Estou criando um aplicativo para subir os anúncios de minha loja virtual para o ML, porém empaquei que as imagens não estão subindo de maneira alguma.

    A URL da imagem está correta, fiz um teste de CORS (https://www.test-cors.org/) com a URL das imagens e está ok, com a imagem do Wikipedia que tem na documentação da API vai normalmente (http://developers.mercadolibre.com/pt-br/descricao-de-produtos/).

    Não recebo nenhum retorno da API sobre a imagem se subiu corretamente ou houve algum problema, alguém pode me dar uma orientação se tem alguma forma de eu debugar o retorno do ML para tentar encontrar a causa do problema?

    Meu site é hospedado com Apache, já ativei "Header set Access-Control-Allow-Origin "*"" no htaccess, uso o CloudFlare com SSL.


  5. 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);
    ?>

     


  6. 15 minutes ago, rodrigojob said:

    Em um outro POST você colocou que é complicado que sempre há direcionamento para "Leia a documentação".
    Eu sou um dos que defendem não passar código. Compreender, Aprender, Desenvolver

    1º Eu não pedi à você, você não é autor do tópico e sequer havia comentado neste tópico antes.

    2º Conforme eu respondi no outro tópico, eu li a documentação e estou tendo erro 404 que até onde eu sei é erro de Página Inexistente,.

    3º Se somente a documentação bastasse para 100% dos casos não precisaria existir um Fórum para troca de informações;

    4º Se não quer ajudar vai à *****!


  7. 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>';
    }

     


  8. Olá pessoal,

     

    estou tentando criar um aplicativo em Javascript para bloquear e desbloquear usuários na plataforma

    mas não consegui sequer dar o primeiro passo, seguindo as isntruções da API Javascript criei um HTML:

    <!DOCTYPE html>
    <html>
    <head>
        <script src="https://a248.e.akamai.net/secure.mlstatic.com/org-img/sdk/mercadolibre-1.0.4.js"></script>
    </head>
    <body>
    <script>
    
    MELI.init({client_id: id_do_aplicativo});
    MELI.login(function() {
    	MELI.get(
     		"/users/me",{},
    	    function(data) {
    			alert("Hello "+ data[2].first_name)
    		}
    	);
    });
    </script>
    </body>
    </html>
    

    sempre que carrego este html, abre uma popup e me autentica em minha aplicação, depois abre o alert com "Hello undefined"

     

    Um problema que encontrei logo de cara é que na documentação (http://developers.mercadolibre.com/javascript-sdk/) diz:

    Just include the following source script in your application

    <script src="http://static.mlstatic.com/org-img/sdk/mercadolibre-1.0.4.js"></script>

    For https use:

    <script src="http://a248.e.akamai.net/secure.mlstatic.com/org-img/sdk/mercadolibre-1.0.4.js"></script>

     

     

    Mas acontece que nenhuma das duas URLs são HTTPS, então se hospedar este HTML no servidor e tentar acessar pelo HTTPS o navegador bloqueia, se eu acessar somente via HTTP não retorna nenhum erro no console, mas não consigo receber meu "hello" corretamente para poder tentar seguir com o desenvolvimento! 

    Alguém pode me dar umas instruções?

     

    grato