Connexion à l’API graphql shopify depuis une application en Laravel
Shopify poussant apparemment de plus en plus vers l’API graphql au détriment de la REST, après avoir fait des tests sur la REST, j’ai donc commencé à travailler sur celle-ci.
La syntaxe des requêtes est très différente entre les deux types d’API, ça demande un peu de réflexion, surtout lorsqu’il s’agit de passer des paramètres, la majorité des tutos étant des exemples figés, après vérification, la documentation officielle expose des exemples avec variables, donc privilégiez ce canal.
Avant tout, pour faciliter la mise en place des différents appels, je vous conseille de booker la page consacrée à l’API graphql de Shopify, et d’installer l’application sur votre boutique, elle vous permettra de facilement construire les requêtes dont vous aurez besoin.
Une fois que c’est fait et partant du principe que vous avez installé comme il faut les librairies sur votre application (voir doc graphql API), nous allons pouvoir commencer.
Tout d’abord il faut savoir que contrairement à tout ce que j’ai vu, il n’est pas nécessaire de récupérer un token depuis Shopify puisque le champs password de l’utilisateur dans la base de données de l’application est en fait le token offline et qu’il fonctionne parfaitement pour les appels, la seule chose à faire à mon avis est de le crypter afin que personne ne puisse le récupérer vu que ce dernier est contenu dans l’objet $request->user();
De mon côté j’ai repris une librairie que j’avais mis en place sur différents projets afin de crypter / decrypter les données, je ferai sans doute un billet là dessus à l’occasion.
J’ai testé la récupération d’un token online, et ce dernier fonctionne aussi, la seule différence que j’ai noté au niveau de l’API, c’est que la version offline est immuable jusqu’à une nouvelle génération depuis l’admin de votre boutique, alors que la version online a une durée de vie de plus ou moins une heure de ce que j’ai pu lire.
Nous partirons sur la version offline du token pour simplifier les choses, voici donc le code qui va récupérer l’ensemble des variants d’un produit donné, une partie des données est en dur dans la fonction pour le moment car je n’ai pas encore utilisé ce code en conditions réelles.
public function getVariants(Request $request) {
$shop = $request->user();
$token = $this->functions->decryptString($shop->password);
$product_id = 'product_id:7615689752655';
$first = 1;
$queryString = <<<QUERY
query productVariants(\$product_id: String!, \$first: Int!) {
productVariants(query: \$product_id, first: \$first) {
nodes {
selectedOptions {
name
value
}
}
}
}
QUERY;
$url = 'https://'.$shop->name.'/admin/api/'.env('SHOPIFY_API_VERSION').'/graphql.json';
$options = array(CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'X-Shopify-Access-Token: '.$token));
$post_parameters = array('query' => $queryString, 'variables' => array('product_id' => $product_id, 'first' => $first));
$result = AiCurl::sendRequest($url, array(), true, $post_parameters, $options, true);
dd(json_decode($result));
}
En détail, nous récupérons donc le champs password de l’utilisateur, qui est décrypté pour avoir le token permettant l’appel à l’API.
Ensuite les deux variables sont pour le moment en dur mais l’objectif à terme est de fournir à la fonction l’id du produit, le first à priori sera toujours à 1 car je veux uniquement les variants de ce produit, mais il est impératif de mettre une borne.
Ensuite la queryString, c’est ici que tout se passe, on construit donc la requête en l’encapsulant dans une fonction portant le même nom et recevant les variables, qui seront ensuite utilisées dans la ‘vraie’ requête, attention, il est impératif (j’ai passé un peu de temps dessus car je n’ai pas trouvé d’exemple en parlant) d’échapper les variables en mettant un \ devant, sinon vous aurez un retour en erreur.
Concernant la syntaxe de cette requête, comme dit précédemment ça ne s’invente pas, il faut se référer à la doc ou mieux à l’application qui vous construit la requête directement.
Ensuite on défini les paramètres de l’appel CURL, je passe par là car habitué de CURL et surtout j’ai essayé les appels à partir des librairies mais impossible de les faire fonctionner, donc nous définissons l’url à appeler, nous passons le token dans le header avec la clé X-Shopify-Access-Token, puis la requête et les variables dans le corps de l’appel, en POST surtout.
Ensuite nous lançons l’appel, pour ma part j’ai un fichier spécial pour les appels CURL, mais grosso modo ça doit ressembler à ça :
$request = curl_init();
curl_setopt($request, CURLOPT_URL, $url);
curl_setopt($request, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($request, CURLOPT_RETURNTRANSFER, true);
curl_setopt($request, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($request, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($request, CURLOPT_POST, true);
// Add options
foreach ($options as $key => $value) {
curl_setopt($request, $key, $value);
}
// Set post fields
curl_setopt($request, CURLOPT_POSTFIELDS, json_encode($post_parameters));
$result = curl_exec($request);
Le résultat obtenu doit ressembler à ça :
{#1508 // app\Http\Controllers\ProductsController.php:71
+"data": {#1488
+"productVariants": {#1513
+"nodes": array:1 [
0 => {#1487
+"selectedOptions": array:2 [
0 => {#1489
+"name": "Nom 1"
+"value": "Valeur 1"
}
1 => {#1504
+"name": "Nom 2"
+"value": "Valeur 2"
}
]
}
]
}
}
+"extensions": {#1528
+"cost": {#1526
+"requestedQueryCost": 4
+"actualQueryCost": 4
+"throttleStatus": {#1527
+"maximumAvailable": 2000.0
+"currentlyAvailable": 1996
+"restoreRate": 100.0
}
}
}
}
Qui doivent correspondre aux données que vous avez dans la fiche produit de votre boutique.

Vous avez réalisé votre premier appel à l’API graphql de Shopify.
Cette approche est sans doute perfectible mais elle donne les résultats attendus et est un condensé de tout ce que j’ai pu consulter en terme de doc et de tutos.