Magento : Créer une commande via l’api

Cet article est assez ancien, malgré toute l'attention que j' apporte à mes contenus il est possible que celui-ci ne soit plus d'actualité.
N'hésitez pas à me le signaler si nécessaire via le formulaire de contact.

J’ai récemment eut à créer des commandes Magento via l’api et j’ai rencontré pas mal de difficultés, j’en profite pour condenser l’ensemble du processus dans cet article 🙂

Voici un script qui permettra de créer une commande Magento à partir de l’api Soap de Magento ( à la fois avec la version api V1 et api V2 )
Cet exemple a été réalisé sur un Magento 1.9.3.x de démonstration utilisant les samples data Magento.

N’hésitez pas à consulter la documentation officielle des api, si des points ne sont pas assez clairs  : https://devdocs.magento.com/guides/m1x/api/soap/introduction.html

Le script part des postulats suivants :

  • Passage de commande pour un client existant
  • Avec une adresse de facturation par défaut de renseignée
  • Les adresses de livraison et de facturation seront similaires.
  • Un accès à l’api avec tous les accès nécessaires existe sur le site magento de destination.

Les actions effectuées par le script sont les suivantes :

  1. Login à l’api
  2. Récupération de l’identifiant du  client à partir de son email
  3. Récupération de l’identifiant de l’adresse de facturation/livraison du client
  4. Création d’un panier
  5. Assignation du client au panier
  6. Assignation des adresses du client au panier
  7. Ajout de produits au panier
    1. Produit simple
    2. Produit configurable
    3. Produit groupé
    4. Produit Bundle
  8. Récupération des modes de livraison disponibles pour le panier
  9. Assignation du mode de livraison du panier
  10. Récupération des modes de paiement disponibles pour le panier
  11. Assignation du mode de paiement du panier
  12. Transformation panier en commande

 

Voir le script complet pour l’api V1
Voir le script complet pour l’api V2

Avant de vous montrer le script complet voici un focus sur les éléments à comprendre

Ajout des produits au panier

En fonction du type de produit à ajouter au panier , les informations à envoyer ne seront pas les mêmes.
Nous allons donc voir en détails comment ajouter les produits et récupérer les informations pour le faire

Produit simple :
L’ajout est rapide peut se faire en ciblant le produit via son identifiant Magento ou son SKU
Ceci fonctionne également pour les produits virtuels et téléchargeables.

 //Ajout d'un produit simple ( fonctionne aussi pour virtuel et téléchargeable )
	$simpleProductData = array(
		'sku' => 'acj005', //Sku du produit simple
                //'product_id' => 10 , Identifiant du produit en alternative
		'qty' => 2, //Qté du produit simple
	);

Produit configurable :
En complément des informations du produit simple, il est nécessaire d’implémenter le tableau « super_attribute » pour que l’ajout se fasse correctement.
Les valeurs qui doivent être renseignées sont sous la forme
AttributeID => OptionID

Attention à bien renseigner tous les attributs obligatoires pour que l’ajout fonctionne.

 //Ajout d'un produit configurable (ex sur démo magento bowery-chino-pants-546.html )
	$configurableProductData = array(
		'sku' => 'mpd003c' ,//Sku produit 
		'qty' => 1, //Qté du produit 
		'super_attribute' => array( //Champ spécifique au produit configurable
			92 => 17, //sous la forme attributeID => optionID
			180 => 67,
		),
	);

Il est possible de trouver ces informations directement sur le site en inspectant la source avec votre navigateur :

Les selects contiennent l’identifiant du super attribute dans leur nom, et la valeur est stockée dans l’option.

 

Produit Groupé :
En complément des informations du produit simple, il est nécessaire d’implémenter le tableau « super_group » pour que l’ajout se fasse correctement.
Les valeurs qui doivent être renseignées sont sous la forme
SuperGroupId => Qty

Attention à bien renseigner tous les attributs obligatoires pour que l’ajout fonctionne.

 //Ajout d'un produit groupé : pearl-necklace-set-test.html
	$groupedProductData = array(
		'sku' => 'acj007',
		'qty' => 1,
		'super_group' => array(
			547 => 1, //SuperGroupId => Qty
			548 => 2,
			551 => 1,	
		)
	);

Il est possible de trouver ces informations directement sur le site en inspectant la source avec votre navigateur :

Magento api grouped

Produit Bundle :
En complément des informations du produit simple, il est nécessaire d’implémenter les tableaux « bundle_option » et « bundle_qty » pour que l’ajout se fasse correctement.

 //Ajout d'un produit bundle mp3-player-with-audio.html
	$bundleProductData = array(
	  'product_id' => 446,
          'qty' => 1, //Quantité à 1 pour le bundle	  
	  'bundle_option' => array( 
	  21 => 84, //Quantité des options du panier sous la forme OptionID => SelectionID
	  22 => 86 ), 
	  'bundle_quantity' => array(
	  84 => 2, //Quantité de chaque option ajoutée au panier sous la forme SelectionID => Qté
	  86 => 2 
	  ), 
	);

Il est possible de trouver ces informations directement sur le site en inspectant la source avec votre navigateur :

Magento api bundle

 

Récupération des modes de paiement et de livraison

En fonction des paramètres de votre commande et selon la configuration de votre site, les modes de paiement et de livraison disponibles peuvent être amenés à changer.
C’est pourquoi je recommande l’utilisation des méthodes de l’api qui permettent de voir les modes disponibles avant de les assigner, les appels à faire étant les suivants :

//Récupération des modes de livraison disponibles pour la commande
$shippingMethods = $client->call($session, ‘cart_shipping.list, $shoppingCartId);
var_dump($shippingMethods);
//Récupération des modes de paiement disponibles pour la commande
$paymentMethods = $client->call($session, ‘cart_payment.list, $shoppingCartId);
var_dump($paymentMethods);

 

Pour finir voici donc le script complet pour l’API V1

 

<?php
error_reporting(E_ALL);
ini_set('display_errors','on');
echo '<pre>';
 
$adr = "http://magento-1933.demo/api/?wsdl";
$client = new SoapClient($adr,array('trace' => 1));
$apiUser = "testuser";
$apiKey = "test2018";
 
/**
* Création d'une commande Magento
* Via l'api Soap V1
*/
try {
 
//login à magento
$session = $client->login($apiUser, $apiKey);
 
//Récupération d'un client à partir de son email
$customerFilers = array(
'email' => array('eq' => '[email protected]')
);
$customersList = $client->call($session,'customer.list',array($customerFilers));
 
if ( $customersList ) {
$customerID = $customersList[0]['customer_id'];
} else {
exit('Erreur : Client non existant');
}
 
//Récupération de l'adresse de facturation par défaut du client
$addressList = $client->call($session, 'customer_address.list',$customerID);
 
if ( $addressList ) {
$addressId = false;
foreach ( $addressList as $address ) {
if ( $address['is_default_billing'] === true ){
$addressId = $address['customer_address_id'];
break;
}
}
} else {
exit("Erreur : Pas d'adresses pour ce client");
}
 
if ( !$addressId ) {
exit("Erreur : Pas d'adresse par défaut pour ce client");
}
 
//Création d'un panier ( initial )
$shoppingCartId= $client->call( $session, 'cart.create', array(1) );
 
//Assignation du client au panier
$assignCustomer = $client->call($session,'cart_customer.set',array($shoppingCartId,
array(
'mode' => 'customer',
'customer_id' => $customerID
)
)
);
//Assignation de l'adresse du client au panier , possibilité de définir une adresse de facturation et de livraison différente
$Adresses = $client->call($session, 'cart_customer.addresses',
array( $shoppingCartId ,
array(
array('mode' => 'billing','address_id' => $addressId),
array('mode' => 'shipping','address_id' => $addressId )
),
)
);
 
//Ajout d'un produit simple ( fonctionne aussi pour virtuel et téléchargeable )
$simpleProductData = array(
'sku' => 'acj005', //Sku du produit simple
'qty' => 2, //Qté du produit simple
);
 
//Ajout d'un produit configurable (ex sur démo magento bowery-chino-pants-546.html )
$configurableProductData = array(
'sku' => 'mpd003c' ,//Sku produit
'qty' => 1, //Qté du produit
'super_attribute' => array( //Champ spécifique au produit configurable
92 => 17, //sous la forme attributeID => optionID
180 => 67,
),
);
 
//Ajout d'un produit groupé
$groupedProductData = array(
'sku' => 'acj007',
'qty' => 1,
'super_group' => array(
547 => 1, //SuperGroupId => Qty
548 => 2,
551 => 1,
)
);
 
//Ajout d'un produit bundle mp3-player-with-audio.html
$bundleProductData = array(
'product_id' => 446,
'qty' => 1, //Quantité à 1 pour le bundle
'bundle_option' => array(
21 => 84,
22 => 86 ), //Quantité des options du panier sous la forme OptionID => SelectionID
'bundle_quantity' => array(
84 => 2,
86 => 2
), //Quantité de chaque option ajoutée au panier sous la forme SelectionID => Qté*/
);
 
//Assignation de produits au panier
$addProductToCart = $client->call($session,'cart_product.add',
array(
'quote_id' => $shoppingCartId,
array(
$simpleProductData,
$configurableProductData,
$groupedProductData,
$bundleProductData
),
)
);
 
//Récupération des modes de livraison disponibles pour la commande
$shippingMethods = $client->call($session, 'cart_shipping.list', $shoppingCartId);
 
//Décommenter la ligne suivante pour voir les méthodes de livraison disponibles
//var_dump($shippingMethods);
 
//Assignation d'un mode de livraison ( par défault on prends le freeshipping )
$assignShippingMethod = $client->call($session, 'cart_shipping.method', array($shoppingCartId,'freeshipping_freeshipping'));
 
//Récupération des modes de paiement disponibles pour la commande
$paymentMethods = $client->call($session, 'cart_payment.list', $shoppingCartId);
 
//Décommenter la ligne suivante pour voir les méthodes de paiement disponibles
//var_dump($paymentMethods);
 
//Assignation d'un mode de paiement : par défaut cashondelivery
$assignPaymenMethod = $client->call($session, 'cart_payment.method', array($shoppingCartId,array( 'method' => 'cashondelivery')));
 
//Transformation du paiement en panier
$transformOrder = $client->call($session, 'cart.order', array($shoppingCartId));
 
if ( $transformOrder ) {
echo 'Création de la commande '.$transformOrder.'<br />';
}
 
} catch ( Exception $e ) {
 
echo $e->getMessage();
 
}

Et le script pour l’API V2

 

<?php
error_reporting(E_ALL);
ini_set('display_errors','on');
echo '<pre>';
 
//API V2
$adr = "http://magento-1933.demo/api/?wsdl";
$client = new SoapClient($adr,array('trace' => 1));
$apiUser = "testuser";
$apiKey = "test2018";
 
/**
* Création d'une commande Magento
* Via l'api Soap V2
*/
try {
 
//login à magento
$session = $client->login($apiUser, $apiKey);
 
//Création d'un panier ( initial )
$shoppingCartId= $client->shoppingCartCreate( $session,1);
 
//Récupération d'un client à partir de son email
$customerFilers = array(
'email' => array('eq' => '[email protected]')
);
$customersList = $client->customerCustomerList($session,array($customerFilers));
 
if ( $customersList ) {
$customerID = $customersList[0]->customer_id;
} else {
exit('Erreur : Client non existant');
}
 
//Assignation d'un client au panier
$assignCustomer = $client->shoppingCartCustomerSet($session,$shoppingCartId,
array(
'mode' => 'customer',
'customer_id' => $customerID
)
);
 
//Récupération de l'adresse de facturation par défaut du client
$addressList = $client->customerAddressList($session,$customerID);
 
if ( $addressList ) {
$addressId = false;
foreach ( $addressList as $address ) {
if ( $address->is_default_billing === true ){
$addressId = $address->customer_address_id;
break;
}
}
} else {
exit("Erreur : Pas d'adresses pour ce client");
}
 
if ( !$addressId ) {
exit("Erreur : Pas d'adresse par défaut pour ce client");
}
 
//Assignation de cette adresse au panier
$Adresses = $client->shoppingCartCustomerAddresses($session, $shoppingCartId ,
array(
array('mode' => 'billing','address_id' => $addressId),
array('mode' => 'shipping','address_id' => $addressId )
)
);
 
//Ajout d'un produit simple ( fonctionne aussi pour virtuel et téléchargeable )
$simpleProductData = array(
'sku' => 'acj005', //Sku du produit simple
'qty' => 2, //Qté du produit simple
);
 
//Ajout d'un produit configurable (ex sur démo magento bowery-chino-pants-546.html )
$configurableProductData = array(
'sku' => 'mpd003c' ,//Sku produit
'qty' => 1, //Qté du produit
'super_attribute' => array( //Champ spécifique au produit configurable
92 => 17, //sous la forme attributeID => optionID
180 => 67,
),
);
 
//Ajout d'un produit groupé
$groupedProductData = array(
'sku' => 'acj007',
'qty' => 1,
'super_group' => array(
547 => 1, //SuperGroupId => Qty
548 => 2,
551 => 1,
)
);
 
//Ajout d'un produit bundle mp3-player-with-audio.html
$bundleProductData = array(
'product_id' => 446,
'qty' => 1, //Quantité à 1 pour le bundle
'bundle_option' => array(
21 => 84,
22 => 86 ), //Quantité des options du panier sous la forme OptionID => SelectionID
'bundle_quantity' => array(
84 => 2,
86 => 2
), //Quantité de chaque option ajoutée au panier sous la forme SelectionID => Qté*/
);
 
//Assignation de produits au panier
$addProductToCart = $client->shoppingCartProductAdd($session,$shoppingCartId,
array(
$simpleProductData,
$configurableProductData,
$groupedProductData,
$bundleProductData
)
);
 
//Récupération des modes de livraison disponibles pour la commande
$shippingMethods = $client->shoppingCartShippingList ($session,$shoppingCartId);
 
//Décommenter la ligne suivante pour voir les méthodes de livraison disponibles
//var_dump($shippingMethods);
 
//Assignation d'un mode de livraison ( par défault on prends le freeshipping )
$assignShippingMethod = $client->shoppingCartShippingMethod($session,$shoppingCartId,'freeshipping_freeshipping');
 
//Récupération des modes de paiement disponibles pour la commande
$paymentMethods = $client->shoppingCartPaymentList($session,$shoppingCartId);
 
//Décommenter la ligne suivante pour voir les méthodes de paiement disponibles
//var_dump($paymentMethods);
 
//Assignation d'un mode de paiement : par défaut cashondelivery
$assignPaymenMethod = $client->shoppingCartPaymentMethod($session,$shoppingCartId,array( 'method' => 'cashondelivery'));
 
//Transformation du paiement en panier
$transformOrder = $client->shoppingCartOrder($session,$shoppingCartId);
 
if ( $transformOrder ) {
echo 'Création de la commande '.$transformOrder.'<br />';
}
 
} catch ( Exception $e ) {
echo $e->getMessage();
}

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *