daniel.uramg

Members
  • Content Count

    13
  • Joined

  • Last visited

About daniel.uramg

  • Rank
    Newbie

Recent Profile Visitors

469 profile views
  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. 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. Ok entendo, obrigado pelo retorno, estou estudando a documentação mas ainda enfrento alguns problemas que vou resolver.
  7. 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 à *****!
  8. Complicado este fórum, me parece que toda dica na maioria dos posts é "Leia a documentação"...
  9. Bom dia, poderia postar como exemplo seu arquivo PHP? Estou tentando criar uma função para reautenticar com o refresh_token mas estou levando uma surra.
  10. 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..
  11. Opa já passou muuito tempo e até havia me esquecido desse post, até hoje não consegui executar o projeto.. A questão é que minha ideia é fazer um Complemento para o Google Chrome, então não vai ter servidor senão ficava mais fácil fazer em PHP.
  12. 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>'; }
  13. 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: 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