WooCommerce : devise non prise en charge par PayPal, continuer à vendre
L'erreur « devise non prise en charge par PayPal dans WooCommerce » prend plusieurs formes : le bouton PayPal disparaît lorsqu'un visiteur passe à sa devise locale, le paiement échoue avec CURRENCY_NOT_SUPPORTED ou l'erreur 10605, ou PayPal Payments répond 422 UNPROCESSABLE_ENTITY. Dans chaque cas, on a demandé à PayPal d'encaisser dans une devise qu'il n'accepte pas pour votre compte. Un sélecteur de devises peut afficher n'importe quelle devise, mais il ne peut pas modifier ce que PayPal accepte : la solution consiste donc à décider dans quelle devise le paiement parvient à PayPal. Vous trouverez ci-dessous les vérifications à faire en premier, trois façons de continuer à vendre, et l'erreur distincte CANNOT_MIX_CURRENCIES.
Pourquoi PayPal refuse une devise
PayPal travaille avec une liste fixe de devises, plus courte que celle que vous pouvez ajouter à WooCommerce. Certaines devises de cette liste ne sont acceptées que dans leur pays : le MYR, par exemple, n'est accepté que par les comptes PayPal enregistrés en Malaisie. Le fonctionnement d'une devise dépend donc de la devise et du pays du compte qui reçoit le paiement. La liste figure dans codes de devise PayPal, avec des remarques dans devises acceptées par PayPal.
Côté boutique, une commande WooCommerce a une seule devise, et on demande à la passerelle d'encaisser le total de la commande dans cette devise. FOX décide quelle devise est active lors de la création de la commande. Il ne convertit pas le montant en route vers PayPal et n'a aucun réglage du type « afficher le MYR, encaisser en USD » au sein d'une même commande ; la règle générale est expliquée dans afficher les prix en devise locale, encaisser en devise de base. Toute configuration qui fonctionne fait donc en sorte que le paiement lui-même se déroule dans une devise que PayPal accepte.
À vérifier avant de modifier quoi que ce soit
- Le code de devise est un vrai code ISO. PayPal fait correspondre exactement le code à trois lettres :
EUR, et nonEURO. Un code erroné dans la ligne de devise de FOX masque le bouton PayPal pour cette devise. Un code de devise personnalisé ne peut jamais être encaissé par PayPal. Si PayPal échoue même pour l'USD ou l'EUR, videz le champ du code dans la ligne FOX, saisissez-le de nouveau à la main et enregistrez : un code collé peut contenir des caractères invisibles. - L'erreur se produit aussi avec une devise prise en charge. La devise n'est alors pas la cause. Testez déconnecté, avec le cache et l'optimisation JavaScript désactivés ; les pages servies depuis un cache et les scripts retardés sont à l'origine de nombreuses erreurs « de devise », voir le sélecteur de devises bloqué en chargement après l'optimisation JS.
- Aucun filtre qui « ajoute » la devise à PayPal. Du code qui étend
woocommerce_paypal_supported_currenciesfait seulement apparaître le bouton. La commande est tout de même créée dans cette devise et PayPal la refuse toujours à l'étape du paiement. Supprimez ce code. - Un seul plugin définit la devise. Un second module multidevise (dans un plugin d'outils ou un plugin de paiements) change la devise au moment du paiement dans le dos de FOX. FOX affiche un avertissement sur les écrans de réglages de WooCommerce lorsque WooPayments a sa propre option multidevise activée. Conservez-en un seul.
Trois façons de continuer à vendre quand PayPal ne peut pas accepter une devise
1. Proposer PayPal uniquement dans les devises qu'il peut encaisser
Aucun code n'est nécessaire. Dans l'onglet Avancé (Advanced) des réglages de FOX, activez Règles de paiement (Payments rules) et enregistrez ; un onglet Paiements (Payments) apparaît. Dans la ligne de votre passerelle PayPal, sélectionnez les devises que PayPal ne peut pas accepter, avec Comportement des paiements (Payments behavior) réglé sur Masqué (Is hidden) (ou sélectionnez celles qu'il peut accepter avec Affiché (Is shown)). FOX applique la règle sur la page de paiement et sur la page de règlement d'une commande existante. Les visiteurs continuent de voir leur devise locale partout et paient avec une autre passerelle, ou passent eux-mêmes à une devise PayPal. Plus de détails sur les règles dans comment masquer une passerelle de paiement selon la devise.
2. Passer à une devise PayPal sur la page de paiement
Les visiteurs naviguent dans leur propre devise, et lorsqu'ils ouvrent la page de paiement, FOX remplace les devises que PayPal ne peut pas accepter par une devise qu'il accepte. La commande est créée dans cette devise, et PayPal l'accepte donc. Cela exige Plusieurs devises autorisées (Is multiple allowed) = Oui (Yes) dans l'onglet Avancé (Advanced), et Paiement selon les règles GeoIP (Checkout by GeoIP rules) désactivé, car cette option définit la devise de paiement selon le pays et annulerait le changement. Chaque devise cible doit aussi figurer dans la liste des devises de FOX ; set_currency() se rabat sur la devise de base pour un code que la boutique ne possède pas.
/*
* FOX + PayPal: on the checkout page, switch currencies PayPal cannot
* charge to one it can. Child theme functions.php or a code snippets plugin.
*/
function myshop_paypal_currency_map() {
return array(
// currency PayPal cannot charge => currency to charge instead
'AED' => 'USD',
'MAD' => 'EUR',
);
}
function myshop_switch_to_paypal_currency() {
global $WOOCS;
if ( ! is_object( $WOOCS ) ) {
return false;
}
$map = myshop_paypal_currency_map();
if ( ! isset( $map[ $WOOCS->current_currency ] ) ) {
return false;
}
$WOOCS->set_currency( $map[ $WOOCS->current_currency ] );
return true;
}
// Checkout page load; the payment page of an existing order keeps its currency
add_action( 'template_redirect', function () {
if ( ! function_exists( 'is_checkout' ) || ! is_checkout()
|| is_checkout_pay_page() || is_order_received_page() ) {
return;
}
if ( myshop_switch_to_paypal_currency() && WC()->cart ) {
WC()->cart->calculate_totals();
}
}, 1 );
// Checkout refreshes after address or shipping changes, after FOX's own handler
add_action( 'woocommerce_checkout_update_order_review', 'myshop_switch_to_paypal_currency', 10000 );
Connaissez les effets secondaires avant de l'utiliser. Le changement s'applique à toutes les passerelles de la page de paiement, pas seulement à PayPal. Le client voit les totaux changer de devise à l'ouverture de la page de paiement : indiquez-le dans une ligne de texte sur cette page. Et le visiteur reste dans la nouvelle devise après avoir quitté la page de paiement ; le snippet plus long de l'article sur l'affichage des prix locaux avec encaissement en devise de base, lié plus haut, rétablit la devise précédente si vous en avez besoin.
3. Tout encaisser dans une devise de base prise en charge par PayPal
Si la devise de base de votre WooCommerce est une devise que PayPal accepte, réglez Plusieurs devises autorisées (Is multiple allowed) sur Non (No). Les visiteurs voient des prix convertis, et la page de paiement, la commande et le règlement se font en devise de base. Afficher le montant approximatif (Show approximate amount) dans l'onglet Options ajoute l'équivalent local, dans la devise du pays du visiteur selon les règles GeoIP, aux totaux du panier et de la page de paiement. Si la devise de base ne figure pas elle-même dans la liste de PayPal, cette option ne peut pas fonctionner : utilisez l'option 2 avec Oui (Yes), ou l'option 1.
Particularités de PayPal Payments
- Les boutons conservent la devise du chargement de la page. Le script PayPal est chargé avec la devise active au moment de la construction de la page. Si la devise change ensuite sur la même page, par exemple selon le pays lors du paiement, les boutons fonctionnent toujours avec l'ancienne et échouent avec une erreur du type « Expected currency from order api call to be USD, got EUR ». Évitez de changer la devise sur la page de paiement une fois celle-ci chargée, ou assurez-vous que la page se recharge.
- Avec Plusieurs devises autorisées (Is multiple allowed) = Non (No), FOX transmet au script PayPal Payments la devise de base, de sorte que les boutons correspondent à une page de paiement en devise de base.
- Les boutons hors de la page de paiement. Les boutons intelligents sur les pages produit, le panier et le mini-panier créent la commande PayPal avant que le client n'atteigne la page de paiement. Le changement de devise de l'option 2 ne s'applique pas à eux : ils envoient donc toujours la devise non prise en charge, et avec l'option 3 ils provoquent l'erreur de devises mélangées décrite plus bas. Avec l'une ou l'autre option, n'affichez les boutons PayPal que sur la page de paiement, dans les réglages d'emplacement des boutons de PayPal Payments.
- Pay Later n'est proposé que pour certains pays et leurs devises. Avec d'autres devises, le script de PayPal signale des erreurs dans la console du navigateur ; désactivez les messages Pay Later si la plupart de vos clients paient dans d'autres devises.
- Les remboursements depuis l'écran de la commande se font dans la devise de la commande, et FOX reste à l'écart de cette requête. L'exception est une boutique où l'extension Professional de PDF Invoices & Packing Slips, Smart Coupons ou Advanced Coupons est active ; dans ce cas,
add_filter( 'woocs_disable_backend_refund_calculation', '__return_true' );tient FOX à l'écart. FOX lit ce filtre pendant son chargement, avant le thème : placez donc la ligne dans un plugin must-use (un fichier PHP danswp-content/mu-pluginscommençant par<?php), et non dansfunctions.php.
CANNOT_MIX_CURRENCIES : les commandes échouent après un changement de devise
PayPal Payments signale 422 UNPROCESSABLE_ENTITY avec CANNOT_MIX_CURRENCIES lorsqu'un même paiement est construit à partir de deux devises : la commande PayPal a été créée dans l'une, puis la boutique envoie des montants ou confirme le paiement dans une autre. Cela n'apparaît généralement que pour les clients qui ont changé de devise, et seulement par moments. Trois causes l'expliquent.
Les pages en cache portent une autre devise
Une page avec des boutons PayPal charge le script PayPal avec la devise de cette page. Si la page provient d'un cache de page, il s'agit de la devise de la première personne dont la page a été mise en cache, alors que le panier du visiteur est dans sa propre devise. Excluez de tous les caches la page de paiement, le panier et toute page produit qui affiche des boutons PayPal, et gardez la gestion du cache de FOX activée pour le reste de la boutique, comme décrit dans pourquoi un sélecteur de devises et un cache de page se battent.
La requête de paiement ressemble à un nouveau visiteur
Les boutons PayPal communiquent avec votre site par des requêtes en arrière-plan. FOX retrouve la devise du visiteur dans son stockage : un cookie avec PHP Session et FOX Session, l'adresse IP avec Transient, ou une clé du navigateur avec Transient et l'option de cache activée. Une requête qui arrive sans cette identité est traitée comme une première visite : la devise d'accueil ou les règles GeoIP décident alors de sa devise, et la commande PayPal peut être construite dans une devise que le panier n'utilise pas. Cela se produit lorsque :
- la clé du navigateur n'est pas jointe parce qu'un optimiseur retarde le front.js de FOX, qui ajoute la clé aux requêtes des boutons PayPal (corrigez les exclusions à l'aide de l'article lié dans les vérifications ci-dessus) ;
- l'adresse IP du visiteur change entre le chargement de la page et le paiement, ce que font les réseaux mobiles, alors que le Stockage de la devise (Currency storage) est Transient sans l'option de cache. FOX Session conserve plutôt la devise dans le cookie du visiteur.
Plusieurs devises autorisées (Is multiple allowed) = Non (No) avec des boutons hors de la page de paiement
Dans ce mode, le script PayPal reçoit la devise de base, alors qu'un bouton sur une page produit ou dans le panier construit la commande à partir d'un panier affiché dans la devise du visiteur. N'affichez les boutons que sur la page de paiement, ou passez à Oui (Yes) et fixez la devise de paiement avec l'option 2.
Checklist
- Chaque code de devise dans FOX est un code ISO valide, saisi de nouveau en cas de doute.
- Votre compte PayPal peut recevoir chaque devise qui parvient à PayPal, y compris les devises réservées à un pays.
- Aucun code n'ajoute de devises via
woocommerce_paypal_supported_currencies, et aucun second module multidevise n'est actif. - L'une des trois configurations est choisie : Règles de paiement (Payments rules), une devise de paiement forcée, ou une devise de base prise en charge.
- Page de paiement, panier et pages avec boutons PayPal exclus du cache de page ; scripts de FOX non retardés.
Si PayPal refuse toujours une devise qu'il prend en charge pour votre compte, ouvrez un sujet sur le forum de support de FOX avec l'erreur exacte de PayPal, vos réglages Plusieurs devises autorisées (Is multiple allowed) et Stockage de la devise (Currency storage) et le plugin PayPal que vous utilisez, et nous l'examinerons.