PayPal Unified: Rechnungs- und Lieferadresse auf /finish leer

[@Michael Telgmann](http://forum.shopware.com/profile/17553/Michael Telgmann “Michael Telgmann”)‍ Mich würde noch interessieren, ob ihr beim Testen den Shop auch unter einem basePath sowie PayPal im Sandbox Modus habt laufen lassen.

Hallo,

ich habe als host “localhost” und als basePath z.B. “5.5” und natürlich können wir PayPal nur im Sandbox Modus testen  Wink

Viele Grüße aus Schöppingen

cool Michael Telgmann

Ich versuche mich einmal dem Problem zu nähern:

Voraussetzung: Shopware 5.5.6 und Bezahlvorgang via PayPal ohne ExpressCheckout.

In der checkout/finishAction holt sich der Shop die Bestelldaten aus der Session (ca. Zeile 317) via

$orderVariables = $this->session['sOrderVariables']->getArrayCopy();

In der nachfolgenden Abfrage wird auf die sOrderNumber geprüft und wenn nicht leer die entsprechende Variable sAddresses für die Daten der View mit Billing und Shipping Adresse gefüllt. sOrderNumber ist aber gar nicht in $orderVariables enthalten, sondern nur in $order. Folgender Code schafft in der finishAction bei mir Abhilfe:

...
$orderVariables = $this->session['sOrderVariables']->getArrayCopy();

// Neu: Prüfung auf sOrderNumber 
if (!empty($order['sOrderNumber'] && empty($orderVariables['sOrderNumber']))){
  $orderVariables['sOrderNumber'] = $order['sOrderNumber'];
}

if (!empty($orderVariables['sOrderNumber'])) {
  $orderVariables['sAddresses']['billing'] = $this->getOrderAddress($orderVariables['sOrderNumber'], 'billing');
  $orderVariables['sAddresses']['shipping'] = $this->getOrderAddress($orderVariables['sOrderNumber'], 'shipping');
  $orderVariables['sAddresses']['equal'] = $this->areAddressesEqual($orderVariables['sAddresses']['billing'], $orderVariables['sAddresses']['shipping']);
}
...

Damit wären dann auch die obigen Billing und Shipping Adressen in der sAddresses gefüllt. Gefüllt wird

 $this->session['sOrderVariables']

erstmals in der confirmAction und sOrderNumber wird oder kann dort noch nicht gesetzt werden. In der finishAction kommt der Shop deshalb auch nicht in die if Abfrage rein. Warum das Problem nur bei einigen auftaucht könnte man evtl. mit einem Fehler/Problem beim Laden/Speichern der View-Daten in die Session erklären. Das müsste man aber noch mal genauer untersuchen, wie und wann die sOrderNumber in der Session zur verfügung steht.

Edit: Das neue PayPal Unified läuft bei uns erstmal auf 2 Testsystemen. Wir konnten bisher mit Ausnahme von PayPal Express Checkout nie die checkout/finish Seite mit korrekten Adressangaben erreichen.

Moin. Gibt es hier schon Neuigkeiten bzw. konnte man meiner Erklärung zum Fehler wie er bei uns vorliegt folgen?

Wir sind auch an einer Lösung interessiert. Wir nutzen Shopware Version 5.2.12 und PayPal Version 2.1.0.

Die Rechnungs- und Lieferadresse fehlt bei einigen Bestellungen, die mit PayPal gezahlt wurden, aber nicht bei allen. Außerdem wird bei diesen Bestellungen mit Adresse = “null” keine Bestellbestätigungsmail verschickt.

Seltsamerweise tritt der Fehler nicht nur bei PayPal Bestellungen auf, wie ich feststellen musste. Auch beim Kauf auf Rechnung, oder Mastercard Zahlung (nicht über PayPal) fehlen die Adressen.

 

@halbe_rahmen schrieb:

Wir sind auch an einer Lösung interessiert. Wir nutzen Shopware Version 5.2.12 und PayPal Version 2.1.0.

Die Rechnungs- und Lieferadresse fehlt bei einigen Bestellungen, die mit PayPal gezahlt wurden, aber nicht bei allen. Außerdem wird bei diesen Bestellungen mit Adresse = „null“ keine Bestellbestätigungsmail verschickt.

Seltsamerweise tritt der Fehler nicht nur bei PayPal Bestellungen auf, wie ich feststellen musste. Auch beim Kauf auf Rechnung, oder Mastercard Zahlung (nicht über PayPal) fehlen die Adressen.

 

Hier wäre zunächst ein Update auf Shopware 5.5. angebracht.

@mlampert schrieb:

@halbe_rahmen schrieb:

Wir sind auch an einer Lösung interessiert. Wir nutzen Shopware Version 5.2.12 und PayPal Version 2.1.0.

Die Rechnungs- und Lieferadresse fehlt bei einigen Bestellungen, die mit PayPal gezahlt wurden, aber nicht bei allen. Außerdem wird bei diesen Bestellungen mit Adresse = „null“ keine Bestellbestätigungsmail verschickt.

Seltsamerweise tritt der Fehler nicht nur bei PayPal Bestellungen auf, wie ich feststellen musste. Auch beim Kauf auf Rechnung, oder Mastercard Zahlung (nicht über PayPal) fehlen die Adressen.

 

Hier wäre zunächst ein Update auf Shopware 5.5. angebracht.

An einem Update auf Shopware 5.5 sind wir schon dran. Aufgrund von Individualprogrammierungen ist das nur leider nicht mal eben gemacht. Dennoch denke ich sollte PayPal auch mit unserer Version ordnungsgemäß ohne Fehler funktionieren und Shopware Version 5.5 scheint ja wie z.B. bei euch oder bei @wwnorden mit Version 5.5.6 auch nicht die Lösung für das Problem zu sein.

Moin,

ich hatte heute wieder Zeit, mich der Thematik auf unserem Testsystem zu nähern.

Voraussetzung: Shopware 5.5.7 und Bezahlvorgang via PayPal Unified (2.1.2) ohne ExpressCheckout.

Mit aktivierter Option “Bestellnummer an Paypal übertragen” tritt der Fehler auf, sonst nicht.

Grund dafür ist, dass in der Klasse PaypalUnified folgende Zeile aufgrufen wird

public function returnAction()
{
...
$basketValid = $this->validateBasketExtended($basketId);
...
}

die wiederum in

 private function validateBasketExtended($basketId = null)
{
...
$basket = $this->loadBasketFromSignature($basketId);
...
}

aufruft, so dass in der Session

sOrderVariables 

neu gesetzt wird, ohne das berücksichtigt wurde, dass zuvor in der Funktion returnAction() bei $sendOrderNumber und dann weiter in der Funktion sSaveOrder

public function returnAction()
{
....

if ($sendOrderNumber) {
                $orderNumber = $this->saveOrder($paymentId, $paymentId, PaymentStatus::PAYMENT_STATUS_OPEN);

...
}

 public function saveOrder($transactionId, $paymentUniqueId, $paymentStatusId = null, $sendStatusMail = false)
{
...
$orderNumber = $order->sSaveOrder();
...
}

die Werte für sOrderNumber gesetzt werden. Siehe

public function sSaveOrder()
{
...
     if ($this->getSession()->offsetExists('sOrderVariables')) {
            $variables = $this->getSession()->offsetGet('sOrderVariables');
            $variables['sOrderNumber'] = $orderNumber;
            $variables['confirmMailDeliveryFailed'] = $confirmMailDeliveryFailed;
            $this->getSession()->offsetSet('sOrderVariables', $variables);
      }
   return $orderNumber;
}

Ohne Übergabe der Bestellnummer zu Paypal wird

$basketValid = $this->validateBasketExtended($basketId);

zuerst ausgewertet und danach das saveOrder aufgerufen.

...
// if the order number is not sent to PayPal do it here to avoid broken orders
            if (!$sendOrderNumber) {
                $orderNumber = $this->saveOrder($paymentId, $paymentId, PaymentStatus::PAYMENT_STATUS_OPEN);
            }
...

Das setzt ordnungsgemäß die sOrderNumber, die wir wie in meinem vorherigen Post beschrieben in der checkout/finishAction benötigen, um die Adressen an die View zu übergeben.

Die Frage wäre zum einen, ob man mein Vorgehen nachvollziehen kann und so den Fehler nachstellen kann. Zum anderen wäre dann die Frage, ob ggf. in der PaypalUnified Klasse die Basket Validation (ca. 220) grundsätzlich vor dem saveOrder aufgerufen werden könnte. Alternativ wäre meine obige Lösung mit Code anpassen in der checkout/finishAction eine weitere Möglichkeit.

Beste Grüße

Edit: Ein Ticket gibt es auch schon dafür: https://issues.shopware.com/issues/PT-10236

1 „Gefällt mir“

Hallo @wwnorden‍

Vielen Dank für die ausführliche Erklärung! Wir werden uns das von dir verlinkte Ticket in der nächsten Woche einmal anschauen. 

Viele Grüße aus Schöppingen

cool Michael Telgmann

Hallo,

das Problem kann ich bisher nur auf meiner Shopware 5.4.x Umgebung nachstellen. Unter dem aktuellen 5.5.x Entwicklungsstand hab ich kein Problem. 

Viele Grüße aus Schöppingen

cool Michael Telgmann

Hallo,

wir konnten das Problem identifizieren und beheben. Im Laufe der nächsten Woche wird es sehr wahrscheinlich ein Update des Plugins geben.

Viele Grüße aus Schöppingen

cool Michael Telgmann

1 „Gefällt mir“