Paypal (express) 5.2.5 bug

Ich konnte endlich raus finden woher der Fehler im letzten schritt cl=order&iAddressError=1 “Lieferadresse wurde während der Bestellung geändert. Bitte noch einmal prüfen” genau kommt. Hier wurde ja schon viel spekuliert, was ich alles ausschließen konnte.

Das ganze lässt sich auch wunderbar reproduzieren und der Fehler tritt unter folgenden Bedingungen auf.

Kunde bestellt als Gast mit Paypal-Express z.B. direkt aus dem Warenkorb oder der Artikelseite heraus. Der Vorteil, der Kunde muss sich nicht extra im Shop mit seinen persönlichen Daten registrieren, sondern der Shop bedient sich an den persönlichen Daten direkt aus dem PayPal Konto.

Und hier kommt das Problem. Im Paypal Konto gibt es nur ein Feld für den Straßennamen + Hausnummer. Oxid hingegen möchte bzw. muss (required) 2 separate Werte in 2 Feldern haben.

<input name="invadr[oxuser__oxstreet]> und <input name="invadr[oxuser__oxstreetnr]>

Um das Problem zu lösen haben die Paypal Modul Entwickler folgenden Funktion in das Modul eingebaut.

public function splitShipToStreetPayPalAddress($shipToStreet)
    {
        $address = array();
        $shipToStreet = trim($shipToStreet);

        // checking if street number is at the end of the address
        preg_match("/(.*\S)\s+(\d+\s*\S*)$/", $shipToStreet, $address);

        // checking if street name and number was found
        if (!empty($address[1]) && $address[2]) {
            $address['street'] = $address[1];
            $address['streetnr'] = $address[2];

            return $address;
        }

        // checking if street number is at the begining of the address
        preg_match("/(\d+\S*)\s+(.*)$/", $shipToStreet, $address);

        // checking if street name and number was found
        if (!empty($address[1]) && $address[2]) {
            $address['street'] = $address[2];
            $address['streetnr'] = $address[1];

            return $address;
        }

        // it is not possible to resolve address, so assign it without any parsing
        $address['street'] = $shipToStreet;
        $address['streetnr'] = "";

        return $address;
}

Relativ simpel. Es wird per regex geprüft ob die Hausnummer hinter den Straßennamen steht oder eben davor. Trifft eine der 2 Bedingungen zu dann werden aus einem Datensatz 2 Datensätze gemacht $address['street'] und $address['streetnr'] und an oxid übergeben.

Trifft keine der 2 Bedingungen zu dann bleibt $address['streetnr'] leer welches aber von Oxid benötigt wird. Nun gibt es im Internet, wie wir alle wissen, auch einige Experten die z.B. das Leerzeichen nach dem Straßennamen vergessen (Mustweg12 oder Hauptstr.22).

Und genau in diesem Fall greift das regex Muster nicht mehr. Hier ist das Ganze wunderbar zu sehen. Einfach mal das Leerzeichen zwischen Name und Nummer löschen.

Entsprechend kann Paypal keine Hausnummer an Oxid übergeben und schon spuckt Oxid im letzten Schritt die besagte Fehlermeldung aus, die leider absolut irreführend ist. Denn daraus geht nicht hervor dass die Hausnummer fehlt und der Kunde sieht auch keine fehlende Hausnummer im letzten Schritt.

Der Kunde sieht sowas wie:

Max Mustermann
Hauptstr.22
12345 Stadt

Das Name und Nummer dabei in einem Feld <input name="invadr[oxuser__oxstreet]> steht und Oxid im Hintergrund genau diesen Fehler beanstandet, das ist für den Kunden nicht ersichtlich.

Bei uns sind das ca. 20 Paypal-Express Kunden am Tag die auf dieses Problem stoßen. Einige davon gehen die Bestellschritte nochmal durch und bemerken den Fehler dann. Denn klickt man im Schritt cl=user auf “weiter” dann öffnet sich Formular mit der richtigen Fehlermeldung und der Kunde sieht auch deutlich das im Feld Hausnummer kein Wert steht.

Somit verliert man 100 prozentige Kunden. Jetzt muss man mal schauen wie man das Problem am besten lösen kann. Eine Möglichkeit wäre Paypal Express abzuschalten, was eher suboptimal ist. Eine andere Möglichkeit wäre in Oxid aus den zwei Feldern ein Feld, wie bei Paypal selbst, zu machen.

Man könnte auch natürlich das regex Muster optimieren. Die frage ist nur ob man alle Eventualitäten damit abfangen kann.

So nun aber genug geschrieben. Evtl. gibt es nun auch hilfreiches Feedback.

PS: es gibt auch ganz selten den Fehler dass die Hausnummer von Paypal als Firmenname an Oxid übergeben wird. Müsste hier noch mal schauen wie genau das zustande kommt.

1 Like

UPDATE: Wenn der Kunde in seinem Paypal Account die Hausnummer im “Adresszusatz” Feld stehen hat, dann wird die Hausnummer von Oxid als “Zus. Info” interpretiert und dort landet dann auch die Hausnummer. Womit das benötigte Feld “oxuser__oxstreetnr” leer bleibt, was wiederum in der besagten Fehlermeldung endet.

PS. Also man muss ja schon sagen dass das Paypal Modul schlecht programmiert ist (zumind. was den express Teil angeht). Keine Fallbacks, keine vernünftigen Fehlermeldungen. Selbst das simple regex (siehe oben) ist einfach schlecht.

Na ja scheint aber auch nicht wirklich jemanden zu interessieren.

PayPal regex fix:

(.*\S)\s*(\S\d+) = hausnummer dahinter

(\S\d+)\s*(.*\S) = hausnummer davor