PayPal Unified: Rechnungs- und Lieferadresse auf /finish leer

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“