API
Leaf Life te lo pone fácil, con nuestra API podrás actualizar tu catálogo, consultar el stock, los precios, hacer pedidos nuevos y ver los que ya has realizado de una forma muy sencilla apuntando a un solo endpoint. Para evitar enviarte datos que no necesitas, serás tú quien los pedirá con una consulta.
Autenticación
Para poder acceder a la API, necesitas el "client id" y "client secret" que encontraras en tu perfil de usuario, a continuación, añade las cabeceras "Content-Type: application/json", "Accept: application/json" y solicita el token enviando la consulta, el envío de esta petición y todas las demás será por método POST, un ejemplo con curl:
curl \
-X POST https://api.leaflife.com \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d '{ "query": "mutation{login(clientId: \"8c4f09821d631b07fbdab7f7ff2f58cdba928a2a\", clientSecret: \"4d09b8992996fd6c8aae4d4f09d2343bf8beec43\") {token}}" }'
Obtendrás una respuesta en JSON con el token, añádelo a las cabeceras (Authorization: Bearer TOKEN) y tendrás acceso a la API, para renovar el token, utiliza la función "updateToken". Por ejemplo, para recuperar la referencia de producto y el PVP con IVA lo haremos de esta forma:
Utiliza "productsPagination" para navegar por las páginas.
Endpoints
- Producción: https://api.leaflife.com
- Desarrollo: https://api.leaflife.com/test
Solo se aceptarán conexiones por HTTPS. La petición de crear un nuevo pedido en el entorno de desarrollo devolverá una respuesta, pero los datos no se guardarán en la base de datos.
Ejemplos
Como hemos visto anteriormente, para obtener las referencias de los productos con PVP IVA incluido lo haremos de esta forma:
curl \
-X POST https://api.leaflife.com \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE1NDYyOTcyMDAsImV4cCI6MTU0NjMwMDgwMCwiZGF0YSI6eyJjbGllbnRfaWQiOiI4YzRmMDk4MjFkNjMxYjA3ZmJkYWI3ZjdmZjJmNThjZGJhOTI4YTJhIn19.tb-AIbDMp3479gD7kvJHU3ODbSPFMat69mTbsdk3Vio' \
-d '{ "query": "{products{code msrpIncVat} productsPagination{cursorBefore cursorAfter hasPreviousPage hasNextPage}}" }'
Para enviar un pedido, lo haremos de esta forma
curl \
-X POST https://api.leaflife.com \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE1NDYyOTcyMDAsImV4cCI6MTU0NjMwMDgwMCwiZGF0YSI6eyJjbGllbnRfaWQiOiI4YzRmMDk4MjFkNjMxYjA3ZmJkYWI3ZjdmZjJmNThjZGJhOTI4YTJhIn19.tb-AIbDMp3479gD7kvJHU3ODbSPFMat69mTbsdk3Vio' \
-d @- <<EOF
{ "query": "mutation{
createOrder(
order: {
products: [
{
code: \"AACC.009\",
amount: 2
},
{
code: \"AACC.010\",
amount: 3
}
],
payment: \"Transferencia bancaria\",
shipping: \"Enviar el pedido\",
send: {
firstname: \"Jose Luis\",
lastname: \"Garcia\",
address: \"Calle General, 1\",
city: \"Madrid\",
state: \"Madrid\",
country: \"España\",
zipcode: \"28001\",
phone: \"910010101\"
}
}
)
{order message}
}" }
EOF
Un ejemplo en PHP para consultar el stock de productos con y sin variantes
// mi configuración
$url = 'https://api.leaflife.com/test';
$clientId = "8c4f09821d631b07fbdab7f7ff2f58cdba928a2a";
$clientSecret = "4d09b8992996fd6c8aae4d4f09d2343bf8beec43";
// se consulta login
$token = login($url, $clientId, $clientSecret);
// consulta de todos los productos
$arrProducts = array();
$cursor = "page1";
$page = 0;
$arrAllProducts = products($url, $token, $cursor, $arrProducts, $page);
// el array arrAllProducts se recorre para obtener los datos de todos los productos
// para obtener cualquier campo hacer la consulta print_r($arrAllProducts)
// y construir los respectivos bucles para obtener los datos deseados
// bucle por página
foreach($arrAllProducts as $page => $vpage){
// bucle para recorrer los 100 productos de cada página
foreach($arrAllProducts[$page] as $product => $vproduct){
// code
echo "code: " . $arrAllProducts[$page][$product]['code'] . "\n";
// stock de productos sin variantes
if(empty($arrAllProducts[$page][$product]['productVariants'])){
// stockMadrid
echo "stockMadrid: " . $arrAllProducts[$page][$product]['stockMadrid'] . "\n";
// stockBarcelona
echo "stockBarcelona: " . $arrAllProducts[$page][$product]['stockBarcelona'] . "\n";
}
// los datos de productos con variantes
if(!empty($arrAllProducts[$page][$product]['productVariants'])){
foreach($arrAllProducts[$page][$product]['productVariants'] as $cvariant => $vvariant){
// variantName
echo "variantName: " . $vvariant['name'] . "\n";
// stockMadrid
echo "stockMadrid: " . $vvariant['stockMadrid'] . "\n";
// stockBarcelona
echo "stockBarcelona: " . $vvariant['stockBarcelona'] . "\n";
}
}
}
}
// establece sesión
function login($url, $clientId, $clientSecret){
$curl = curl_init($url);
$curlPostData = '{ "query": "mutation{login(clientId: \"'.$clientId.'\", clientSecret: \"'.$clientSecret.'\") {token}}" }';
curl_setopt($curl, CURLOPT_ENCODING, '');
curl_setopt($curl, CURLOPT_POSTFIELDS, $curlPostData);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_VERBOSE, true);
curl_setopt($curl, CURLOPT_HTTPHEADER,
array(
'content-type: application/json',
'accept: application/json'
)
);
$curlResponse = curl_exec($curl);
if ($curlResponse === false) {
$info = curl_getinfo($curl);
curl_close($curl);
die('Error durante la ejecución de curl. Más info: ' . var_export($info));
}
curl_close($curl);
$jsonResponse = json_decode($curlResponse, true);
$token = "";
if(isset($jsonResponse['data']['login'][0]['token'])){
$token = $jsonResponse['data']['login'][0]['token'];
}
return $token;
}
// devuelve un array con todos los productos de la web
function products($url, $token, $cursor, &$arrProducts, &$page){
if(($cursor == "page1") || (!empty($cursor))){
if($cursor == "page1"){
$cursor = "";
}
$curl = curl_init($url);
$curlPostData = '{"query": "{products(cursor : \"'.$cursor.'\"){code,stockMadrid,stockBarcelona,productVariants{name,stockMadrid,stockBarcelona}}productsPagination {cursorAfter}}" }';
curl_setopt($curl, CURLOPT_ENCODING, '');
curl_setopt($curl, CURLOPT_POSTFIELDS, $curlPostData);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_VERBOSE, true);
curl_setopt($curl, CURLOPT_HTTPHEADER,
array(
'content-type: application/json',
'accept: application/json',
'Authorization: Bearer '.$token
)
);
$curlResponse = curl_exec($curl);
if ($curlResponse === false) {
$info = curl_getinfo($curl);
curl_close($curl);
die('Error durante la ejecución de curl. Más info: ' . var_export($info));
}
$jsonResponse = "";
$jsonResponse = json_decode($curlResponse, true);
$arrProducts[$page] = $jsonResponse['data']['products'];
$page++;
curl_close($curl);
if(isset($jsonResponse['data']['productsPagination'][0]['cursorAfter'])){
$cursor = $jsonResponse['data']['productsPagination'][0]['cursorAfter'];
products($url, $token, $cursor, $arrProducts, $page);
}
}
return $arrProducts;
}
Funciones
Para ver la documentación completa y todas las opciones que te ofrece la API, recomendamos el uso de un cliente GraphQL, como por ejemplo Altair GraphQL Client
Límites de llamadas
1000 peticiones máximo por cliente en los últimos 60 minutos. Si se supera este límite, no se aceptarán nuevas peticiones hasta pasado los 60 minutos
Mas información
Para obtener mas información, visita la página de GraphQL