WooCommerce PayPal: Währung wird nicht unterstützt – so verkaufen Sie weiter
„WooCommerce PayPal Währung wird nicht unterstützt“ tritt in mehreren Formen auf: Der PayPal-Button verschwindet, wenn ein Besucher zu seiner lokalen Währung wechselt, die Zahlung schlägt mit CURRENCY_NOT_SUPPORTED oder dem Fehler 10605 fehl, oder PayPal Payments antwortet mit 422 UNPROCESSABLE_ENTITY. In jedem Fall wurde PayPal aufgefordert, eine Währung abzurechnen, die es für Ihr Konto nicht annimmt. Ein Währungsumrechner kann jede beliebige Währung anzeigen, aber er kann nicht ändern, was PayPal akzeptiert; die Lösung besteht also darin, zu entscheiden, welche Währung bei PayPal ankommt. Nachfolgend die Prüfungen, die Sie zuerst vornehmen sollten, drei Wege, weiter zu verkaufen, und der gesonderte Fehler CANNOT_MIX_CURRENCIES.
Warum PayPal eine Währung ablehnt
PayPal arbeitet mit einer festen Liste von Währungen, die kürzer ist als die Liste, die Sie in WooCommerce hinzufügen können. Einige Währungen auf dieser Liste gelten nur im Inland: MYR zum Beispiel wird nur von PayPal-Konten akzeptiert, die in Malaysia registriert sind. Ob eine Währung funktioniert, hängt also von der Währung und vom Land des empfangenden Kontos ab. Die Liste finden Sie unter PayPal-Währungscodes, mit Hinweisen in akzeptierte PayPal-Währungen.
Auf Seiten des Shops hat eine WooCommerce-Bestellung eine einzige Währung, und das Zahlungs-Gateway wird aufgefordert, den Bestellbetrag in dieser Währung abzurechnen. FOX bestimmt, welche Währung beim Anlegen der Bestellung aktiv ist. Es rechnet den Betrag auf dem Weg zu PayPal nicht um und hat keine Einstellung nach dem Muster „MYR anzeigen, USD abrechnen“ innerhalb einer Bestellung; die allgemeine Regel erklärt Preise in lokaler Währung anzeigen, in Basiswährung abrechnen. Jedes funktionierende Setup sorgt deshalb dafür, dass die Kasse selbst in einer Währung läuft, die PayPal akzeptiert.
Prüfen Sie dies, bevor Sie etwas ändern
- Der Währungscode ist ein echter ISO-Code. PayPal gleicht den dreistelligen Code exakt ab:
EUR, nichtEURO. Ein falscher Code in der FOX-Währungszeile blendet den PayPal-Button für diese Währung aus. Ein eigener Währungscode kann von PayPal nie abgerechnet werden. Schlägt PayPal sogar bei USD oder EUR fehl, leeren Sie das Codefeld in der FOX-Zeile, geben Sie den Code erneut von Hand ein und speichern Sie: Ein hineinkopierter Code kann unsichtbare Zeichen enthalten. - Der Fehler tritt auch bei einer unterstützten Währung auf. Dann ist die Währung nicht die Ursache. Testen Sie abgemeldet, bei ausgeschaltetem Caching und ausgeschalteter JavaScript-Optimierung; Seiten aus einem Cache und verzögerte Skripte stecken hinter vielen „Währungs“-Fehlern, siehe Währungsumrechner hängt nach JS-Optimierung beim Laden.
- Kein Filter, der PayPal die Währung „hinzufügt“. Code, der
woocommerce_paypal_supported_currencieserweitert, lässt nur den Button erscheinen. Die Bestellung wird weiterhin in dieser Währung angelegt, und PayPal lehnt sie im Zahlungsschritt trotzdem ab. Entfernen Sie solchen Code. - Nur ein Plugin setzt die Währung. Ein zweites Multi-Währungs-Modul (in einem Toolkit- oder Zahlungs-Plugin) ändert die Währung zum Zahlungszeitpunkt hinter dem Rücken von FOX. FOX zeigt auf den WooCommerce-Einstellungsseiten einen Hinweis an, wenn WooPayments seine eigene Multi-Währungs-Option eingeschaltet hat. Behalten Sie nur eines von beiden.
Drei Wege, weiter zu verkaufen, wenn PayPal eine Währung nicht annimmt
1. PayPal nur in Währungen anbieten, die es abrechnen kann
Dafür ist kein Code nötig. Schalten Sie im Tab Erweitert (Advanced) der FOX-Einstellungen Zahlungsregeln (Payments rules) ein und speichern Sie; es erscheint ein Tab Zahlungen (Payments). Wählen Sie in der Zeile Ihres PayPal-Gateways die Währungen aus, die PayPal nicht annehmen kann, mit Zahlungsverhalten (Payments behavior) auf Ist ausgeblendet (Is hidden) (oder wählen Sie die aus, die es annehmen kann, mit Wird angezeigt (Is shown)). FOX wendet die Regel auf der Kassenseite und auf der Zahlungsseite einer bestehenden Bestellung an. Die Besucher sehen überall weiterhin ihre lokale Währung und zahlen mit einem anderen Gateway oder wechseln selbst zu einer PayPal-Währung. Mehr zu den Regeln unter Zahlungs-Gateway nach Währung ausblenden.
2. Auf der Kassenseite zu einer PayPal-Währung wechseln
Die Besucher stöbern in ihrer eigenen Währung, und wenn sie die Kasse öffnen, wechselt FOX die Währungen, die PayPal nicht annehmen kann, zu einer, die es annehmen kann. Die Bestellung wird in dieser Währung angelegt, sodass PayPal sie akzeptiert. Dafür muss im Tab Erweitert (Advanced) Mehrere erlaubt (Is multiple allowed) = Ja (Yes) gesetzt und Kasse nach GeoIP-Regeln (Checkout by GeoIP rules) ausgeschaltet sein, denn diese Option bestimmt die Kassenwährung nach Land und würde den Wechsel überschreiben. Außerdem muss jede Zielwährung in Ihrer FOX-Währungsliste stehen; set_currency() fällt bei einem Code, den der Shop nicht kennt, auf die Basiswährung zurück.
/*
* 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 );
Kennen Sie die Nebeneffekte, bevor Sie es einsetzen. Der Wechsel gilt für jedes Gateway an der Kasse, nicht nur für PayPal. Der Kunde sieht, wie die Summen beim Öffnen der Kasse die Währung wechseln, weisen Sie deshalb mit einer Textzeile auf der Kassenseite darauf hin. Und der Besucher bleibt nach dem Verlassen der Kasse in der neuen Währung; das längere Snippet im oben verlinkten Artikel zum Anzeigen lokaler Preise und Abrechnen in der Basiswährung stellt die vorherige Währung wieder her, falls Sie das benötigen.
3. Alles in einer von PayPal unterstützten Basiswährung abrechnen
Ist Ihre WooCommerce-Basiswährung eine, die PayPal akzeptiert, stellen Sie Mehrere erlaubt (Is multiple allowed) auf Nein (No). Die Besucher sehen umgerechnete Preise, und die Kasse, die Bestellung und die Zahlung laufen in der Basiswährung. Ungefähren Betrag anzeigen (Show approximate amount) im Tab Optionen (Options) fügt den lokalen Gegenwert in der Währung des Landes des Besuchers aus den GeoIP-Regeln zu den Summen im Warenkorb und an der Kasse hinzu. Steht die Basiswährung selbst nicht auf der Liste von PayPal, kann diese Option nicht funktionieren: Verwenden Sie dann Variante 2 mit Ja (Yes) oder Variante 1.
Besonderheiten von PayPal Payments
- Die Buttons behalten die Währung beim Laden der Seite. Das PayPal-Skript wird mit der Währung geladen, die beim Aufbau der Seite aktiv war. Ändert sich die Währung später auf derselben Seite, zum Beispiel nach Land an der Kasse, arbeiten die Buttons weiter mit der alten und scheitern mit einem Fehler wie „Expected currency from order api call to be USD, got EUR“. Vermeiden Sie es, die Währung auf der Kassenseite zu ändern, nachdem sie geladen wurde, oder stellen Sie sicher, dass die Seite neu geladen wird.
- Bei Mehrere erlaubt (Is multiple allowed) = Nein (No) übergibt FOX dem Skript von PayPal Payments die Basiswährung, sodass die Buttons zur Kasse in der Basiswährung passen.
- Buttons außerhalb der Kasse. Smart Buttons auf Produktseiten, im Warenkorb und im Mini-Warenkorb legen die PayPal-Bestellung an, bevor der Kunde die Kasse erreicht. Der Kassenwechsel aus Variante 2 gilt für sie nicht, sie senden also weiterhin die nicht unterstützte Währung, und mit Variante 3 verursachen sie den unten beschriebenen Fehler durch gemischte Währungen. Zeigen Sie bei beiden Varianten die PayPal-Buttons nur auf der Kassenseite an, und zwar in den Einstellungen zum Button-Standort von PayPal Payments.
- Später bezahlen (Pay Later) wird nur für bestimmte Länder und deren Währungen angeboten. Bei anderen Währungen meldet das eigene Skript von PayPal Fehler in der Browserkonsole; schalten Sie die Pay-Later-Meldungen aus, wenn die meisten Ihrer Kunden in anderen Währungen zahlen.
- Rückerstattungen über die Bestellansicht erfolgen in der Währung der Bestellung, und FOX hält sich aus dieser Anfrage heraus. Die Ausnahme ist ein Shop, in dem die Professional-Erweiterung von PDF Invoices & Packing Slips, Smart Coupons oder Advanced Coupons aktiv ist; dort hält
add_filter( 'woocs_disable_backend_refund_calculation', '__return_true' );FOX heraus. FOX liest diesen Filter beim Laden, vor dem Theme, setzen Sie die Zeile also in ein Must-Use-Plugin (eine PHP-Datei inwp-content/mu-plugins, die mit<?phpbeginnt), nicht in diefunctions.php.
CANNOT_MIX_CURRENCIES: Bestellungen scheitern nach einem Währungswechsel
PayPal Payments meldet 422 UNPROCESSABLE_ENTITY mit CANNOT_MIX_CURRENCIES, wenn eine Zahlung aus zwei Währungen aufgebaut wird: Die PayPal-Bestellung wurde in der einen angelegt, und der Shop sendet dann Beträge oder bestätigt die Zahlung in einer anderen. Der Fehler tritt typischerweise nur bei Kunden auf, die die Währung gewechselt haben, und nur zeitweise. Drei Ursachen kommen in Frage.
Gecachte Seiten tragen eine andere Währung
Eine Seite mit PayPal-Buttons lädt das PayPal-Skript mit der Währung dieser Seite. Stammt die Seite aus einem Seiten-Cache, ist das die Währung desjenigen, der zuerst gecacht wurde, während der Warenkorb des Besuchers in dessen eigener Währung geführt wird. Schließen Sie die Kasse, den Warenkorb und jede Produktseite, die PayPal-Buttons zeigt, von jedem Cache aus und lassen Sie die Cache-Behandlung von FOX für den Rest des Shops eingeschaltet, wie in warum sich Währungsumrechner und Seiten-Cache gegenseitig bekämpfen beschrieben.
Die Zahlungsanfrage sieht wie ein neuer Besucher aus
Die PayPal-Buttons sprechen über Hintergrundanfragen mit Ihrer Website. FOX findet die Währung des Besuchers in seiner Speicherung: ein Cookie bei PHP-Sitzung (PHP Session) und FOX-Sitzung (FOX Session), die IP-Adresse bei Transient oder ein Browser-Schlüssel bei Transient mit eingeschalteter Cache-Option. Eine Anfrage, die ohne diese Identität eintrifft, wird wie ein Erstbesuch behandelt, sodass die Willkommenswährung oder die GeoIP-Regeln ihre Währung bestimmen und die PayPal-Bestellung in einer Währung aufgebaut werden kann, die der Warenkorb nicht verwendet. Das passiert, wenn:
- der Browser-Schlüssel nicht angehängt wird, weil ein Optimierer die front.js von FOX verzögert, die den Schlüssel an die Anfragen der PayPal-Buttons anfügt (beheben Sie die Ausschlüsse anhand des Artikels, der in den obigen Prüfungen verlinkt ist);
- sich die IP-Adresse des Besuchers zwischen Seitenaufruf und Zahlung ändert, wie es Mobilfunknetze tun, während die Währungsspeicherung (Currency storage) auf Transient steht und die Cache-Option aus ist. Die FOX-Sitzung (FOX Session) hält die Währung stattdessen im eigenen Cookie des Besuchers.
Mehrere erlaubt (Is multiple allowed) = Nein (No) mit Buttons außerhalb der Kasse
In diesem Modus erhält das PayPal-Skript die Basiswährung, während ein Button auf einer Produktseite oder im Warenkorb die Bestellung aus einem Warenkorb aufbaut, der in der Währung des Besuchers angezeigt wird. Zeigen Sie die Buttons nur auf der Kassenseite an oder wechseln Sie zu Ja (Yes) und legen Sie die Zahlungswährung mit Variante 2 fest.
Checkliste
- Jeder Währungscode in FOX ist ein gültiger ISO-Code, im Zweifel neu eingetippt.
- Ihr PayPal-Konto kann jede Währung empfangen, die bei PayPal ankommt, auch Inlandswährungen.
- Kein Code fügt Währungen über
woocommerce_paypal_supported_currencieshinzu, und kein zweites Multi-Währungs-Modul ist aktiv. - Eines der drei Setups gewählt: Zahlungsregeln (Payments rules), eine erzwungene Kassenwährung oder eine unterstützte Basiswährung.
- Kasse, Warenkorb und Seiten mit PayPal-Buttons vom Seiten-Cache ausgeschlossen; Skripte von FOX nicht verzögert.
Lehnt PayPal weiterhin eine Währung ab, die es für Ihr Konto unterstützt, eröffnen Sie ein Thema im FOX-Support-Forum mit dem genauen PayPal-Fehler, Ihren Einstellungen für Mehrere erlaubt (Is multiple allowed) und Währungsspeicherung (Currency storage) sowie dem verwendeten PayPal-Plugin, und wir werden uns das ansehen.