Modify

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:

  1. Kunde erstellt ein Auftrag, bezahlt
  2. Kunde ruft an, war ein Fehler, bla bla bla, bitte Stornieren
  3. 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":

  1. Offen
  2. Offen PP wartend
  3. Storno (PayPal IPN Refunded ..)
  4. Offen (PayPal IPN Completed ..)
  5. Versendet
  6. 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.

Attachments (0)

Change History (1)

comment:1 by Torsten Riemer, 10 years ago

Resolution: fixed
Status: newclosed

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

Modify Ticket

Action
as closed The owner will remain somebody.
The resolution will be deleted. Next status will be 'reopened'.

Add Comment


E-mail address and name can be saved in the Preferences .
 
Note: See TracTickets for help on using tickets.