• 0
Ricardo Infante

Api para enviar mensajes a compradores de mercadolibre

Question

 
Hola buenas,
Somos una empresa que publicamos en mercadolibre.
 
Necesitamos que nos guíen como usar la api para enviar mensajes a clientes de forma automática cada vez que ofertan.
 
Necesitamos enviar información de contacto, instrucciones y cuenta bancarias.
 
Gracias de antemano.

Share this post


Link to post
Share on other sites

Recommended Posts

  • 1
1 hour ago, Ricardo Infante said:

Si se la solución fue filtrar el tipo de notificación. Gracias

una estructura básica para las notificaciones:

-> endpoint de notificaciones
-> queue
-> worker para salvar en DB y comparar si hay modificaciones en la order
-> si hay modificaciones: acede a otros recursos

Share this post


Link to post
Share on other sites
  • 1

Hola.

Concuerdo con mldev, Mercadolibre nos da las herramientas y la informacion, nosotros somos los encargados de filtrarla y usarla a nuestra conveniencia.

En el apartado de las notificiaciones, siempre se tiene que hacer una comparacion con la base de datos, si o si, para verificar si ya se han ejecutado rutinas basadas en las notificaciones, cualquier accion que se genere en una venta, va a generar una notificacion, podrian estarte llegando decenas de notificaciones en el dia de una sola venta.

Aqui la solucion es filtrar, guardar toda la informacion que te interese en tu base de datos, comparar las notificaciones nuevas con tu base de datos y ejecutar tu rutina, en este caso enviar mensajes automaticos.

Por ejemplo al comparar, puedes verificar si la venta fue entregada, y de esta manera cambiar el estado del shipping, y si el estado del shipping es "delivered" enviar un mensaje de agradecimiento por completar la compra. Te recomiendo que si tienes varios mensajes automaticos, tengas varias columnas que controlen si ya han sido enviados.

-------------------------------------------------------------
|orden      |     msg1      |      msg2      |     msgN     |
-------------------------------------------------------------
|MLM9434535 |      1        |       0        |       0      |
|MLM6534634 |      1        |       1        |       1      |
-------------------------------------------------------------

Los controlas por medio de "Booleans" para que 1 = true y 0 = false.

Ya lo demas si te lo dejo a ti, la base ya te la planteamos amigo.

 

Ten un excelente dia!

Share this post


Link to post
Share on other sites
  • 0

Hola.

Utiliza las notificaciones, cada vez que te realizan una compra, ML te envia una notificacion con la informacion de la orden, ya lo demas es solo extraer los datos necesarios para enviar un mensaje al cliente de esa orden.

Y si es cierto, todo esta en la documentacion, especificamente en notificaciones y mensajes post-venta.

 

Ten un excelente dia!

Share this post


Link to post
Share on other sites
  • 0

Hola Fernando, ya leí la documentación he hice un par de pruebas. Sin embargo, cómo puedo armar una app en PHP que reciba esa notificación y automáticamente envíe el mensaje? ya se usar la parte de autorización y el manejo de formato json y pase de post vía curl. Primera vez que trabajo con esto de apis. 

 

Edited by Ricardo Infante

Share this post


Link to post
Share on other sites
  • 0

Hola Ricardo.

Te voy a guiar porque yo tambien batalle.

Primeramente, antes que nada tienes que guardar el access token y refresh token en tu base de datos, para que? para que no tengas que estar actualizando el token y seguirle dando vida manualmente.

Primeros pasos

1 - Adquiere el token y refresh token por primera vez y los guardas en tu bd manualmente. Si ya entiendes lo de la autorizacion, con un echo en php obtienes estos dos datos.

2 - Ya que tienes estos datos, crea un daemon en tu servidor para que le haga refresh al token cada 5 horas

3 - Para crear el daemon, crea un archivo en php y "jala" tu token y refresh token, haces el llamado del SDK de ML, y ejecutas:

require 'basics/meli.php';//El archivo del SDK de ML en php


$ml_session = new Meli($appId, $secretKey, $token, $r_token);// Jala todos estas variables de tu BD

$refresh_tokn = $ml_session->refreshAccessToken();//Ejecutalo para obtener un nuevo token

$new_token = $refresh_tokn['body']->access_token; //este es el nuevo token
$new_refresh_token = $refresh_tokn['body']->refresh_token; // este es el nuevo refresh token

Ya solo queda hacerle un UPDATE a tu bd donde guardas los tokens, esto es facil, de esta manera ya automatizas el refresh de los tokens.

4 - Crea un cronjob que ejecute el script en php cada 5 horas, como tengo un vps con linux, quedaria algo asi:

0 */5 * * * php -q /root/archivo.php

5 - Ahora en cada script para tu APP que requieras los tokens, solo haces el llamado a tu BD y jalas esos datos.

Ya terminamos la parte para automatizar el refresh de los tokens

Atrapa las notificaciones

1 - En la documentacion dice que en tu APP pongas la url donde seran dirigidas las notificaciones, entonces ya teniendo esto en cuenta, crea un script para "atraparlas" por ejemplo, cuando te compren algo, te va a llegar una notificacion como esta:

{
   "resource": "/orders/1499111111",
   "user_id": 123456789,
   "topic": "orders_v2",
   "application_id": 2069392825111111,
   "attempts": 1,
   "sent": "2017-10-09T13:58:23.347Z",
   "received": "2017-10-09T13:58:23.329Z"
}

2 - Lo que ocupas de esa informacion es el "resource", haces un llamado al API de ML con el resource:

$data = json_decode(file_get_contents('php://input'), true);//Con esto atrapas la informacion que te envia ML
$resource = $data['resource']; //Aqui creas tu variable que contiene el resource

$ml_session = new Meli($appId, $secretKey, $token); //Crea la sesion de ML
$params = array('access_token' => $token);
$order_data = $ml_session->get($resource, $params);//Haces un GET a la API para obtener los datos de la orden

3 - Tu $order_data ahora tendra como datos el array de toda tu orden, en este array lo que nos importa es: 

$order_data_buyerid = $order_data['body']->buyer->id;
$order_data_id = $order_data['body']->id;

4 - Ya que tenemos los datos basicos, ahora creamos el mensaje:

$message_body = array('from' => array('user_id' => xxxxxxxxxxx),//Aqui va tu user ID, el de tu cuenta.
                                  'to' => [array('user_id' => $order_data_buyerid ,// A quien le enviamos el mensaje
                                                'resource'=> 'orders',
                                                'resource_id'=> $order_data_id,//El id de la orden
                                                'site_id' => "MLM")],//Que ML usamos, en mi caso es Mexico, por eso la M
                                  'text' => array('plain' => 'Hola muchas gracias por tu compra, Ten un excelente dia'),
                                );// Todo esto es el mensaje

5 - Ya quedo listo todo lo complicado, ahora solo queda enviar el mensaje. Te aclaro que puedes enviar mensajes en formato HTML, solo cambia en el array de 'text' el 'plain' por 'html' e insertas el codigo HTML como string y listo.

6 - Ahora solo queda realizar un post al API de messages, donde enviaras todo el cuerpo del mensaje que creamos anteriormente:

$message_send = $ml_session->post('/messages',$message_body, $params);//Ejecuta el envio del mensaje

 

Es realmente facil, solo que la documentacion no es tan extensa y no te explica todo esto, lo entiendo, porque la documentacion solo es una guia, ya lo que queramos hacer depende de nosotros. 

Yo lo hago asi y cada vez que recibo una orden nueva, ejecuto todo lo anterior y se envia el mensaje automaticamente, y claro tambien guardo toda la informacion de la orden nueva en mi base de datos, bueno no toda la informacion, solo la que me sirve para crear mi estadistica personal. 

Tambien, por ejemplo, yo entrego la paqueteria a la 1 pm, entonces si me compran algo despues de esa hora, envio un mensaje diferente, donde les digo que el paquete sera enviado al dia siguiente, o si me compran en sabado o domingo, les envio un mensaje donde les indico que el paquete sera enviado hasta el dia lunes, vaya, aqui ya depende de la imaginacion de cada quien.

Capture.PNG.f625ab1fbea5bc2255d2eae149e10f51.PNG

 

La verdad yo he comprado cosas en ML y nadie te manda un mensaje de agradecimiento, ni manual ni automatico, entonces tenemos que hacer la diferencia para que los clientes se sientan seguros, confiados y satisfechos.

Basicamente esos son los pasos a seguir, yo batalle bastante para llegar a esto, y la verdad no quiero que los demas batallen tanto como yo lo hice.

Espero te haya ayudado, si quieres puedes invitarme un cafe por paypal jajajaja.

Te deseo un excelente dia y aqui estamos para ayudar en lo que sea, ademas para darle vida a este foro, que a veces parece muerto y con puras dudas.

Edited by Fernando Aguirre

Share this post


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

Hola Ricardo.

Te voy a guiar porque yo tambien batalle.

Primeramente, antes que nada tienes que guardar el access token y refresh token en tu base de datos, para que? para que no tengas que estar actualizando el token y seguirle dando vida manualmente.

Primeros pasos

1 - Adquiere el token y refresh token por primera vez y los guardas en tu bd manualmente. Si ya entiendes lo de la autorizacion, con un echo en php obtienes estos dos datos.

2 - Ya que tienes estos datos, crea un daemon en tu servidor para que le haga refresh al token cada 5 horas

3 - Para crear el daemon, crea un archivo en php y "jala" tu token y refresh token, haces el llamado del SDK de ML, y ejecutas:


require 'basics/meli.php';//El archivo del SDK de ML en php


$ml_session = new Meli($appId, $secretKey, $token, $r_token);// Jala todos estas variables de tu BD

$refresh_tokn = $ml_session->refreshAccessToken();//Ejecutalo para obtener un nuevo token

$new_token = $refresh_tokn['body']->access_token; //este es el nuevo token
$new_refresh_token = $refresh_tokn['body']->refresh_token; // este es el nuevo refresh token

Ya solo queda hacerle un UPDATE a tu bd donde guardas los tokens, esto es facil, de esta manera ya automatizas el refresh de los tokens.

4 - Crea un cronjob que ejecute el script en php cada 5 horas, como tengo un vps con linux, quedaria algo asi:


0 */5 * * * php -q /root/archivo.php

5 - Ahora en cada script para tu APP que requieras los tokens, solo haces el llamado a tu BD y jalas esos datos.

Ya terminamos la parte para automatizar el refresh de los tokens

Atrapa las notificaciones

1 - En la documentacion dice que en tu APP pongas la url donde seran dirigidas las notificaciones, entonces ya teniendo esto en cuenta, crea un script para "atraparlas" por ejemplo, cuando te compren algo, te va a llegar una notificacion como esta:


{
   "resource": "/orders/1499111111",
   "user_id": 123456789,
   "topic": "orders_v2",
   "application_id": 2069392825111111,
   "attempts": 1,
   "sent": "2017-10-09T13:58:23.347Z",
   "received": "2017-10-09T13:58:23.329Z"
}

2 - Lo que ocupas de esa informacion es el "resource", haces un llamado al API de ML con el resource:


$data = json_decode(file_get_contents('php://input'), true);//Con esto atrapas la informacion que te envia ML
$resource = $data['resource']; //Aqui creas tu variable que contiene el resource

$ml_session = new Meli($appId, $secretKey, $token); //Crea la sesion de ML
$params = array('access_token' => $token);
$order_data = $ml_session->get($resource, $params);//Haces un GET a la API para obtener los datos de la orden

3 - Tu $order_data ahora tendra como datos el array de toda tu orden, en este array lo que nos importa es: 


$order_data_buyerid = $order_data['body']->buyer->id;
$order_data_id = $order_data['body']->id;

4 - Ya que tenemos los datos basicos, ahora creamos el mensaje:


$message_body = array('from' => array('user_id' => xxxxxxxxxxx),//Aqui va tu user ID, el de tu cuenta.
                                  'to' => [array('user_id' => $order_data_buyerid ,// A quien le enviamos el mensaje
                                                'resource'=> 'orders',
                                                'resource_id'=> $order_data_id,//El id de la orden
                                                'site_id' => "MLM")],//Que ML usamos, en mi caso es Mexico, por eso la M
                                  'text' => array('plain' => 'Hola muchas gracias por tu compra, Ten un excelente dia'),
                                );// Todo esto es el mensaje

5 - Ya quedo listo todo lo complicado, ahora solo queda enviar el mensaje. Te aclaro que puedes enviar mensajes en formato HTML, solo cambia en el array de 'text' el 'plain' por 'html' e insertas el codigo HTML como string y listo.

6 - Ahora solo queda realizar un post al API de messages, donde enviaras todo el cuerpo del mensaje que creamos anteriormente:


$message_send = $ml_session->post('/messages',$message_body, $params);//Ejecuta el envio del mensaje

 

Es realmente facil, solo que la documentacion no es tan extensa y no te explica todo esto, lo entiendo, porque la documentacion solo es una guia, ya lo que queramos hacer depende de nosotros. 

Yo lo hago asi y cada vez que recibo una orden nueva, ejecuto todo lo anterior y se envia el mensaje automaticamente, y claro tambien guardo toda la informacion de la orden nueva en mi base de datos, bueno no toda la informacion, solo la que me sirve para crear mi estadistica personal. 

Tambien, por ejemplo, yo entrego la paqueteria a la 1 pm, entonces si me compran algo despues de esa hora, envio un mensaje diferente, donde les digo que el paquete sera enviado al dia siguiente, o si me compran en sabado o domingo, les envio un mensaje donde les indico que el paquete sera enviado hasta el dia lunes, vaya, aqui ya depende de la imaginacion de cada quien.

Capture.PNG.f625ab1fbea5bc2255d2eae149e10f51.PNG

 

La verdad yo he comprado cosas en ML y nadie te manda un mensaje de agradecimiento, ni manual ni automatico, entonces tenemos que hacer la diferencia para que los clientes se sientan seguros, confiados y satisfechos.

Basicamente esos son los pasos a seguir, yo batalle bastante para llegar a esto, y la verdad no quiero que los demas batallen tanto como yo lo hice.

Espero te haya ayudado, si quieres puedes invitarme un cafe por paypal jajajaja.

Te deseo un excelente dia y aqui estamos para ayudar en lo que sea, ademas para darle vida a este foro, que a veces parece muerto y con puras dudas.

Puedes ayudarme un poco mas porfavor o decirme cuanto me cobrarías por hacerme el trabajo ?

Share this post


Link to post
Share on other sites
  • 0
Esta parte me da error, los arrays en algún punto da un error
$message_body = array('from' => array('user_id' => xxxxxxxxxxx),//Aqui va tu user ID, el de tu cuenta.
                                  'to' => [array('user_id' => $order_data_buyerid ,// A quien le enviamos el mensaje
                                                'resource'=> 'orders',
                                                'resource_id'=> $order_data_id,//El id de la orden
                                                'site_id' => "MLM")],//Que ML usamos, en mi caso es Mexico, por eso la M
                                  'text' => array('plain' => 'Hola muchas gracias por tu compra, Ten un excelente dia'),
                                );

Share this post


Link to post
Share on other sites
  • 0
24 minutes ago, Ricardo Infante said:

Esta parte me da error, los arrays en algún punto da un error

sin el mensaje de error es difícil ayudar

Share this post


Link to post
Share on other sites
  • 0

SE QUEDA EN BUCLE Y ENVÍA MUCHOS MENSAJES. PORQUE?
# CONSULTAMOS LAS NOTIFICACIONES

$data = json_decode(file_get_contents('php://input'), true);//Con esto atrapas la informacion que te envia ML
$resource = $data['resource']; //Aqui creas tu variable que contiene el resource

$ml_session = new Meli($appId, $secretKey, $token); //Crea la sesion de ML
$params = array('access_token' => $token);

$order_data = $ml_session->get($resource, $params);//Haces un GET a la API para obtener los datos de la orden

$order_data_buyerid = $order_data['body']->buyer->id;
$order_data_id = $order_data['body']->id;
$site_id = $order_data['body']->site_id;

echo $site_id;
echo $order_data_id ;

                        
$message_body = array( "from" => array(
        "user_id" => "XXXXXXX"
    ),
    "to" => [array("user_id" => "84476670",
            "resource" => "orders",
            "resource_id" => "1656000013",
            "site_id" => "MLV")],
    "subject" => "Prueba",
    "text" => array("plain" => "prueba"),
);                                 
$message_send = $ml_session->post('/messages',$message_body, $params);

Share this post


Link to post
Share on other sites
  • 0

su código es muy simple, usted tiene que crear rutinas para consultar si la notificación ya fue recibida antes de enviar el mensaje (el Mercado Libre envía más de una notificación referente a una venta), además de otras cuestiones de seguridad y escalabilidad

Share this post


Link to post
Share on other sites
  • 0

Ok en la app tengo direccionado la lectura de notificaciones a este script. y da error 404

<?php
require 'Meli/meli.php';
require 'Meli/configApp.php';

# CONECTAR A BASE DE DATOS
mysql_connect('localhost', 'xxxxxx', 'xxxxxx');
mysql_select_db('xxxxxx');
    
    $sql= "SELECT * FROM meli WHERE id = '1' ";
    $result = mysql_query($sql);
    $row = mysql_fetch_assoc($result);
    
    $appId = $row['appId'];
    $secretKey = $row['secretKey'];
    $token = $row['token'];
    $r_token = $row['r_token'];
    
 # CONSULTAMOS LAS NOTIFICACIONES

$data = json_decode(file_get_contents('php://input'), true);//Con esto atrapas la informacion que te envia ML
$resource = $data['resource']; //Aqui creas tu variable que contiene el resource

$meli = new Meli($appId, $secretKey, $token); //Crea la sesion de ML
$params = array('access_token' => $token);
$order_data = $meli->get($resource, $params);//Haces un GET a la API para obtener los datos de la orden


$order_data_buyerid = $order_data['body']->buyer->id;
$order_data_id = $order_data['body']->id;

//creacion de mensaje

        
    $body = array( 'from' => array(
        'user_id' => 'XXXXXXX'//este dato lo oculto por seguridad
    ),
    'to' => [array('user_id' => $order_data_buyerid ,
            'resource' => 'orders',
            'resource_id' => $order_data_id ,
            'site_id' => 'MLV')],
    'subject' => 'Prueba',
    'text' => array('plain' => 'Hola muchas gracias por tu compra, Ten un excelente dia'),
);             

    $response = $meli->post('/messages', $body, $params);


echo '<pre>';
print_r($order_data);
print_r($response);
echo '</pre>';

Share this post


Link to post
Share on other sites
  • 0
42 minutes ago, Ricardo Infante said:

Disculpen si funciona ya: 

<?php
require 'Meli/meli.php';
require 'Meli/configApp.php';

# CONECTAR A BASE DE DATOS
mysql_connect('localhost', 'xxxxxx', 'xxxxxx');
mysql_select_db('xxxxxx');
    
    $sql= "SELECT * FROM meli WHERE id = '1' ";
    $result = mysql_query($sql);
    $row = mysql_fetch_assoc($result);
    
    $appId = $row['appId'];
    $secretKey = $row['secretKey'];
    $token = $row['token'];
    $r_token = $row['r_token'];
    
 # CONSULTAMOS LAS NOTIFICACIONES

$data = json_decode(file_get_contents('php://input'), true);//Con esto atrapas la informacion que te envia ML
$resource = $data['resource']; //Aqui creas tu variable que contiene el resource

$meli = new Meli($appId, $secretKey, $token); //Crea la sesion de ML
$params = array('access_token' => $token);
$order_data = $meli->get($resource, $params);//Haces un GET a la API para obtener los datos de la orden


$order_data_buyerid = $order_data['body']->buyer->id;
$order_data_id = $order_data['body']->id;

//creacion de mensaje

        
    $body = array( 'from' => array(
        'user_id' => 'XXXXXXX'//Aquí colocan su user Id
    ),
    'to' => [array('user_id' => $order_data_buyerid ,
            'resource' => 'orders',
            'resource_id' => $order_data_id ,
            'site_id' => 'MLV')],
    'subject' => 'Prueba',
    'text' => array('plain' => 'Hola muchas gracias por tu compra, Ten un excelente dia'),
);             

    $response = $meli->post('/messages', $body, $params);


echo '<pre>';
print_r($order_data);
print_r($response);
echo '</pre>';

 

Share this post


Link to post
Share on other sites
  • 0
On 24/03/2018 at 11:28 AM, Ricardo Infante said:

Hola alguien sabe por que se mandan varios mensajes cuando el cliente compra por mercadopago?

notificaciones?

porque una venta es composta de:

-> confirmacion de la venta
-> pago
-> confimacion de pago

etc

Share this post


Link to post
Share on other sites
  • 0
On 26/3/2018 at 3:05 PM, mldev said:

una estructura básica para las notificaciones:

-> endpoint de notificaciones
-> queue
-> worker para salvar en DB y comparar si hay modificaciones en la order
-> si hay modificaciones: acede a otros recursos

Hola, según la documentación create_orders también hace notificaciones para muchos eventos, no solo cuando se crea la orden.. Cómo se filtran si el json no lo menciona. 

Share this post


Link to post
Share on other sites
  • 0
4 hours ago, damian106 said:

Hola serias tan amable de explicarme como obtener el nombre del comprador para agregarlo al mensaje gracias

este dato está en la order

Share this post


Link to post
Share on other sites
  • 0

Hola, no lo obtienes directo de la notificación, te vas al recurso que viene siendo el número de orden. Ejmp:

$data = json_decode(file_get_contents('php://input'), true);//Con esto atrapas la informacion que te envia ML
$resource = $data['resource']; //Aqui creas tu variable que contiene el resource

$meli = new Meli($appId, $secretKey, $token); //Crea la sesion de ML
$params = array('access_token' => $token);
$order_data = $meli->get($resource, $params);//Haces un GET a la API para obtener los datos de la orden


$order_data_buyerid = $order_data['body']->buyer->id;
$order_data_id = $order_data['body']->id;


//SACAMOS MAS DATOS DE LA ORDEN

$urlorden = '/orders/'.$order_data_id.'';
$orden = $meli->get($urlorden, $params);

 

En la variable $orden están todos los atributos de la orden. Si quieres sacar el nombre del cliente sería algo así: 

//nombre de comprador
$first_name = $orden['body']->buyer->first_name;
$last_name = $orden['body']->buyer->last_name;
$nombre_comprador = $first_name .' '. $last_name;
 

 

 

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