[WooCommerce] Commande PayPal invalide si quantité avec décimales

WooCommerce, WordPress
  • Accueil
  • Blog
  • [WooCommerce] Commande PayPal invalide si quantité avec décimales

Le bon déroulement du process de paiement sur votre boutique en ligne est primordial. C’est un des éléments qui va renforcer ou enfoncer la confiance de vos clients envers vous. C’est aussi une énorme perte de temps si vous avez un bug qui génère derrière du SAV.

 

PayPal : un bon moyen de paiement ?

La réponse est assez simple : testez !
Je ne le répète pas assez mais chaque e-commerce est différent avec son marché, ses produits et surtout ses clients ! Chaque cible selon le marché a des attentes différentes. Les plus vieux vont préférer la CB classique protégée derrière un logo de banque dont la réputation n’est plus à faire. Les plus jeunes vont en revanche opter pour des portefeuilles en ligne type PayPlug, PayPal ou Stripe pour lesquels il n’y a plus besoin de sortir sa carte bancaire justement.
Je vous conseille donc d’installer PayPal / PayPlug / Stripe – vous pouvez consulter le comparatif PayPal VS PayPlug – et de voir sur quelques mois les tendances d’utilisation des différentes méthode de paiement. Si 20% de vos clients règlent leurs achats via PayPal alors je vous invite fortement à le mettre en avant dans vos éléments de rassurance.
Ensuite, vous allez prendre en compte l’installation technique. Aujourd’hui, la quasi totalité des moyens de paiement s’installent en quelques clics sans avoir recours à un développeur sénior !
Enfin, vous allez aussi étudier si vos produits peuvent être vendus via ce moyen de paiement. A ce moment là, mon téléphone sonne :
– [cliente] Bonjour, j’ai une boutique sous WooCommerce et les commandes qui règlent via PayPal n’ont pas de commande valide dans l’administration ensuite. Pouvez-vous m’aider ?
– [moi] Bonjour, que vendez-vous sur votre boutique ?
– [cliente] Je vend des tissus au mètre dont les quantités sont avec des décimales.
– [moi] Hum, le souci doit venir de là. Je vais regarder et je reviens vers vous.
Cette discussion nous amène vers le problème de quantité avec décimales qui produit une erreur de paiement avec PayPal.
 

Comment régler l’erreur de paiement PayPal si quantité avec décimales ?

Après la discussion avec ma cliente, je me souviens alors d’autres clients ont déjà eu des problèmes similaires sous PrestaShop. J’ai donc pris 5 minutes pour regarder la documentation technique de PayPal et voici le passage qui nous intéresse :

Quantity (optional)
Number of items. If profile-based shipping rates are configured with a basis of quantity, the sum of quantity values is used to calculate the shipping charges for the payment. PayPal appends a sequence number to uniquely identify the item in the PayPal Shopping Cart. For example, quantity1quantity2, and so on.
Note: The value for quantity must be a positive integer. Null, zero, or negative numbers are not allowed.

 
En bref, la quantité envoyée à PayPal doit être un nombre entier sans décimale.
Super ça mais comment corriger ce problème de quantités avec décimales sous WooCommerce ?
Et bien, on se remonte les manches et on édite le fichier www/wp-content/plugins/woocommerce/includes/gateways/paypal/includes/class-wc-gateway-paypal-request.php et on cherche la fonction add_line_item pour la modifier comme suit :

/**
* Add PayPal Line Item.
*
* @param string $item_name Item name.
* @param int $quantity Item quantity.
* @param float $amount Amount.
* @param string $item_number Item number.
*/
protected function add_line_item( $item_name, $quantity = 1, $amount = 0.0, $item_number = '' ) {
$index = ( count( $this->line_items ) / 4 ) + 1;

// CORRECTION BUG PAYPAL DECIMALES - ARNAUD MERIGEAU - https://www.arnaud-merigeau.fr
if(is_int($quantity)){
$item = apply_filters(
'woocommerce_paypal_line_item', array(
'item_name' => html_entity_decode( wc_trim_string( $item_name ? $item_name : __( 'Item', 'woocommerce' ), 127 ), ENT_NOQUOTES, 'UTF-8' ),
'quantity' => (int) $quantity,
'amount' => wc_float_to_string( (float) $amount ),
'item_number' => $item_number,
), $item_name, $quantity, $amount, $item_number
);
}else{
$total_item = $quantity * $amount;
$item = apply_filters(
'woocommerce_paypal_line_item', array(
'item_name' => html_entity_decode( wc_trim_string( $item_name ? $item_name : __( 'Item', 'woocommerce' ), 127 ), ENT_NOQUOTES, 'UTF-8' ),
'quantity' => '1',
'amount' => $total_item,
'item_number' => $item_number,
), $item_name, $quantity, $amount, $item_number
);
}


$this->line_items[ 'item_name_' . $index ] = $this->limit_length( $item['item_name'], 127 );
$this->line_items[ 'quantity_' . $index ] = $item['quantity'];
$this->line_items[ 'amount_' . $index ] = $item['amount'];
$this->line_items[ 'item_number_' . $index ] = $this->limit_length( $item['item_number'], 127 );
}

Remarquez la modification de la ligne 13 à 32 : c’est là que WooCommerce envoie les variables à PayPal pour le paiement.
On ajoute une condition sur la quantité :
  • si c’est un entier, on ne fait rien de particulier
  • si c’est une valeur avec décimales, on remplace cette valeur par “1” et on calcule le prix du produit

Ainsi, PayPal obtient de WooCommerce les valeurs attendues pour un paiement réussi. Enfin, vous avez toujours dans WooCommerce les quantités avec décimales pour vos préparations de commandes.
A bientôt !
 

Laisser un avis

Consultez les autres articles