Les Passerelles de Paiement dans WooCommerce sont basées sur des classes et peuvent être ajoutées à l’aide des plugins traditionnels. Ce guide fournit une intro au développement des passerelles.

Types de passerelles de paiement   

Il y a plusieurs variétés de passerelles de paiement :

  1. Basées sur formulaire – C’est là où l’utilisateur doit cliquer sur un bouton sur un formulaire qui le redirige ensuite vers le processeur de paiement sur le propre site web de la passerelle. Exemple : PayPal standard, Authorize.net DPM
  2. Basées sur iframe – C’est quand le système de paiement des passerelles est chargé à l’intérieur d’une iframe sur votre boutique. Exemple : SagePay Form, PayPal Advanced
  3. Directes – C’est quand les champs de paiement sont affichés directement sur la page de la caisse et que le paiement est effectué quand on appuie sur “commander”. Exemple : PayPal Pro, Authorize.net AIM
  4. Hors-ligne – Aucun paiement en ligne n’est effectué. Exemple : Chèque, Virement Bancaire

Les passerelles basées sur formulaire ou iFrame postent des données hors-site ce qui signifie que vous avez moins à vous soucier des problèmes de sécurité. Les passerelles de paiement cependant nécessitent que la sécurité du serveur soit implémentée (certificats SSL etc.) et peuvent aussi nécessiter un niveau de conformité PCI.

Créer une passerelle de paiement basique    Retourner en Haut

Les passerelles de paiement devraient être créées comme des plugins additionnels qui s’accrochent dans WooCommerce. A l’intérieur du plugin vous devriez créer votre classe après que le plugin est chargé. Exemple :

 

add_action( ‘plugins_loaded’, ‘init_your_gateway_class’ );

Il est également important que votre classe de passerelle élargisse la classe des passerelles de base de WC pour que vous ayez accès aux méthodes importantes et aux paramètres API :

function init_your_gateway_class() {
class WC_Gateway_Your_Gateway extends WC_Payment_Gateway {}
}

Vous pouvez visualiser la classe WC_Payment_Gateway dans les Docs API.

Outre définir votre classe, vous devez aussi dire à WC qu’elle existe. Vous pouvez le faire en filtrant woocommerce_payment_gateways:

function add_your_gateway_class( $methods ) {
$methods[] = ‘WC_Gateway_Your_Gateway’;
return $methods;
}

add_filter( ‘woocommerce_payment_gateways’, ‘add_your_gateway_class’ );

Méthodes Requises

La plupart des méthodes sont héritées de la classe WC_Payment_Gateway, cependant, certaines sont requises dans votre passerelle personnalisée.

__construct()

Dans votre constructeur vous devriez définir les variables suivantes :

  • $this->id – ID unique pour votre passerelle. ex : ‘your_gateway’
  • $this->icon – Si vous voulez afficher une image  à côté du nom de la passerelle sur le frontend, entrez une URL pour une image.
  • $this->has_fields – Bool. Peut être défini comme true (vrai) si vous voulez que les champs de paiement soient affichés lors de la caisse (si on fait une intégration directe).
  • $this->method_title – Titre de la méthode de paiement affichée sur la page admin.
  • $this->method_description – Description de la méthode de paiement affichée sur la page admin.

Votre constructeur devrait aussi définir et charger les champs des paramètres :

$this->init_form_fields();
$this->init_settings();

Nous traiterons de init_form_fields() plus tard, mais cela définit en gros vos paramètres qui sont ensuite chargés avec init_settings().

Après que init_settings() est appelé, vous pouvez prendre les paramètres et les charger dans des variables, ex:

$this->title = $this->get_option( ‘title’ );

Finalement, vous devez ajouter un hook de sauvegarde pour vos paramètres :

add_action( ‘woocommerce_update_options_payment_gateways_’ . $this->id, array( $this, ‘process_admin_options’ ) );

init_form_fields()

Utilisez cette méthode pour configurer $this->form_fields – ce sont les options que vous montrerez dans l’admin sur votre page de paramètres de passerelle et vous utiliserez les Paramètres API de WC.

Un ensemble basique de paramètres pour votre passerelle consisterait en enabled, title et description:

$this->form_fields = array(
‘enabled’ => array(
‘title’ => __( ‘Activer/Désactiver’, ‘woocommerce’ ),
‘type’ => ‘checkbox’,
‘label’ => __( ‘Activer le Paiement par Chèque’, ‘woocommerce’ ),
‘default’ => ‘yes’
),
‘title’ => array(
‘title’ => __( ‘Titre’, ‘woocommerce’ ),
‘type’ => ‘text’,
‘description’ => __( ‘Ceci contrôle le titre que l’utilisateur voit lors de la caisse.’, ‘woocommerce’ ),
‘default’ => __( ‘Paiement par Chèque’, ‘woocommerce’ ),
‘desc_tip’      => true,
),
‘description’ => array(
‘title’ => __( ‘Message Client’, ‘woocommerce’ ),
‘type’ => ‘textarea’,
‘default’ =>  »
)
);

process_payment( $order_id )

Maintenant la partie la plus importante de la passerelle ; s’occuper du paiement et traiter la commande. Process_payment dit aussi à WC où rediriger l’utilisateur – ceci est rendu en tableau.

Voici un exemple de fonction process_payment de la passerelle Chèque :

function process_payment( $order_id ) {
global $woocommerce;
$order = new WC_Order( $order_id );

// Marquer comme suspendu (nous attendons le chèque)
$order->update_status(‘on-hold’, __( ‘Nous attendons le paiement par chèque’, ‘woocommerce’ ));

// Réduire les niveaux de stock
$order->reduce_order_stock();

// Enlever le panier
$woocommerce->cart->empty_cart();

// Rediriger vers la page de remerciements
return array(
‘result’ => ‘success’,
‘redirect’ => $this->get_return_url( $order )
);
}

Comme vous pouvez le voir, le but est de :

  • Obtenir et mettre à jour la commande en cours de traitement
  • Réduire le stock et vider le panier
  • Dire que l’opération a été réussie et rediriger l’URL (dans ce cas la page de remerciements)

Le chèque donne à la commande le statut suspendu puisque le paiement ne peut pas être vérifié automatiquement. Cependant, si vous construisez une passerelle directe vous pouvez en fait terminer la commande ici à la place. Quand une commande est payée, au lieu d’utiliser update_status vous devriez utiliser payment_complete:

$order->payment_complete();

Cela va assurer que les réductions de stock sont faites et que le statut est changé en la valeur correcte.

Si votre paiement échoue, au lieu de retourner le tableau d’opération réussie vous devriez lancer un message d’erreur et retourner null:

wc_add_notice( __(‘Erreur de Paiement:’, ‘woothemes’) . $error_message, ‘error’ );
return;

WooCommerce décèlera cette erreur et l’affichera sur la page de la caisse.

Mettre à jour le statut de la commande et ajouter des notes

En utilisant des fonctions dans la classe des commandes on peut mettre à jour le statut de la commande. Vous devriez faire cela seulement si le statut de la commande ne change pas (auquel cas vous devriez utiliser payment_complete()). Un exemple de mise à jour vers un statut personnalisé serait :

$order = new WC_Order( $order_id );
$order->update_status(‘on-hold’, __(‘Nous attendons le paiement par chèque’, ‘woothemes’));

L’exemple ci-dessus met à jour le statut en suspendu et ajoute une note informant le propriétaire que le chèque est attendu. Vous pouvez ajouter des notes sans mettre à jour un statut de commande – c’est utilisé pour ajouter un message de débogage :

$order->add_order_note( __(‘Paiement IPN terminé’, ‘woothemes’) );

Pratique optimale du statut de la commande

  • Si la commande a été faite mais que l’admin doit vérifier manuellement le paiement utilisez suspendue
  • Si la commande échoue et a déjà été créée, configurez avec échouée
  • Si le paiement est terminé laissez WooCommerce se charger du statut et utilisez $order->payment_complete(). WC utilisera soit le statut terminée soit le statut  en cours de traitement et s’occupera du stock.

 

Notes sur les Passerelles Directes

Si vous créez une passerelle directe avancée (i.e. une qui prend les paiements sur la page-même de la caisse) il y quelques étapes additionnelles impliquées. D’abord, vous devez paramétrer has_fields en true (vrai) dans le constructeur de passerelle :

$this->has_fields = true;

Cela dit à la caisse de sortir une ‘payment_box’ (boîte de paiement) contenant votre formulaire de paiement direct que vous définirez ensuite. Créez une méthode appelée payment_fields() – elle contient votre formulaire, qui va probablement contenir les données de carte de crédit.

La méthode suivante que vous pouvez facultativement ajouter est validate_fields(). Renvoyez true si le formulaire passe la validation, ou false s’il échoue. Vous pouvez utiliser la fonction wc_add_notice() si vous voulez aussi ajouter une erreur et la montrer à l’utilisateur.

Enfin, vous devrez ajouter le code de paiement à l’intérieur de votre méthode process_payment( $order_id ). Elle doit prendre les données du formulaire posté et essayer de prendre le paiement directement via le fournisseur de paiement. Si le paiement échoue vous devriez sortir une erreur et ne rien retourner :

wc_add_notice( __(‘Erreur de Paiement:’, ‘woothemes’) . $error_message, ‘error’ );
return;

Si d’autre part, le paiement est couronné de succès vous devriez définir la commande en tant que payée et retourner le tableau d’opération réussie:

// Paiement terminé
$order->payment_complete();

// Rediriger vers la page de remerciements
return array(
‘result’ => ‘success’,
‘redirect’ => $this->get_return_url( $order )
);


 

Travailler avec des Rappels de Passerelles de Paiement (tels que PayPal IPN)

Si vous construisez une passerelle qui fait un rappel à votre boutique pour vous informer du statut d’une commande vous devrez ajouter un code pour gérer cela à l’intérieur de votre passerelle.

La meilleure façon d’ajouter un rappel et un gestionnaire de rappels serait d’utiliser les hooks

WC-API. Un exemple rapide serait comme ce que fait PayPal standard. Il définit le rappel/l’url d’IPN comme suit :

str_replace( ‘https:’, ‘http:’, add_query_arg( ‘wc-api’, ‘WC_Gateway_Paypal’, home_url( ‘/’ ) ) );

Ensuite fait un hook dans son gestionnaire avec le hook suivant :

add_action( ‘woocommerce_api_wc_gateway_paypal’, array( $this, ‘check_ipn_response’ ) );

WooCommerce appellera votre passerelle et fera l’action lorsque l’URL sera appelée.

Pour plus d’informations sur l’API WooCommerce lisez ici.


 

Les Hooks dans les passerelles   

Il est important de noter que l’ajout de hooks à l’intérieur des classes de passerelles peut ne rien déclencher – les passerelles sont seulement chargées si besoin est (pendant la caisse et sur la page des paramètres dans l’admin). Vous devriez garder les hooks en-dehors de la classe ou utiliser WC-API si vous avez besoin de faire un hook dans les évènements de WordPress à partir de votre classe.


 

Plus d’Exemples

Pour plus d’exemples sur les passerelles de paiement regardez les passerelles principales ou nos passerelles premium sur WooThemes.com.