Correction d’une anomalie de validation du panier sur WooCommerce

Rédacteur : LaRedac
3 avril 2025

Un problème détecté par le service bancaire

Lors d’un contrôle routinier, le service e-Transactions a détecté une anomalie sur un site WooCommerce. Plusieurs paiements étaient refusés en raison d’une erreur dans la donnée TotalQuantity de la variable PBX_SHOPPINGCART. Cette variable, qui représente le nombre total d’articles dans le panier, doit contenir une valeur comprise entre 1 et 99.

Jusqu’au 22 mai 2024, cette donnée n’était pas systématiquement contrôlée, mais avec l’application des nouvelles normes DSP2/3DSv2, des contrôles obligatoires ont été mis en place. Cela a nécessité une correction du code du site pour garantir la conformité et éviter les rejets de paiement.

Première approche : ajout d’une validation dans WooCommerce

La première étape a été d’ajouter une fonction de validation du nombre total d’articles dans le panier. Cette fonction devait s’assurer que le total était compris entre 1 et 99, et afficher un message d’erreur si ce n’était pas le cas. Voici comment cette validation a été implémentée :

protected function validate_total_quantity() {
    $total_quantity = array_sum( wp_list_pluck( $this->items, 'quantity' ) );

    if ( $total_quantity < 1 || $total_quantity > 99 ) {
        wc_add_notice( __( 'Le nombre total d\'articles doit être compris entre 1 et 99.', 'woocommerce' ), 'error' );
        return false;
    }
    return true;
}

L’objectif était de stopper le processus de validation du paiement dès que cette règle était enfreinte.

Intégration de la validation dans le calcul des totaux

Une fois la validation mise en place, il a fallu l’intégrer dans la méthode de calcul des totaux du panier. L’idée était de vérifier la quantité avant de poursuivre les autres calculs, évitant ainsi de générer un total incorrect. Une première tentative a consisté à modifier la fonction calculate :

protected function calculate() {
    if ( ! $this->validate_total_quantity() ) {
        return; // Arrête le calcul si la validation échoue
    }
    $this->calculate_item_totals();
    $this->calculate_shipping_totals();
    $this->calculate_fee_totals();
    $this->calculate_totals();
}

Cependant, cette solution a posé problème. En interrompant le calcul des totaux trop tôt, le panier n’était plus mis à jour correctement, affichant un total à zéro et empêchant toute validation de commande.

Résolution du problème d’affichage du total à zéro

Après analyse, il est apparu que la validation de la quantité était exécutée avant que les totaux ne soient mis à jour. Cela entraînait une incohérence dans les calculs. La solution retenue a été d’intégrer cette validation directement dans calculate_totals au bon moment :

protected function calculate_totals() {
    // Vérification de la quantité avant de calculer les totaux
    if ( ! $this->validate_total_quantity() ) {
        return;
    }
    
    // Calcul du total principal
    $this->set_total( 'total', NumberUtil::round( 
        $this->get_total( 'items_total', true ) + 
        $this->get_total( 'fees_total', true ) + 
        $this->get_total( 'shipping_total', true ) + 
        array_sum( $this->get_merged_taxes( true ) ), 
        0 
    ));

    $items_tax = array_sum( $this->get_merged_taxes( false, array( 'items' ) ) );
    $shipping_and_fee_taxes = NumberUtil::round(
        array_sum( $this->get_merged_taxes( false, array( 'fees', 'shipping' ) ) ),
        wc_get_price_decimals()
    );

    $this->cart->set_total_tax( $items_tax + $shipping_and_fee_taxes );

    if ( has_action( 'woocommerce_calculate_totals' ) ) {
        do_action( 'woocommerce_calculate_totals', $this->cart );
    }

    $this->cart->set_total( max( 0, apply_filters( 'woocommerce_calculated_total', $this->get_total( 'total' ), $this->cart ) ) );
}

Tests et validation finale

Une fois ces modifications appliquées, des tests ont été réalisés :

  • Un panier vide affichait bien un message d’erreur empêchant la commande.
  • Une quantité supérieure à 99 entraînait aussi une erreur.
  • Une quantité entre 1 et 99 permettait la validation correcte du paiement.

Cette correction a permis de rendre le système conforme aux nouvelles exigences bancaires, garantissant ainsi que les paiements ne soient plus refusés pour ce motif.

Conclusion

Corriger cette anomalie a nécessité plusieurs ajustements et tests pour s’assurer que la validation de la quantité ne perturbait pas le calcul du panier. WooCommerce est une plateforme flexible, mais toute modification dans son fonctionnement doit être soigneusement intégrée pour éviter des effets indésirables.

Si vous rencontrez des problèmes similaires sur votre boutique en ligne ou avez besoin d’aide pour d’autres optimisations WooCommerce, n’hésitez pas à nous contacter.

0 commentaires

Soumettre un commentaire

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

Voir aussi…

Merci, votre message a bien été envoyé

Nous avons bien reçu votre demande. Nous revenons vers vous au plus vite avec une réponse claire et des premières orientations.

Si votre demande est urgente

contactez-nous par message sur WhatsApp.

WhatsApp