FOX - WooCommerce Currency Switcher Professional

Devise de paiement WooCommerce selon le pays du client, pas l'adresse IP

Définir la devise de paiement WooCommerce selon le pays du client signifie une chose : un client qui saisit une adresse de facturation suisse paie en francs suisses, quelle que soit la devise dans laquelle il a navigué et d'où provient sa connexion internet. FOX ne le fait pas de lui-même à partir de l'adresse. Il propose une option intégrée qui utilise le pays de l'adresse IP du visiteur, et le cas de l'adresse demande un court snippet qui réutilise vos règles GeoIP. Ce guide explique les deux, le piège facturation contre livraison à l'origine de la plupart des snippets défaillants, et les limites à connaître avant de vous y fier.

Pays de l'IP ou pays de l'adresse

Deux pays différents entrent en jeu, et ils diffèrent souvent pour les voyageurs, les utilisateurs de VPN, les personnes proches d'une frontière et quiconque commande un cadeau pour quelqu'un à l'étranger.

PaysD'où il vientCe que FOX en fait
Pays de l'IPgéolocalisation WooCommerce, à la première page vueles règles GeoIP choisissent la première devise ; l'option Paiement selon les règles GeoIP (Checkout by GeoIP rules) peut l'imposer à la page de paiement
Pays de facturationsaisi ou choisi par le client à la page de paiement, enregistré dans son compterien par défaut ; le snippet ci-dessous l'utilise
Pays de livraisonuniquement lorsque le client coche Expédier à une adresse différente ? (Ship to a different address?)rien par défaut ; facultatif dans le snippet

La façon dont le pays de l'IP est détecté et associé à une devise est décrite dans changer automatiquement la devise selon le pays. Cet article traite du moment du paiement.

Avant de commencer

  • Plusieurs devises autorisées (Is multiple allowed) = Oui (Yes) dans l'onglet Avancé (Advanced) de WooCommerce → Réglages → Devise (Currency). Avec Non (No), FOX remet la page de paiement dans la devise de base, et aucune logique de pays ne peut y changer quoi que ce soit. Les compromis des deux réglages sont expliqués dans afficher les prix en devise locale, facturer en devise de base.
  • Des pays attribués dans l'onglet GeoIP. Les deux méthodes ci-dessous lisent les mêmes listes : la Suisse dans la liste CHF, les pays de la zone euro dans la liste EUR, et ainsi de suite. Une seule table garantit que la première visite et le paiement concordent toujours.
  • Des passerelles de paiement qui acceptent chaque devise. Utilisez l'onglet Paiements (Payments) pour proposer chaque passerelle uniquement dans les devises qu'elle peut encaisser ; voir comment masquer une passerelle de paiement selon la devise.

L'option intégrée : Paiement selon les règles GeoIP

Paiement selon les règles GeoIP (Checkout by GeoIP rules) se trouve dans l'onglet Avancé (Advanced). Elle n'apparaît que lorsque Plusieurs devises autorisées (Is multiple allowed) est sur Oui (Yes) et que Règles de prix fixes individuelles pour chaque produit (Individual fixed prices rules for each product) est activé, car elle est destinée aux boutiques qui fixent leur propre prix par devise : sans elle, un client pourrait choisir la devise dans laquelle votre prix fixe est le plus bas.

Lorsqu'elle est activée, FOX bascule la page de paiement et la page de règlement d'une commande, ainsi que chaque actualisation du récapitulatif de commande, dans la devise que l'onglet GeoIP attribue au pays de l'IP du visiteur. Les visiteurs de pays sans règle gardent la devise qu'ils ont sélectionnée. Après chaque vérification, FOX déclenche l'action woocs_force_pay_bygeoip_rules avec le pays, la devise GeoIP (vide pour les pays non listés) et la devise courante : c'est l'endroit prévu pour votre propre solution de repli.

L'option ne sait rien de l'adresse. Un résident suisse qui commande depuis un hôtel en Italie paie en euros. Si c'est un problème pour votre boutique, utilisez plutôt le snippet et désactivez cette option.

Devise de paiement selon le pays de facturation du client

Sur la page de paiement classique, WooCommerce actualise le récapitulatif de commande en AJAX chaque fois que le client modifie le pays, la région ou le code postal, et déclenche l'action woocommerce_checkout_update_order_review avant de recalculer les totaux. Changer la devise à ce moment-là fait apparaître immédiatement les totaux, la livraison et les moyens de paiement dans la nouvelle devise.

/*
 * FOX: the checkout currency follows the country the customer enters.
 * Country-to-currency map: the lists in the FOX GeoIP tab.
 * Needs "Is multiple allowed" = Yes. Classic (shortcode) checkout only.
 * Child theme functions.php or a code snippets plugin.
 */
add_action('woocommerce_checkout_update_order_review', function ($post_data) {
    global $WOOCS;
    if (empty($WOOCS)) {
        return;
    }
    parse_str((string) $post_data, $data);

    // true: use the shipping country when "Ship to a different address?" is ticked
    $use_delivery_country = false;

    $country = isset($data['billing_country']) ? wc_clean($data['billing_country']) : '';
    if ($use_delivery_country && !empty($data['ship_to_different_address']) && !empty($data['shipping_country'])) {
        $country = wc_clean($data['shipping_country']);
    }

    $currency = $WOOCS->get_currency_by_country($country);

    // Optional: countries without a GeoIP rule pay in the base currency
    // if (!$currency) { $currency = $WOOCS->default_currency; }

    if ($currency && $currency !== $WOOCS->current_currency) {
        $WOOCS->set_currency($currency);
    }
}, 10000);

$WOOCS->get_currency_by_country() renvoie la devise dont la liste GeoIP contient le pays, ou une chaîne vide. $WOOCS->set_currency() enregistre la devise pour le visiteur, de sorte que la commande est créée dans cette devise lorsque le client la passe. La priorité 10000 exécute le code après le gestionnaire propre de FOX sur la même action. Tel qu'il est écrit, les clients de pays non listés gardent la devise dans laquelle ils ont navigué ; décommentez la ligne de repli pour qu'ils paient dans la devise de base. Si vous préférez garder la liste des pays dans le code plutôt que dans l'onglet GeoIP, changer de devise selon l'adresse de facturation plutôt que la géolocalisation propose des versions avec une table écrite en dur.

Pourquoi billing_country et non shipping_country

Les anciens snippets de nos FAQ sur le changement de devise selon le pays de livraison lisent shipping_country, et le signalement le plus fréquent à leur sujet est « la devise est figée ». La raison tient à ce que WooCommerce envoie. À chaque actualisation, il poste tout le formulaire de paiement, y compris les champs de livraison qui restent masqués tant que Expédier à une adresse différente ? (Ship to a different address?) est décoché. Le pays de livraison masqué contient ce qui était prérempli, en général le pays géolocalisé ou enregistré, et il ne change pas quand le client modifie l'adresse de facturation. La devise suit donc un champ que le client ne voit jamais.

Le pays de facturation est toujours visible et toujours à jour. La case cochée arrive sous le nom ship_to_different_address, et ce n'est qu'alors que le pays de livraison est le véritable choix du client, ce que vérifie précisément $use_delivery_country = true. Si WooCommerce → Réglages → Expédition est réglé pour forcer la livraison à l'adresse de facturation, il n'y a aucun champ de livraison et le pays de facturation est le seul qui compte.

Quel pays doit décider ? Le pays de facturation correspond à la carte ou au compte qui paie, ce que les prestataires de paiement contrôlent pour la détection de fraude. Le pays de livraison correspond aux douanes, aux droits et aux prix locaux. Choisissez une seule règle et indiquez-la sur la page de paiement.

Restreindre les devises par pays

Le snippet applique déjà la règle là où elle compte : quelle que soit la devise dans laquelle un client a navigué, un pays avec une règle GeoIP paie dans sa propre devise. Pour aussi masquer des devises dans le sélecteur pour les visiteurs d'un pays d'IP donné, afin que les visiteurs espagnols ne voient jamais USD, consultez comment interdire une devise pour un pays. Ce filtre fonctionne avec le pays de l'IP : il complète donc la règle de paiement au lieu de la remplacer.

Limites à connaître

  • Page de paiement classique uniquement. Le snippet fonctionne avec la page de paiement par shortcode [woocommerce_checkout]. Le bloc Paiement (Checkout) met à jour l'adresse via l'API Store de WooCommerce et ne déclenche jamais woocommerce_checkout_update_order_review. Si votre page de paiement affiche le bloc Paiement, remplacez-le par la page de paiement par shortcode pour cette logique.
  • Les boutons de paiement express tels qu'Apple Pay ou Google Pay prennent l'adresse du portefeuille et sautent le formulaire de paiement : la devise reste donc celle qui était active quand le bouton a été pressé.
  • La page du panier : son calculateur de livraison n'exécute pas ce hook ; la devise change lorsque le client arrive à la page de paiement.
  • Ne le combinez pas avec Paiement selon les règles GeoIP (Checkout by GeoIP rules). Cette option bascule la page de paiement dans la devise de l'IP au chargement, le snippet bascule le récapitulatif de commande dans la devise de l'adresse un instant plus tard, et la page affiche brièvement deux devises. Utilisez une seule règle.
  • Les pages du panier et de paiement doivent être exclues de tout cache de page.

Clients connectés : le pays de facturation enregistré sur chaque page

Le snippet de paiement n'agit que sur la page de paiement. Pour une boutique réservée aux membres, ou lorsqu'un client enregistré doit voir sa propre devise dès la première page, lisez le pays de facturation enregistré à chaque affichage de page :

/*
 * FOX: logged-in customers always see the currency of their billing country.
 * Guests are not affected. Child theme functions.php or a code snippets plugin.
 */
add_action('wp_head', function () {
    global $WOOCS;
    if (empty($WOOCS) || !is_user_logged_in() || !function_exists('WC') || !WC()->customer) {
        return;
    }
    $currency = $WOOCS->get_currency_by_country(WC()->customer->get_billing_country());
    if ($currency && $currency !== $WOOCS->current_currency) {
        $WOOCS->set_currency($currency);
    }
}, 1000);

Il s'exécute après que FOX a terminé son propre travail sur la page (priorité 999), et l'emporte donc aussi sur les règles GeoIP de première visite. Les clients enregistrés d'un pays avec une règle GeoIP ne peuvent pas changer de devise tant qu'il est actif ; lorsqu'ils modifient le pays de facturation dans leur compte ou à la page de paiement, la page suivante suit le nouveau pays.

Le tester

  1. Mettez un produit dans le panier et ouvrez la page de paiement dans une fenêtre de navigation privée.
  2. Changez le pays de facturation pour un pays de chaque liste GeoIP et observez les totaux changer de devise après chaque actualisation.
  3. Si vous utilisez la variante de livraison, cochez Expédier à une adresse différente ? (Ship to a different address?), choisissez un autre pays, puis décochez-la de nouveau : la devise doit revenir à celle du pays de facturation.
  4. Passez une commande de test avec la passerelle en mode test et vérifiez la devise de la commande sur l'écran de la commande et dans l'e-mail.

Si les totaux ne changent pas, vérifiez que la page de paiement utilise le shortcode, que Plusieurs devises autorisées (Is multiple allowed) est sur Oui (Yes), que le pays figure dans une liste GeoIP, et qu'aucun autre snippet n'appelle $WOOCS->set_currency() sur la page de paiement. Si cela échoue toujours avec un thème par défaut et seulement WooCommerce et FOX actifs, ouvrez un sujet sur le forum de support de FOX avec le code que vous utilisez et un lien vers la page de paiement, et nous l'examinerons.