• 0
Juan Manuel Rodríguez

Obtener Access Token sin pasar por un web browser

Question

Hola,

Quisiera hacer un demonio, es decir un servicio que corra background y publique artículos en MercadoLibre, para ello necesitaría poder obtener el access token sin que sea necesario en nignun momento pasar por un navegador web. Estoy trabajando en PHP, y quiero saber si se puede hacer algo así usando el SDK de Mercado Libre y las librerias CURL. Desde ya muchas gracias!

Edited by Juan Manuel Rodríguez

Share this post


Link to post
Share on other sites

7 answers to this question

Recommended Posts

  • 4

Hola!

Yo tenia la misma duda, y fue algo tan facil, que hasta me dio risa al final

1 - Obten el ACCESS TOKEN y REFRESH TOKEN por primera vez con el ejemplo que viene en "example_login.php" del SDK de PHP.

2 - Guarda estos dos datos en tu Base de datos

3 - Ahora solo pones un Daemon que este cada 5 horas actualizando el token, usando el refresh token. Cuando hagas lo anterior, la API te va a devolver un ACCESS TOKEN y REFRESH TOKEN totalmente nuevos, ya solo sustituyes estos por los viejos que tenias y ya.

function new_token ($appId, $secretKey, $token, $r_token,$con_token){
  $ml_session = new Meli($appId, $secretKey, $token, $r_token);
  $refresh_tokn = $ml_session->refreshAccessToken();
  $new_token = $refresh_tokn['body']->access_token;
  $new_refresh_token = $refresh_tokn['body']->refresh_token;
  if (empty($new_token)){
    return true;
  } else {
    $query_guarda_token = "UPDATE datos SET tokn = '".$new_token."', refresh = '".$new_refresh_token."', ultima = NOW() WHERE usuario = 'xxxxxxxxxx'";
    mysqli_query($con_token, $query_guarda_token);
    return false;
  }
}

$res = new_token ($appId, $secretKey, $token, $r_token, $con_token);

while ($res){
  $res = new_token ($appId, $secretKey, $token, $r_token, $con_token);
  sleep(10);
};

4 - Cada vez que ejecutes un script, haces una llamada a tu BD y "jalas" el token y facilmente realizas cualquier consulta a la API automaticamente.

Esto yo lo tengo funcionando asi, tengo un daemon que me actualiza el token, luego otro que me guarda las visitas diarias de mis publicaciones. Aparte, este metodo te permite realizar cosas automaticas al recibir alguna notificacion, por ejemplo guardar toda la informacion que realmente te importe de una order recien creada, mandar un mensaje de agradecimiento, lo que se te ocurra.

Creo que con esto te he brindado un camino, ya la programacion es pan comido teniendo la logica del funcionamiento.

ACTUALIZACION 5 MARZO 2018 

Tenia problemas porque a veces me daba error y no se rneovaba el token, por lo que mejor hice una funcion para que detecte si se obtuvo alguna respuesta por parte de ML, si no hay respuesta, se va a volver a pedir el token al esperar 10 segundos, y asi hasta que se obtenga un token nuevo.

 

Te deseo un excelente dia!

Edited by Fernando Aguirre

Share this post


Link to post
Share on other sites
  • 1
On 4/8/2018 at 2:10 AM, Joao De Sousa said:

Muchas gracias Fernando, trataré de implementarlo en la integración que estoy realizando. Supongo que habría que crear/configurar un cron para que haga esto cada 5 horas?

Otra cosa, me da curiosidad lo de guardar las visitas diarias. Ya que el API no te da estos datos al hacer una petición de un ítem. Si puedes compartir al menos la idea de cómo lo realizaste, sería de gran ayuda.

Saludos,

http://developers.mercadolibre.com/visits-resource/

Share this post


Link to post
Share on other sites
  • 0
On ‎3‎/‎2‎/‎2018 at 2:03 AM, Fernando Aguirre said:

Hola!

Yo tenia la misma duda, y fue algo tan facil, que hast......

Muchas gracias Fernando, trataré de implementarlo en la integración que estoy realizando. Supongo que habría que crear/configurar un cron para que haga esto cada 5 horas?

Otra cosa, me da curiosidad lo de guardar las visitas diarias. Ya que el API no te da estos datos al hacer una petición de un ítem. Si puedes compartir al menos la idea de cómo lo realizaste, sería de gran ayuda.

Saludos,

Share this post


Link to post
Share on other sites
  • 0
On 2/3/2018 at 3:03 AM, Fernando Aguirre said:

Hola!

Yo tenia la misma duda, y fue algo tan facil, que hasta me dio risa al final

1 - Obten el ACCESS TOKEN y REFRESH TOKEN por primera vez con el ejemplo que viene en "example_login.php" del SDK de PHP. 

2 - Guarda estos dos datos en tu Base de datos

3 - Ahora solo pones un Daemon que este cada 5 horas actualizando el token, usando el refresh token. Cuando hagas lo anterior, la API te va a devolver un ACCESS TOKEN y REFRESH TOKEN totalmente nuevos, ya solo sustituyes estos por los viejos que tenias y ya.


function new_token ($appId, $secretKey, $token, $r_token,$con_token){
  $ml_session = new Meli($appId, $secretKey, $token, $r_token);
  $refresh_tokn = $ml_session->refreshAccessToken();
  $new_token = $refresh_tokn['body']->access_token;
  $new_refresh_token = $refresh_tokn['body']->refresh_token;
  if (empty($new_token)){
    return true;
  } else {
    $query_guarda_token = "UPDATE datos SET tokn = '".$new_token."', refresh = '".$new_refresh_token."', ultima = NOW() WHERE usuario = 'xxxxxxxxxx'";
    mysqli_query($con_token, $query_guarda_token);
    return false;
  }
}

$res = new_token ($appId, $secretKey, $token, $r_token, $con_token);

while ($res){
  $res = new_token ($appId, $secretKey, $token, $r_token, $con_token);
  sleep(10);
};

4 - Cada vez que ejecutes un script, haces una llamada a tu BD y "jalas" el token y facilmente realizas cualquier consulta a la API automaticamente.

Esto yo lo tengo funcionando asi, tengo un daemon que me actualiza el token, luego otro que me guarda las visitas diarias de mis publicaciones. Aparte, este metodo te permite realizar cosas automaticas al recibir alguna notificacion, por ejemplo guardar toda la informacion que realmente te importe de una order recien creada, mandar un mensaje de agradecimiento, lo que se te ocurra.

Creo que con esto te he brindado un camino, ya la programacion es pan comido teniendo la logica del funcionamiento.

ACTUALIZACION 5 MARZO 2018 

Tenia problemas porque a veces me daba error y no se rneovaba el token, por lo que mejor hice una funcion para que detecte si se obtuvo alguna respuesta por parte de ML, si no hay respuesta, se va a volver a pedir el token al esperar 10 segundos, y asi hasta que se obtenga un token nuevo.

 

Te deseo un excelente dia!

Genio mil gracias!

Share this post


Link to post
Share on other sites
  • 0
On 2/3/2018 at 3:03 AM, Fernando Aguirre said:

Hola!

Yo tenia la misma duda, y fue algo tan facil, que hasta me dio risa al final

1 - Obten el ACCESS TOKEN y REFRESH TOKEN por primera vez con el ejemplo que viene en "example_login.php" del SDK de PHP.

2 - Guarda estos dos datos en tu Base de datos

3 - Ahora solo pones un Daemon que este cada 5 horas actualizando el token, usando el refresh token. Cuando hagas lo anterior, la API te va a devolver un ACCESS TOKEN y REFRESH TOKEN totalmente nuevos, ya solo sustituyes estos por los viejos que tenias y ya.


function new_token ($appId, $secretKey, $token, $r_token,$con_token){
  $ml_session = new Meli($appId, $secretKey, $token, $r_token);
  $refresh_tokn = $ml_session->refreshAccessToken();
  $new_token = $refresh_tokn['body']->access_token;
  $new_refresh_token = $refresh_tokn['body']->refresh_token;
  if (empty($new_token)){
    return true;
  } else {
    $query_guarda_token = "UPDATE datos SET tokn = '".$new_token."', refresh = '".$new_refresh_token."', ultima = NOW() WHERE usuario = 'xxxxxxxxxx'";
    mysqli_query($con_token, $query_guarda_token);
    return false;
  }
}

$res = new_token ($appId, $secretKey, $token, $r_token, $con_token);

while ($res){
  $res = new_token ($appId, $secretKey, $token, $r_token, $con_token);
  sleep(10);
};

4 - Cada vez que ejecutes un script, haces una llamada a tu BD y "jalas" el token y facilmente realizas cualquier consulta a la API automaticamente.

Esto yo lo tengo funcionando asi, tengo un daemon que me actualiza el token, luego otro que me guarda las visitas diarias de mis publicaciones. Aparte, este metodo te permite realizar cosas automaticas al recibir alguna notificacion, por ejemplo guardar toda la informacion que realmente te importe de una order recien creada, mandar un mensaje de agradecimiento, lo que se te ocurra.

Creo que con esto te he brindado un camino, ya la programacion es pan comido teniendo la logica del funcionamiento.

ACTUALIZACION 5 MARZO 2018 

Tenia problemas porque a veces me daba error y no se rneovaba el token, por lo que mejor hice una funcion para que detecte si se obtuvo alguna respuesta por parte de ML, si no hay respuesta, se va a volver a pedir el token al esperar 10 segundos, y asi hasta que se obtenga un token nuevo.

 

Te deseo un excelente dia!

Hola Fernando (Maestro), tengo un inconveniente:

cuando se ejecuta este linea de codigo   
 $refresh_tokn = $ml_session->refreshAccessToken();

el refresh token me devuelve esto: 

Array ( [body] => stdClass Object ( [message] => The following parameters are required: client_id,client_secret,grant_type,refresh_token,caller.admin. Empty parameter client_id [error] => invalid_request [status] => 400 [cause] => Array ( ) ) [httpCode] => 400 )

El client_id hay que  ponerlo en algun lado??  

Muchas gracias de antemano. Tu solución esta perfecta para recibir los cambios en ml y modificar la BD aunque no este logueado el cliente. Espero hacerlo funcionar...

 

Share this post


Link to post
Share on other sites
  • 0
On 10/26/2018 at 1:45 PM, 53rg10 said:

Hola Fernando (Maestro), tengo un inconveniente:

cuando se ejecuta este linea de codigo   
 $refresh_tokn = $ml_session->refreshAccessToken();

el refresh token me devuelve esto: 

Array ( [body] => stdClass Object ( [message] => The following parameters are required: client_id,client_secret,grant_type,refresh_token,caller.admin. Empty parameter client_id [error] => invalid_request [status] => 400 [cause] => Array ( ) ) [httpCode] => 400 )

El client_id hay que  ponerlo en algun lado??  

Muchas gracias de antemano. Tu solución esta perfecta para recibir los cambios en ml y modificar la BD aunque no este logueado el cliente. Espero hacerlo funcionar...

 

Hola!

Claro, tienes que definir 

$appId, $secretKey, $token, $r_token,$con_token

Cuando corras la funcion solo los sustituyes para que ya quede listo.

 

Saludos!

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