Default Zahlungsmethode des Customers weicht von Standard Zahlungsmethode im SalesChannel-Kontext ab

Hallo,

wir haben aktuell folgendes Problem:

Ausgangslage:
Shopware: 6.4.20.2
Problem: Kunden passen ihre Standard-Zahlungsmethode an und im Checkout wird trotzdem eine andere Zahlungsmethode vorausgewählt. Diese Problem taucht nicht bei allen Kunden auf.

Analyse:
Die Customer Entity wird korrekt aktualisiert und die Standard-Zahlungsmethode wird auch korrekt in der Datenbank gesetzt. Soweit so gut.
Im Frontend, in der Accountverwaltung wird auch die Standard-Zahlungsmethode vorausgewählt, wenn man dort hin navigiert.

Hier ist mir aber aufgefallen, dass bei dem Account bei dem das Problem im Checkout auftritt, die Reihenfolge der Zahlungsmethoden anders ist als die bei dem Account wo das Problem nicht auftaucht.

Das System passt die Reihenfolge im Frontend an, je nachdem welche Zahlungsmethode ausgewählt wurde durch den Kunden. Die ausgewählte Standard Zahlungsmethode sollte immer oben stehen.

Ich habe hier tiefer im Core Code nachgeschaut und bin auf die Funktion „sortPaymentMethodsByPreference“ in der „PaymentMethodCollection“ Klasse gestoßen:

    /**
     * Sorts the selected payment method first
     * If a different default payment method is defined, it will be sorted second
     * All other payment methods keep their respective sorting
     */
    public function sortPaymentMethodsByPreference(SalesChannelContext $context): void
    {
        $ids = array_merge(
            [$context->getPaymentMethod()->getId(), $context->getSalesChannel()->getPaymentMethodId()],
            $this->getIds()
        );

        $this->sortByIdArray($ids);
    }

Hier werden die Standard-Zahlungsmethode aus dem SalesChannel Kontext (also der Standard Zahlungsmethode des aktuellen Benutzers) und die Standard-Zahlungsmethode des Saleschannels mit allen aktiven Zahlungsmethoden gemerged.

Anmerkung: Die Funktion „getIds“ gibt ein Array mit Keys zurück und die beiden anderen Zahlungsmethoden mit denen germerged werden soll, haben keine Keys. Somit funktioniert der Merge nicht wie gewünscht, so dass die Zahlungsmethoden aus dem zweiten Array entfernt werden, sondern tatsächlich die Zahlungsmethoden doppelt im Array vorhanden sind. Einmal ohne Key und einmal mit Key. Aber das ist ein anderes Problem und wird denke ich im Rendering abgefedert. Zumindest werden die Zahlungsmethoden im Frontend nicht doppelt ausgespielt.

Hier habe ich festgestellt, dass im SalesChannel Kontext, nicht die aktuelle Zahlungsmethode des Kunden steht und diese auch nach ändern der Zahlungsmethode nicht geupdated wird. ($context->getPaymentMethod()->getId()) Hingegen in der Customer Entität wird alles korrekt aktualisiert.

Ergebnis (mit weiterhin vorhandenen Problem):
Somit liefert die Funktion „sortPaymentMethodsByPreference“ eine falsche Reihenfolge der Zahlungsmethoden zurück, weswegen im Checkout (wo die erste Zahlungsmethode im Rendering als Default genutzt wird) nicht die korrekte Standard Zahlungsmethode des Kunden gesetzt wird.

Wie kommen wir hier nun weiter? Der SalesChannel Kontext beinhaltet nicht die korrekte Zahlungsmethode des Kunden und wird auch nicht aktualisiert bei manchen Kunden. Selbst eine Änderung übers Backend als Admin behebt diesen Fehler nicht. Ich bin für jede Hilfe dankbar.

Vielen Dank

1 „Gefällt mir“

Es gitb ein sw-context-token, dass den Nutzer identifiziert.
In diesem Token (Tabelle: sales_channel_api_context) ist die zuletzt ausgewählte Zahlungsweise des Kunden gespeichert.
Diese ist beim Starten eines Checkouts vorausgewählt.
Gibt es kein Token und ist somit keine zuletzt ausgewählte Zahlungsweise identifizierbar, wird die Standardzahlungsweise des Kunden ausgewählt.

So kommt es zustande, dass bei manchen Kunden, die Standardzahlungsweise angezeigt wird. (Wenn es keinen sales_channel_api_context gibt, oder die selbe Zahlungsweise, wie die eingestellte Standardzahlungsweise, beim letzten Checkout ausgewählt wurde.)

Eine abweichende, vorausgewählte Zahlungsweise kommt dann zustande, wenn der Kunde beim letzten Start eines Checkouts eine, von seiner eingerichteten Standardzahlungsweise, abweichende Zahlungsweise ausgewählt hat.

Die Prio ist also:
zuletzt ausgewählte Zahlungsweise
→ Standardzahlungsweise
→ im SalesChannel definierte Standardzahlungsweise