Comprendre et utiliser
l’API REST de
WooCommerce
Maxime VARINARD - Vaisonet
WordCamp Lille 2018
C’est quoi un
webservice ?
Un webservice
Technique
Basé sur HTTP
Source : www.commentcamarche.com
Un webservice
Technique
Basé sur HTTP
Ce n’est pas de l’échange de fichier et
ça change tout !
Un webservice
Technique
Basé sur HTTP
Avantages
● Validation des
données
● Gestion des erreurs
● Pare-feu
● Interopérable
● Standard et
compréhensible
Inconvénients
Comment ça
fonctionne ?
Initialisation
Je fais une requête
HTTP
Modification
J’interprète la réponse
et je la modifie
Envoi
Je renvoie les
données
Interprétation
Le serveur analyse les
données et renvoie
une réponse
Gestion
Je réagis à la réponse
(OK / KO)
Un peu de jargon
Un peu de jargon
● XML-RPC
● SOAP
● REST
● XML
● JSON
● GraphQL
HTTP et
validation des
données
Type de requête HTTP
● GET pour lire
● POST pour créer
● PUT pour mettre à jour
● DELETE pour supprimer
Réponses HTTP
● 200 OK
● 401 Unauthorized
● 500 Internal Server Error
● etc ...
Les validations par le webservice
● Validation très fine des données (numéros de téléphone, caractères interdits, etc …)
En dernier lieu ...
● le schéma de la base MySQL !
Webservice vs
MySQL
Webservice
Accès passe partout
Validation des données fine
Versionning
Gestion des événements
Documentation
Plugins présents sans importance
Un accès externe est parfois
compliqué …
Gestion des tables liées
Performance
MySQL
API REST
WooCommerce
Activation
● Activer l’API REST
Auth Endpoint
Oauth
Signature des données + Timestamp
+ authentification
Auth HTTP
Source : woocommerce.github.io
Activation
● Générer la paire de clé
Activation
● Ne pas oublier les permaliens (erreur 404 sinon)
● La structure personnalisée (par défaut) ne fonctionne pas => nom de l’article
Méthodes principales
● Documentation sur GitHub => http://woocommerce.github.io/woocommerce-rest-api-
docs
● La méthode System status donne plein d’informations sur la configuration de
WooCommerce, WordPress, PHP
Filtres et pagination
● Ne récupérer que les commandes validées
● Ne récupérer que les 500 premiers produits
Exemples
d’utilisation
Se simplifier la vie
● Des librairies existent pour de nombreux langages, pour faciliter :
○ authentification
○ gestion des erreurs
○ pagination
○ syntaxe plus parlante / simplifiée
Apartée Composer
Apartée Composer
● Outil en ligne de commandes
● Disponible sur tout OS exécutant PHP
● Gestion des librairies et de leurs dépendances
● Gestion des versions et compatibilités
● Un site regroupe tous les paquets : packagist.org
Apartée Composer
● Automattic propose une librairie :
● > composer require automattic/woocommerce
Créer le client
//Autoload de Composer
require __DIR__ . '/vendor/autoload.php';
//Espace de nom de la librairie
use AutomatticWooCommerceClient;
Créer le client
//Création du client
$woocommerce = new Client(
'https://wordcamp.org',
'ck_X', //La clé
'cs_X', // Clé secrète
[
'version' => 'wc/v2', //Pour définir la version à utiliser
‘user_agent’ => ‘WordCamp REST API customer’,
]
);
Les 4 méthodes REST
● $woocommerce->get(ressource, options);
● $woocommerce->post(ressource, options);
● $woocommerce->put(ressource, options);
● $woocommerce->delete(ressource, options);
Gestion des erreurs
● Exception “HttpClientException”
try {
// Mon code
} catch (HttpClientException $e) {
$e->getMessage(); // Message d’erreur.
$e->getRequest(); // La dernière requête.
$e->getResponse(); // La réponse.
}
Mettre à jour un prix
$produit = $woocommerce->get( 'products', array(‘id’ => 1258));
$produit->regular_price = 20;
$woocommerce->put(‘products’, $produit);
Mettre à jour un prix
try {
$produit = $woocommerce->get( 'products', array(‘id’ => 1258));
} catch (HttpClientException $e) {
echo $e->getMessage(); // Message d’erreur.
}
$produit->regular_price = 20;
try {
$woocommerce->put(‘products’, $produit);
} catch (HttpClientException $e) {
echo $e->getMessage(); // Message d’erreur.
}
Créer un produit
$produit = [
'name' => 'Billet WordCamp',
'type' => 'simple',
'regular_price' => '20.00',
'description' => 'Participez au prochain WordCamp',
'images' => [
[
'src' => 'https://wordpress.org/path/to/image.jpg',
'position' => 0,
[...]
$woocommerce->post( 'products', $produit );
Appliquer un filtre
● Récupérer les 100 dernières commandes au statut pending
Appliquer un filtre
$woocommerce->get(‘orders’, array (‘status’ => ‘pending’, ‘per_page’ => 100));
Comment tester
le client REST ?
Installer un WooCommerce de test
● Installer WampServer / Xampp
● Télécharger WordPress
● Allez dans le back-office, installer WooCommerce
Installer un WooCommerce de test
● Installer WampServer / Xampp
● Télécharger WordPress
● Allez dans le back-office, installer WooCommerce
● Et répéter à chaque test ...
Apartée WP-CLI
Installer un WooCommerce de test v2
● Installer un hyperviseur de son choix
● Installer Vagrant
● Scripter l’installation d’une machine virtuelle
● Bénéficier des snapshots
Vagrant
Vagrant.configure("2") do |config|
config.vm.box = "spartan/aws-dummy"
config.vm.provider "aws"
Vagrant
Vagrant.configure("2") do |config|
config.vm.box = "spartan/aws-dummy"
config.vm.provider "aws"
config.vm.provider :aws do |aws, override|
aws.access_key_id = ""
aws.secret_access_key = ""
aws.keypair_name = 'vagrantaws'
aws.ami = ""
aws.region = "eu-central-1"
aws.instance_type = "m3.medium"
[...]
end
Vagrant
config.vm.provision "shell", inline: <<-SHELL
apt-get update
apt-get install -y mysql-server mysql-client curl unzip git
apt-get install -y apache2
apt-get install -y php php-mysql php-imap php-intl libapache2-mod-php php-common php-
gd php-pear libgd-tools php-curl php-mcrypt php-mbstring
/etc/init.d/apache2 restart
Vagrant
wget https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
php wp-cli.phar core download --path=/var/www/html/wordpress --allow-root --locale=fr_FR
php wp-cli.phar config create --path=/var/www/html/wordpress --locale=fr_FR [...]
php wp-cli.phar core install --url=$url/wordpress --title=Example --admin_user=admin --
admin_password=0123456789 --admin_email=wp@wp.com --skip-email [...]
php wp-cli.phar plugin install woocommerce --activate [...]
php wp-cli.phar option update siteurl wordpress [...]
Tests unitaires
du client REST
Comment rédiger des tests unitaires
quand une méthode appelle un
webservice ?
PHPUnit
class WSTest extends PHPUnit_Framework_TestCase
{
public function testget()
{
$produit = $woocommerce->get( 'products', array(‘id’ => 1258));
$this->assertEquals(MONMODELE, $produit);
}
}
Comment tester
QUE le client
REST ?
Simulacre d’objet / Mock Object
● Reproduire le comportement du webservice, de manière contrôlée et reproductible
● Mock de l’objet $woocommerce
● Un framework bien pratique : Phake
Phake - mise en bouche ...
>composer require --dev phunit/phpunit
>composer require --dev phake/phake
Et pour la suite : RTFM ;)
Des questions ?
@Vaisonet
Maxime Varinard

WordCamp Lille 2018 : Comprendre et utiliser l'API REST de WooCommerce

  • 1.
    Comprendre et utiliser l’APIREST de WooCommerce Maxime VARINARD - Vaisonet WordCamp Lille 2018
  • 2.
  • 3.
    Un webservice Technique Basé surHTTP Source : www.commentcamarche.com
  • 4.
    Un webservice Technique Basé surHTTP Ce n’est pas de l’échange de fichier et ça change tout !
  • 5.
    Un webservice Technique Basé surHTTP Avantages ● Validation des données ● Gestion des erreurs ● Pare-feu ● Interopérable ● Standard et compréhensible Inconvénients
  • 6.
  • 7.
    Initialisation Je fais unerequête HTTP Modification J’interprète la réponse et je la modifie Envoi Je renvoie les données Interprétation Le serveur analyse les données et renvoie une réponse Gestion Je réagis à la réponse (OK / KO)
  • 8.
    Un peu dejargon
  • 9.
    Un peu dejargon ● XML-RPC ● SOAP ● REST ● XML ● JSON ● GraphQL
  • 10.
  • 11.
    Type de requêteHTTP ● GET pour lire ● POST pour créer ● PUT pour mettre à jour ● DELETE pour supprimer
  • 12.
    Réponses HTTP ● 200OK ● 401 Unauthorized ● 500 Internal Server Error ● etc ...
  • 13.
    Les validations parle webservice ● Validation très fine des données (numéros de téléphone, caractères interdits, etc …)
  • 14.
    En dernier lieu... ● le schéma de la base MySQL !
  • 15.
  • 16.
    Webservice Accès passe partout Validationdes données fine Versionning Gestion des événements Documentation Plugins présents sans importance Un accès externe est parfois compliqué … Gestion des tables liées Performance MySQL
  • 17.
  • 18.
  • 19.
    Auth Endpoint Oauth Signature desdonnées + Timestamp + authentification Auth HTTP Source : woocommerce.github.io
  • 20.
  • 21.
    Activation ● Ne pasoublier les permaliens (erreur 404 sinon) ● La structure personnalisée (par défaut) ne fonctionne pas => nom de l’article
  • 22.
    Méthodes principales ● Documentationsur GitHub => http://woocommerce.github.io/woocommerce-rest-api- docs ● La méthode System status donne plein d’informations sur la configuration de WooCommerce, WordPress, PHP
  • 23.
    Filtres et pagination ●Ne récupérer que les commandes validées ● Ne récupérer que les 500 premiers produits
  • 24.
  • 25.
    Se simplifier lavie ● Des librairies existent pour de nombreux langages, pour faciliter : ○ authentification ○ gestion des erreurs ○ pagination ○ syntaxe plus parlante / simplifiée
  • 26.
  • 27.
    Apartée Composer ● Outilen ligne de commandes ● Disponible sur tout OS exécutant PHP ● Gestion des librairies et de leurs dépendances ● Gestion des versions et compatibilités ● Un site regroupe tous les paquets : packagist.org
  • 28.
    Apartée Composer ● Automatticpropose une librairie : ● > composer require automattic/woocommerce
  • 29.
    Créer le client //Autoloadde Composer require __DIR__ . '/vendor/autoload.php'; //Espace de nom de la librairie use AutomatticWooCommerceClient;
  • 30.
    Créer le client //Créationdu client $woocommerce = new Client( 'https://wordcamp.org', 'ck_X', //La clé 'cs_X', // Clé secrète [ 'version' => 'wc/v2', //Pour définir la version à utiliser ‘user_agent’ => ‘WordCamp REST API customer’, ] );
  • 31.
    Les 4 méthodesREST ● $woocommerce->get(ressource, options); ● $woocommerce->post(ressource, options); ● $woocommerce->put(ressource, options); ● $woocommerce->delete(ressource, options);
  • 32.
    Gestion des erreurs ●Exception “HttpClientException” try { // Mon code } catch (HttpClientException $e) { $e->getMessage(); // Message d’erreur. $e->getRequest(); // La dernière requête. $e->getResponse(); // La réponse. }
  • 33.
    Mettre à jourun prix $produit = $woocommerce->get( 'products', array(‘id’ => 1258)); $produit->regular_price = 20; $woocommerce->put(‘products’, $produit);
  • 34.
    Mettre à jourun prix try { $produit = $woocommerce->get( 'products', array(‘id’ => 1258)); } catch (HttpClientException $e) { echo $e->getMessage(); // Message d’erreur. } $produit->regular_price = 20; try { $woocommerce->put(‘products’, $produit); } catch (HttpClientException $e) { echo $e->getMessage(); // Message d’erreur. }
  • 35.
    Créer un produit $produit= [ 'name' => 'Billet WordCamp', 'type' => 'simple', 'regular_price' => '20.00', 'description' => 'Participez au prochain WordCamp', 'images' => [ [ 'src' => 'https://wordpress.org/path/to/image.jpg', 'position' => 0, [...] $woocommerce->post( 'products', $produit );
  • 36.
    Appliquer un filtre ●Récupérer les 100 dernières commandes au statut pending
  • 37.
    Appliquer un filtre $woocommerce->get(‘orders’,array (‘status’ => ‘pending’, ‘per_page’ => 100));
  • 38.
  • 39.
    Installer un WooCommercede test ● Installer WampServer / Xampp ● Télécharger WordPress ● Allez dans le back-office, installer WooCommerce
  • 40.
    Installer un WooCommercede test ● Installer WampServer / Xampp ● Télécharger WordPress ● Allez dans le back-office, installer WooCommerce ● Et répéter à chaque test ...
  • 41.
  • 42.
    Installer un WooCommercede test v2 ● Installer un hyperviseur de son choix ● Installer Vagrant ● Scripter l’installation d’une machine virtuelle ● Bénéficier des snapshots
  • 43.
    Vagrant Vagrant.configure("2") do |config| config.vm.box= "spartan/aws-dummy" config.vm.provider "aws"
  • 44.
    Vagrant Vagrant.configure("2") do |config| config.vm.box= "spartan/aws-dummy" config.vm.provider "aws" config.vm.provider :aws do |aws, override| aws.access_key_id = "" aws.secret_access_key = "" aws.keypair_name = 'vagrantaws' aws.ami = "" aws.region = "eu-central-1" aws.instance_type = "m3.medium" [...] end
  • 45.
    Vagrant config.vm.provision "shell", inline:<<-SHELL apt-get update apt-get install -y mysql-server mysql-client curl unzip git apt-get install -y apache2 apt-get install -y php php-mysql php-imap php-intl libapache2-mod-php php-common php- gd php-pear libgd-tools php-curl php-mcrypt php-mbstring /etc/init.d/apache2 restart
  • 46.
    Vagrant wget https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar php wp-cli.pharcore download --path=/var/www/html/wordpress --allow-root --locale=fr_FR php wp-cli.phar config create --path=/var/www/html/wordpress --locale=fr_FR [...] php wp-cli.phar core install --url=$url/wordpress --title=Example --admin_user=admin -- admin_password=0123456789 --admin_email=wp@wp.com --skip-email [...] php wp-cli.phar plugin install woocommerce --activate [...] php wp-cli.phar option update siteurl wordpress [...]
  • 47.
    Tests unitaires du clientREST Comment rédiger des tests unitaires quand une méthode appelle un webservice ?
  • 48.
    PHPUnit class WSTest extendsPHPUnit_Framework_TestCase { public function testget() { $produit = $woocommerce->get( 'products', array(‘id’ => 1258)); $this->assertEquals(MONMODELE, $produit); } }
  • 49.
    Comment tester QUE leclient REST ?
  • 50.
    Simulacre d’objet /Mock Object ● Reproduire le comportement du webservice, de manière contrôlée et reproductible ● Mock de l’objet $woocommerce ● Un framework bien pratique : Phake
  • 51.
    Phake - miseen bouche ... >composer require --dev phunit/phpunit >composer require --dev phake/phake Et pour la suite : RTFM ;)
  • 52.

Notes de l'éditeur

  • #2 Je vous présente aujourd’hui cet atelier sur l’API REST de Woocommerce. Je suis Maxime Varinard, fondateur de Vaisonet, un éditeur de logiciel de synchronisation de flux de données entre sites e-commerce et logiciels de gestion commerciale ou ERP. Si vous comprenez quelque chose à cet atelier et que vous cherchez du travail, on recrute !
  • #5 On ne fait pas de l’envoi de fichier en aveugle, sans connaître le résultat du traitement, comme un envoi FTP.
  • #10 XML-RPC (protocole) SOAP (protocole) REST, c’est une architecture, une évolution de XML-RPC tenant compte des entêtes HTTP XML => un des langage utilisé par REST JSON => un des langage utilisé par REST GraphQL = > l'alternative de Facebook à REST, permet de faire de requêtes type SELECT SQL, mais pas de cache.
  • #13 401 clé API KO 301 redirection définitive ou 302 temporaire 503 Erreur temporaire 404 la ressource n’existe pas Avantage REST, on peut gérer des erreurs basées sur les codes HTTP
  • #17 Accès MySQL : 1) Config MySQL 2) Utilisateur avec accès IP 3) Pare feu Souvent il faut une IP fixe pour l’hébergeur
  • #19 503 Erreur temporaire 404 la ressource n’existe pas
  • #21 503 Erreur temporaire 404 la ressource n’existe pas
  • #22 503 Erreur temporaire 404 la ressource n’existe pas
  • #23 503 Erreur temporaire 404 la ressource n’existe pas
  • #24 Intérêt ? La charge serveur une fois en production. Ca marche bien en dev, mais il faut tenir la charge !
  • #27 Appartée composer
  • #28 Appartée composer
  • #29 Appartée composer
  • #41 Donc on finit par ne pas tester ...
  • #42 Appartée composer
  • #43 (Hyper-V, VMware, Xen) ou AWS, Azure
  • #50 Vagrant permet de tester facilement plusieurs versions de WC / WP, mais tests unitaires lourds. Problème réseau possible, comment tester ?