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