Aller au contenu

Vendre en dollars canadiens et américains depuis une seule boutique WooCommerce

Apprenez à configurer le multidevise dans WooCommerce pour que les acheteurs canadiens voient des dollars canadiens et les acheteurs américains des dollars américains, depuis une seule boutique. Ce guide couvre les trois approches, la façon dont la passerelle de paiement règle la transaction, ce qui change pour la TPS, la TVQ et la TVH, et les règles de cache qui évitent d'afficher la mauvaise devise à un visiteur.

Ce guide vous montre comment afficher des prix en dollars canadiens pour les acheteurs au Canada et en dollars américains pour ceux aux États-Unis, depuis une seule boutique WooCommerce. Il s’adresse aux propriétaires de boutique et aux personnes qui opèrent l’hébergement derrière elles. WooCommerce conserve chaque prix dans une seule devise, appelée la devise de la boutique, alors une deuxième devise est toujours quelque chose que vous ajoutez par-dessus. Il existe trois façons honnêtes de le faire. Une extension de sélecteur de devise convertit les prix au moment de l’affichage. Un deuxième prix saisi à la main fixe chaque montant vous-même. Sinon, deux boutiques séparées gardent les marchés à part. À la fin, vous en aurez choisi une, et vous aurez une commande qui prouve que votre cache ne sert pas la page canadienne à un visiteur américain.

Ce que vous allez accomplir

  • Choisir entre un sélecteur, des prix fixes par devise et des boutiques séparées, à l’aide d’un court arbre de décision.
  • Afficher une deuxième devise sur une seule boutique, sans dupliquer le catalogue.
  • Savoir dans quelle devise la passerelle facture la carte, et quelle devise arrive dans votre compte bancaire.
  • Garder des lignes de taxes canadiennes justes et une seule devise de référence pour la comptabilité.
  • État final : une commande curl affiche le prix canadien à une requête CAD et le prix américain à une requête USD, depuis une page mise en cache.

Prérequis

  • WooCommerce 8.x ou plus récent sur WordPress 6.4 ou plus récent. Ces réglages et ces filtres sont stables depuis de nombreuses versions.
  • Un compte administrateur et une copie de préproduction. Un changement de devise touche tous les prix de la boutique, alors ne testez pas sur la boutique en ligne.
  • Un accès SSH et WP-CLI, l’outil WordPress en ligne de commande. Les écrans d’administration fonctionnent, mais les commandes vous laissent quelque chose de reproductible.
  • Votre passerelle de paiement en mode test, et une réponse écrite sur les devises que votre compte marchand accepte. Un compte marchand est le compte dans lequel votre processeur de paiement dépose les fonds.
  • La liste de tous les caches placés devant le site, en général un cache de pages sur le serveur (LiteSpeed, le cache FastCGI de Nginx ou Varnish) plus un RDC. Un RDC, ou réseau de diffusion de contenu, est le réseau de serveurs de périphérie qui répond aux visiteurs depuis un endroit proche d’eux.
  • La réponse écrite de votre comptable sur la devise dans laquelle vous produisez vos états. Cet article n’est pas un avis fiscal.

Comment ça fonctionne

Une option, woocommerce_currency, contient la devise de la boutique. Chaque prix de produit dans la base de données est un nombre dans cette devise, sans code de devise attaché. Quand WooCommerce affiche un prix, il demande à un filtre, nommé lui aussi woocommerce_currency, quelle devise utiliser, puis formate le nombre stocké avec vos réglages de décimales et de symbole.

Une extension de sélecteur de devise travaille à l’intérieur de ces deux faits. Elle mémorise la devise choisie par le visiteur, en général dans un témoin de navigateur, puis se greffe aux filtres d’affichage et multiplie chaque prix stocké par un taux de change. Rien ne change dans la base de données. Ce qui change, c’est le nombre sur la page et, au paiement, la devise inscrite sur la commande. Chaque commande enregistre sa propre devise, alors une commande en dollars américains le reste pour toujours.

Chemin de la requête montrant un témoin de visiteur qui traverse un cache de périphérie et un cache de pages jusqu'à WordPress, puis une rangée de règlement montrant le total du panier, la charge de la passerelle et le dépôt bancaire

Ce témoin est l’endroit où la question cesse d’être une affaire d’extension pour devenir une affaire d’hébergement. Un cache de pages entières garde du HTML fini et le retrouve par URL. Deux visiteurs qui demandent la même fiche produit reçoivent la même copie stockée, alors la devise du premier visiteur est servie à tout le monde jusqu’à son expiration. La solution est de faire de la devise une partie de ce que le cache stocke, ce que les caches appellent faire varier la clé de cache. Vous ajoutez le témoin de devise à cette clé, ou vous cessez de mettre en cache les pages des visiteurs qui ont changé de devise.

Le règlement est un mécanisme distinct. Le nombre dans le panier est une conversion d’affichage. La passerelle facture la carte dans la devise que votre intégration envoie, et elle ne peut le faire que si votre compte marchand accepte cette devise. Votre banque reçoit ensuite cette devise, si vous détenez un compte dans celle-ci. Sinon, elle reçoit des dollars canadiens, convertis par la passerelle à son propre taux et moins ses frais. Le taux affiché par votre boutique et celui utilisé par la passerelle ne sont jamais le même nombre.

Étapes

  1. Notez la devise de la boutique et n’y touchez plus. Toutes les approches ci-dessous supposent que le dollar canadien reste la base.

    wp option get woocommerce_currency
    wp option get woocommerce_price_num_decimals
    wp option get woocommerce_currency_pos
    CAD
    2
    left

    Si la première ligne affiche autre chose que CAD, trouvez pourquoi avant de continuer. Changer cette option ne convertit rien ; elle réétiquette tous les prix stockés.

  2. Choisissez l’approche avant d’installer quoi que ce soit. Parcourez l’arbre ci-dessous une fois avec la personne responsable des prix.

    Arbre de décision demandant si les commandes étrangères comptent vraiment, si chaque prix doit être un chiffre rond, et si les deux marchés ont besoin de catalogues différents

    Un sélecteur convient à un seul catalogue dont les prix peuvent être de l’arithmétique. Des prix fixes par devise conviennent à une boutique où le prix américain est une décision marketing plutôt qu’une conversion. Deux boutiques conviennent à deux entreprises différentes qui partagent un propriétaire. Une mise en garde sur la voie du sélecteur. Convertir les prix produit par produit ajoute du travail à la base de données sur les pages de catalogue. L’article sur les pages boutique et catalogue lentes dans WooCommerce explique comment isoler cela.

  3. Confirmez par écrit les devises que votre compte marchand accepte. Demandez-le à la passerelle, pas à l’extension. Un compte Stripe canadien peut normalement facturer en dollars américains, tandis que certaines passerelles de banques canadiennes n’acceptent que le dollar canadien et refusent le reste. Gardez la réponse. Les pannes du côté de la passerelle sont les plus difficiles à diagnostiquer depuis WordPress, et le guide de dépannage WooCommerce Stripe couvre la piste de journaux dont vous aurez besoin.

  4. Installez le sélecteur en préproduction et choisissez la source du taux. Chaque sélecteur offre un taux manuel que vous saisissez vous-même et un flux automatique qui récupère un taux selon un horaire. Utilisez le flux avec un rafraîchissement quotidien, parce qu’un taux qui bouge en plein paiement crée des billets de support. Ajoutez ensuite une marge par-dessus le taux récupéré, pour absorber le mouvement entre deux rafraîchissements et l’écart de conversion de la passerelle. Voici comment la dériver. Prenez le plus grand écart du taux dollar canadien vers dollar américain des douze derniers mois dans les taux publiés par la Banque du Canada, divisez-le par deux, et utilisez ce chiffre. Pour la plupart des catalogues, il tombe entre deux et trois pour cent.

  5. Réglez l’arrondi pour que les prix convertis soient lisibles. Une conversion brute donne des montants que personne n’afficherait en magasin. Chaque sélecteur sait arrondir le résultat converti. La règle qui fonctionne est d’arrondir à l’unité supérieure, puis de retrancher un cent. Gardez le même nombre de décimales pour les deux devises :

    wp option get woocommerce_price_num_decimals
    2

    Laissez la valeur à 2. Mélanger 0 pour une devise et 2 pour une autre produit des totaux qui ne se réconcilieront pas avec les registres de la passerelle.

  6. Trouvez le nom du témoin que pose le sélecteur. Il vous faut le nom exact avant de toucher au moindre cache. Chargez la vitrine avec la devise changée et lisez le fichier de témoins :

    curl -s -c /tmp/wc.jar 'https://staging.example.com/?currency=USD' -o /dev/null
    grep -v '^#' /tmp/wc.jar
    staging.example.com  FALSE  /  FALSE  0  wcml_currency  USD

    Le nom dans l’avant-dernière colonne est celui que vous utiliserez partout ensuite. Remplacez-le à la place de <switcher-cookie> dans les commandes qui suivent. Si le sélecteur n’accepte pas d’argument d’URL, cliquez dessus dans un navigateur et copiez le nom du témoin depuis l’onglet Stockage des outils de développement.

  7. Faites varier le cache de pages d’origine sur ce témoin. Le mécanisme diffère selon le serveur. Dans tous les cas, la valeur du témoin devient une partie de la clé de cache. Sur LiteSpeed, ajoutez le nom du témoin sous LiteSpeed Cache → Cache → Advanced → Vary Cookies, un par ligne. L’article sur les réglages du cache LiteSpeed pour WooCommerce couvre les options autour. Sur Nginx avec le cache FastCGI, ajoutez le témoin à la clé dans le bloc serveur :

    fastcgi_cache_key "$scheme$request_method$host$request_uri$cookie_wcml_currency";
    nginx -t && systemctl reload nginx
    nginx: configuration file /etc/nginx/nginx.conf test is successful

    Remplacez wcml_currency dans le nom de variable par votre propre nom de témoin, en minuscules et avec les traits d’union changés en traits de soulignement, car c’est ainsi que Nginx expose les témoins.

  8. Traitez le RDC de la même façon, ou tenez-le loin du HTML. Un RDC reproduit le problème une couche plus haut. Deux arrangements fonctionnent. Le premier est une clé de cache personnalisée qui inclut le témoin de devise, ce qui exige un forfait Enterprise chez Cloudflare. Le second fonctionne partout : ajoutez une règle de cache qui contourne le cache pour toute requête portant le témoin de devise. Les visiteurs qui ont changé de devise atteignent alors l’origine, tandis que les nouveaux visiteurs obtiennent encore une réponse depuis la périphérie. Choisissez le second, sauf si vous payez déjà pour le premier.

  9. Réglez la valeur par défaut pour un visiteur qui n’a pas encore choisi. WooCommerce peut deviner le pays d’un visiteur, et il offre un mode conçu pour les sites mis en cache. Dans WooCommerce → Settings → General, réglez Default customer location sur Geolocate (with page caching support). Ce mode ajoute un court argument ?v= aux URL, de sorte que chaque pays détecté obtienne sa propre copie en cache. La géolocalisation exige une clé de licence MaxMind sous WooCommerce → Settings → Integration. Vérifiez :

    wp option get woocommerce_default_customer_address
    geolocation_ajax
  10. Laissez la table de taxes tranquille et vérifiez ce qu’elle produit. WooCommerce calcule la taxe à partir de votre table de taux appliquée au montant de la commande. La taxe de vente canadienne est due sur la valeur en dollars canadiens de la fourniture. La taxe sur les produits et services (TPS), la taxe de vente harmonisée (TVH) et la taxe de vente du Québec (TVQ) ne changent pas parce qu’un visiteur lit le prix en dollars américains. Construisez la table comme l’explique les taux de taxe WooCommerce pour une boutique canadienne, puis passez une commande test dans chaque devise et lisez les lignes de taxes sur la commande. La devise dans laquelle vous produisez vos états est une question pour votre comptable.

Vérifier que ça fonctionne

Passez deux commandes test en préproduction avec la passerelle en mode test, une par devise, et confirmez que chaque écran de commande affiche la devise attendue. Prouvez ensuite le cache. Demandez deux fois la même fiche produit, une fois avec chaque valeur de témoin, et comparez le premier prix dans le HTML :

for cur in CAD USD; do
  printf '%s -> ' "$cur"
  curl -s -H "Cookie: <switcher-cookie>=$cur" \
    https://staging.example.com/product/sample-product/ \
    | sed 's/>/>\n/g' | grep -m1 -oE '^[0-9][0-9,]*\.[0-9]{2}'
done
CAD -> 120.00
USD -> 88.00

Deux nombres différents veulent dire que le cache varie. Deux nombres identiques veulent dire qu’il ne varie pas, et que la première requête a préparé une copie que la seconde a réutilisée. Cette commande lit le premier montant décimal du code source, qui est le prix du produit sur un gabarit WooCommerce standard. Si votre thème affiche un autre nombre d’abord, enregistrez la page avec curl -s ... -o /tmp/page.html et lisez l’élément de prix directement.

Relancez la paire une deuxième fois pour confirmer que les deux réponses survivent à une réponse servie depuis le cache, et lisez les en-têtes de cache au passage :

curl -sI -H "Cookie: <switcher-cookie>=USD" \
  https://staging.example.com/product/sample-product/ \
  | grep -iE 'x-litespeed-cache|cf-cache-status|x-cache|^vary'
x-litespeed-cache: hit
cf-cache-status: DYNAMIC

Dépannage

Un visiteur voit les prix de l’autre pays. C’est la clé de cache, chaque fois. Reproduisez le cas avec la paire de commandes curl ci-dessus, puis travaillez vers l’extérieur. Videz le cache d’origine et refaites le test ; si le site se comporte bien ensuite, c’est le RDC qui garde encore une seule copie. Les pages mises en cache sont celles servies aux visiteurs déconnectés, alors tester en étant connecté comme administrateur masque complètement le défaut.

La passerelle refuse toutes les commandes dans la deuxième devise. Le compte marchand n’accepte pas cette devise. La boutique enverra une charge en dollars américains que le processeur rejette, et la commande reste en échec avec un message de la passerelle dans les notes. Lisez la note, puis ouvrez un billet auprès de la passerelle. Aucun réglage WordPress ne corrige cela.

Les lignes de taxes semblent fausses sur les commandes étrangères. Vérifiez si vos lignes de taux correspondent bien au pays. Vérifiez ensuite si le sélecteur convertit la ligne de taxe autant que la ligne d’article. La taxe est due sur le montant en dollars canadiens de la fourniture, alors un total converti devrait toujours ramener à la même taxe due. Si la commande enregistre un total dont la ligne de taxe ne peut pas découler, refaites la table de taux avant de blâmer le sélecteur.

Les prix convertis sortent en longs nombres laids. La règle d’arrondi de l’étape 5 n’a pas été appliquée, ou elle l’a été sur le prix de base au lieu du résultat converti. Arrondissez après la conversion, jamais avant, et testez un produit dont le prix de base se termine par un neuf, car c’est là que le défaut se voit en premier.

Un remboursement est enregistré dans la mauvaise devise. Remboursez depuis l’écran de commande WooCommerce, pas depuis le tableau de bord de la passerelle. La commande porte sa propre devise, alors un remboursement fait par WooCommerce part dans cette devise et s’inscrit sur la commande. Un remboursement émis dans le tableau de bord de la passerelle laisse la commande au montant complet, et vos rapports ne concorderont plus avec vos dépôts. Les remboursements partiels fonctionnent pareil, et le montant que vous saisissez est dans la devise de la commande.

Quand ce n’est pas la bonne approche

Si les commandes étrangères se comptent sur les doigts d’une main chaque mois, rien de tout cela ne vaut l’entretien. Affichez une seule devise, dites-le clairement sur la fiche produit, et laissez l’émetteur de la carte faire la conversion. Vous gardez un cache plus simple, des livres plus simples et des remboursements plus simples.

Les deux marchés peuvent différer par ce que vous avez le droit de vendre, par l’étiquetage exigé ou par ce que le reçu doit dire. Dans ce cas, deux boutiques sont plus faciles qu’une seule boutique pleine de conditions. C’est aussi vrai quand les catalogues se recoupent à peine. Un multisite WordPress vous donne des identifiants communs et des boutiques séparées, au prix de tout gérer en double.

Les réglages et les filtres nommés ici sont documentés dans la documentation WooCommerce et dans les ressources pour développeurs WooCommerce. Confirmez chaque décision fiscale et comptable avec votre comptable avant la mise en ligne.

Un WordPress qui rapporte vraiment mérite un opérateur — Stack Harbor opère cette pile sous WordPress Entreprise ; réservez une consultation d’infrastructure.