Opened 10 years ago
Closed 10 years ago
#729 closed Bug/Fehler (fixed)
PayPal - Zeitversetzte Meldungen
| Reported by: | INETvisio | Owned by: | somebody |
|---|---|---|---|
| Priority: | niedrig | Milestone: | modified-shop-2.0.0.0 |
| Component: | Shop | Version: | 2.0.0.0 |
| Keywords: | Cc: | ||
| Blocked By: | Blocking: |
Description
Hallo modified,
bei PayPal Modul gibt es ein Problem, dass bei der zeitversetzte Meldungen könnte leicht ein Fehler auftreten, dass der "orders_status" verändert wird, obwohl die Meldung zu spät angekommen wurde.
Ich bringe ein Beispiel:
- Kunde erstellt ein Auftrag, bezahlt
- Kunde ruft an, war ein Fehler, bla bla bla, bitte Stornieren
- Man erstellt eine Rückerstattung mit PayPal.
Bis dato sollte normalerweise kein Problem auftreten.
Aber, in Falle, wenn PayPal die Meldung "Completed" erst später versendet (Zeitversetzt), dann gibt es ein Konflikt.
Man sieht folgendes in der "orders_status_history":
- Offen
- Offen PP wartend
- Storno (PayPal IPN Refunded ..)
- Offen (PayPal IPN Completed ..)
- Versendet
- Zugestellt
Das bedeutet, dass PayPal eine Rückerstattungsstatus schneller geschickt hat als die Meldung "Completed".
Nach meine Analyse geht es um folgendes Datei:
includes/classes/paypal_checkout.php
Um diese Fehler zu vermeiden, sollte man normalerweise auf ein "parent_txn_id" reagieren. Der bestimmt Eltern. Dieser wird auch als Kommentar ParentID=xxxx ins "orders_status_history" eingetragen.
Lösungsvorschlag:
Zeile: 1190-1194
$order_query = xtc_db_query("SELECT currency, currency_value
FROM " . TABLE_ORDERS . "
WHERE orders_id = '" . xtc_db_prepare_input($xtc_order_id) . "'");
if(xtc_db_num_rows($order_query) > 0) {
(orders_status auslesen)
ersetzen durch:
$order_query = xtc_db_query("SELECT currency, currency_value, orders_status
FROM " . TABLE_ORDERS . "
WHERE orders_id = '" . xtc_db_prepare_input($xtc_order_id) . "'");
if(xtc_db_num_rows($order_query) > 0) {
$order_data = xtc_db_fetch_array($order_query);
Danach folgendes suchen:
Zeile 1370-1374:
$xtc_order_id=(int)substr($this->data['invoice'],strlen(PAYPAL_INVOICE));
xtc_db_query("UPDATE " . TABLE_ORDERS . "
SET orders_status = '" . $order_status_id . "', last_modified = now()
WHERE orders_id = '" . xtc_db_prepare_input($xtc_order_id) . "'");
(Nach Kindern suchen, wenn Kinder gefunden werden, Auftragsstatus nicht verändern)
Und davor folgendes einfügen:
$_transQuery = "SELECT paypal_ipn_id FROM ".TABLE_PAYPAL." WHERE parent_txn_id = '".$ipn_data['txn_id']."'";
$_transQuery = xtc_db_query($_transQuery);
$_transQuery = xtc_db_fetch_array($_transQuery);
if($_transQuery['paypal_ipn_id']!='') {
$order_status_id = $order_data['orders_status'];
}
Was meint Ihr dazu?
Gruß
Jürgen H.

Die alten PayPal Module sind im SVN nicht mehr verfügbar und komplett durch PayPal REST/Plus ersetzt.