PAYONE-GmbH / shopware-5

PAYONE Payment Plugin for shopware 5
MIT License
10 stars 24 forks source link

AmazonPay: Inkonsistente Bestellnummer im Backend und Bestellbestätigungs Email #222

Closed mfritsche-dotsource closed 5 years ago

mfritsche-dotsource commented 6 years ago

Hallo,

bei der Zahlung mit AmazonPay tritt ein Fehler bezüglich der Bestellnummern auf. In der Bestellbestätigung steht eine um 1 höhere Bestellnummer als im Shop Backend unter Bestellungen ersichtlich ist.

Bsp: Eine Bestellung mit der Bestellnummer 2001 im Backend wird in der Bestellbestätigung als 2002 angegeben.

Meine Vermutung ist, dass dies mit der Art der Abarbeitung des Prozesses zusammenhängt welcher in der finishAction() des MoptPaymentAmazon Controllers stattfindet.

Zuerst wird hier mittels

$my_sOrder = new sOrder();
$this->session['moptAmazonOrdernum']` = $my_sOrder->sGetOrderNumber();

eine Bestellnummer reserviert. Diese wird im späteren Verlauf genutzt um die vom Shopware in

$orderNumber = $this->saveOrder(
    $txid,
    $this->session->paymentReference,
    $paymentStatusId
);

generierte zu überschreiben. Dies geschieht nach dem Speichern der Bestellung

$sql = 'UPDATE  `s_order` SET ordernumber = ? WHERE transactionID = ?';
Shopware()->Db()->query($sql, array($this->session['moptAmazonOrdernum'], $txid));

$this->session['sOrderVariables']->sOrderNumber = $this->session['moptAmazonOrdernum'];

$sql = 'UPDATE  `s_order_details` SET ordernumber = ? WHERE orderID = ?';
Shopware()->Db()->query($sql, array($this->session['moptAmazonOrdernum'], $orderId));

Dadurch hat die Bestellung in der Datenbank die zuerst reservierte Bestellnummer. Das Versenden der Transaktionsmail geschieht aber im saveOrder(). Dort erstellt Shopware eine eigene neue Bestellung, welche dann zu dem Zeitpunkt noch eine Bestellnummer hat, welche um eins höher ist als die Reservierte. Dadurch besitzt die Bestellbestätigung noch nicht die Information der reservierten Bestellnummer und gibt eine abweichende Bestellnummer aus.

fjbender commented 6 years ago

Hm. Ich habe da jetzt auf die Schnelle keine Idee, wie man das lösen könnte. Was ist denn Shopware-Best-Practice bei reservierten Bestellnummern? Das Problem müsste ja bei mehreren Zahlungsarten auftreten. Bei den Meisten arbeiten wir da ja mit der berühmt-berüchtigten mopt-Nummer als Pseudoreferenz, einige Zahlungsarten benötigen aber die tatsächliche Ordernummer als Referenz.

r-langenfeld commented 5 years ago

Das Ändern der Bestellnummer passiert meiner Meinung nach viel zu spät., Da abhängige Plugins die sich an saveOrder hängen, die falsche Bestellnummer verarbeiten.

Anstelle von diesem Code:

$sql = 'UPDATE  s_order` SET ordernumber = ? WHERE transactionID = ?';
Shopware()->Db()->query($sql, array($this->session['moptAmazonOrdernum'], $txid));

$this->session['sOrderVariables']->sOrderNumber = $this->session['moptAmazonOrdernum'];

$sql = 'UPDATE  `s_order_details` SET ordernumber = ? WHERE orderID = ?';
Shopware()->Db()->query($sql, array($this->session['moptAmazonOrdernum'], $orderId));

sollte ggf. die Methode $my_sOrder->sGetOrderNumber() via Hook überschrieben und die zuvor generierte Bestellnummer zurückgeben werden, anstatt eine neue generieren zu lassen und diese dann im Nachgang zu überschreiben.

Die zuvor für Amazon generierte Bestellnummer könnte in der Session zwischengespeichert und im Replace-Hook abgefragt werden. Existiert der Sessionkey, wird der Wert dahinter zurückgegeben und der Sessionkey aus der Session gelöscht. Existiert dieser nicht, dann muss eine neue Bestellnummer generiert werden. In dem Fall kann die Original Methode aufgerufen werden.

fjbender commented 5 years ago

Danke für den Hinweis, das wird uns weiterhelfen! Wir schauen uns das mal genauer an (SW-183).

hreinberger commented 5 years ago

Dürfte mit #225 behoben sein!