Ich hatte letztens diese Erweiterung vorgestellt: http://www.gambio-forum.de/threads/17976-Tempor%C3%A4re-Bestellungen-l%C3%B6schen Hier werden die mehrfachen Temp-Orders unterbunden. Allerdings führt es dazu, das bei sofortüberweisung die Kunden immer wieder auf die Zahlseite geleitet werden, anstatt auf die Bestellbestätigungsseite(checkout_success.php) Nach einem ganzen Tag suchen und tüfteln(mit der IT von SÜ) haben wir das Problem lokalisiert und behoben! Dazu muss ich aber erst mal etwas erklären! Bei SÜ im Adminbereich, da wo die Projekte verwaltet werden, kann man ja für jedes Projekt einen Erfolgslink und einen Abbruch/Timeout-Link setzen! Das könnt ihr euch schenken, da SÜ das im Modul hart drin hat!!! Diese Links werden nicht beachtet oder besser durch das Modul überbügelt.... Etwas unlogisch aber est ist nun mal so! In der /callback/sofort/ressources/script/sofortReturn.php sind die Weiterleitungen fest drin! Und da steht als Erfolgslink nicht die checkout_success.php drin sondern die checkout_process.php Und das versteh ich da gar nicht! Wieso nochmal die checkout_process.php durchlaufen????? Ansich kein Problem, wenn da nicht meine Änderung wäre! Die löscht die Bestellungen welche beim Aufruf der checkout_process.php als Temp-Order existieren(kleine eigene Prozedur!!). Das heist, bricht der Kunde die Bezahlung ab kommt er auf die Payment-Seite und geht den Checkout nochmal durch, kommt auf die checkout_confirmation.php und klickt erneut auf kaufen, und nun wird in der checkout_process.php erkannt das schon eine Temp-Order existiert und diese wird gelöscht, Bestände wieder aktualisiert usw. Wenn aber nun SÜ auch immer auf diese checkout_success.php verlinkt, passiert das was passieren muss! Die Bestellungen werden gelöscht, da diese als Temp-Order in der Session sind. Ich habe jetzt in der /callback/sofort/ressources/script/sofortReturn.php in Zeile 35 den Link von checkout_process.php auf checkout_success.php geändert! Und siehe da, es funktioniert bestens. Kann mir einer erklären weshalb man: 1. die Weiterleitungen hart-codiert??? 2. auf die checkout_process.php verlinkt??? SÜ kanns mir nicht erklären......
Hallo, der doppelte Durchlauf der checkout_process ist ganz normal, wenn tmpOrders verwendet wird. Die Idee ist, dass beim ersten Durchlauf die Bestellung angelegt wird, damit beim Aufruf von payment_action() im Zahlungsmodul eine orders_id zur Verfügung steht. In payment_action() findet dann (der Intention nach) eine Weiterleitung zum Zahlungsdienstleister statt. Deswegen setzt man dabei auch den Erfolgs-Link auf checkout_process, damit dadurch der zweite Durchlauf angestoßen wird, bei dem dann send_orders, after_process() u. dgl. abgehandelt wird. Dass man diese Erfolgs- und Abbruch-URLs auch im Händler-Portal setzen kann, diese aber von niedrigerer Priorität sind als die von der Schnittstelle übertragenen, ist gängig, das machen ziemlich viele Zahlungsdienstleister so. Das dient meist dazu, stark vereinfachte Integrationen zu ermöglichen, bei denen kein ganzen eCommerce-System zur Verfügung steht.
OK, das klingt logisch! Allerdings ist es mit dieser Konstellation nicht möglich, dem wirren anlegen von Temporären Orders Herr zu werden. Wenn die Erfolgs-Links wenigstens einen eindeutigen Parameter mitbringen würden, sodas man dort in der checkout_process.php eindeutig die Aufrufe zuordnen könnte (ob erst-Aufruf oder Erfolg-Aufruf), wäre es bedeutend einfacher dies zu händeln.... So wie es sich jetzt gestaltet ist das mehr als unschön, da ich ja nun für o.g. Änderung auch die Zahlungsmodule durcharbeiten muss. Aber wir haben ja bald Weihnachten und deshalb wünsch ich mir eine saubere Aufteilung von checkout_process und checkout_success!!! Alles vor dem Zahlvorgang kommt in die checkout_process und alles danach in die success. Das wäre von der Ablaufstruktur richtig sauber!
Ja, das wäre ja auch in normalen Shop so richtig aber ich hab den ganzen Krahm "nach Payment" in die success ausgelagert, incl. Mail-Versand. Aber egal, ich bekomm das schon so hin, wie ich das will....
Dabei muss man aber sehr vorsichtig sein, dass der Kunde per F5 auf der checkout_success keine seltsamen Effekte bewirken kann.
Sooooo, Version aktualisiert. http://www.gambio-forum.de/threads/17976-Tempor%E4re-Bestellungen-l%F6schen?p=146367#post146367 jetzt junzt das..... Und alles wieder aus der success in die process gepackt. PS: Wo ein Wille ist, ist auch ein Weg!
Was noch fehlt ist ein PHP: xtc_db_query("DELETE FROM sepa WHERE orders_id = '" . (int) $order_id . "'");
Besser wäre m.E. das wie folgt zu machen, und den Original-Code von "CheckoutProcessProcess.inc.php" nicht in das Overload mit einzubinden, sondern dessen Funktion über PHP: parent::save_order(); zu integrieren. So muss man bei neuen Versionen nicht immer prüfen, ob sich an dem Original-Code evtl. was geändert hat. PHP: <?php/** #########################################################################################################* Project: gambio21* #########################################################################################################* * IS_CheckoutProcessProcess.inc.php* * 25.11.2014 www.indiv-style.de* * Copyright by H&S eCom * @author little Pit(S.B.)* * #########################################################################################################*/class IS_CheckoutProcessProcess extends IS_CheckoutProcessProcess_parent { public function save_order() { parent::save_order(); //Temp-Order löschen Anfang (falls vorhanden) if (isset($_SESSION['mytmp_oID']) && is_int($_SESSION['mytmp_oID'])) { $order_id = $_SESSION['mytmp_oID']; $order_query = xtc_db_query(" SELECT DISTINCT op.orders_products_id, op.products_id, op.products_quantity, opp.products_properties_combis_id, o.date_purchased FROM " . TABLE_ORDERS_PRODUCTS . " op LEFT JOIN " . TABLE_ORDERS . " o ON op.orders_id = o.orders_id LEFT JOIN orders_products_properties opp ON opp.orders_products_id = op.orders_products_id WHERE op.orders_id = '" . xtc_db_input($order_id) . "'"); while ($order = xtc_db_fetch_array($order_query)) { if ($restock == 'on') { /* BOF SPECIALS RESTOCK */ $t_query = xtc_db_query(" SELECT specials_date_added AS date FROM " . TABLE_SPECIALS . " WHERE specials_date_added < '" . $order['date_purchased'] . "' AND products_id = '" . $order['products_id'] . "'"); if ((int) xtc_db_num_rows($t_query) > 0) { xtc_db_query(" UPDATE " . TABLE_SPECIALS . " SET specials_quantity = specials_quantity + " . $order['products_quantity'] . " WHERE products_id = '" . $order['products_id'] . "'"); } // check if combis exists $t_combis_query = xtc_db_query(" SELECT products_properties_combis_id FROM products_properties_combis WHERE products_id = '" . $order['products_id'] . "'"); $t_combis_array_length = xtc_db_num_rows($t_combis_query); if ($t_combis_array_length > 0) { $coo_combis_admin_control = MainFactory::create_object("PropertiesCombisAdminControl"); $t_use_combis_quantity = $coo_combis_admin_control->get_use_properties_combis_quantity($order['products_id']); } else { $t_use_combis_quantity = 0; } if ($t_combis_array_length == 0 || ($t_combis_array_length > 0 && $t_use_combis_quantity == 1)) { xtc_db_query("UPDATE " . TABLE_PRODUCTS . " SET products_quantity = products_quantity + " . $order['products_quantity'] . " WHERE products_id = '" . $order['products_id'] . "' "); } xtc_db_query("UPDATE " . TABLE_PRODUCTS . " SET products_ordered = products_ordered - " . $order['products_quantity'] . " WHERE products_id = '" . $order['products_id'] . "' "); if ($t_combis_array_length > 0 && (($t_use_combis_quantity == 0 && STOCK_CHECK == 'true' && ATTRIBUTE_STOCK_CHECK == 'true') || $t_use_combis_quantity == 2)) { xtc_db_query("UPDATE products_properties_combis SET combi_quantity = combi_quantity + " . $order['products_quantity'] . " WHERE products_properties_combis_id = '" . $order['products_properties_combis_id'] . "' AND products_id = '" . $order['products_id'] . "' "); } // BOF GM_MOD if (ATTRIBUTE_STOCK_CHECK == 'true') { $gm_get_orders_attributes = xtc_db_query(" SELECT products_options, products_options_values FROM orders_products_attributes WHERE orders_id = '" . xtc_db_input($order_id) . "' AND orders_products_id = '" . $order['orders_products_id'] . "' "); while ($gm_orders_attributes = xtc_db_fetch_array($gm_get_orders_attributes)) { $gm_get_attributes_id = xtc_db_query(" SELECT pa.products_attributes_id FROM products_options_values pov, products_options po, products_attributes pa WHERE po.products_options_name = '" . $gm_orders_attributes['products_options'] . "' AND po.products_options_id = pa.options_id AND pov.products_options_values_id = pa.options_values_id AND pov.products_options_values_name = '" . $gm_orders_attributes['products_options_values'] . "' AND pa.products_id = '" . $order['products_id'] . "' LIMIT 1"); if (xtc_db_num_rows($gm_get_attributes_id) == 1) { $gm_attributes_id = xtc_db_fetch_array($gm_get_attributes_id); xtc_db_query("UPDATE products_attributes SET attributes_stock = attributes_stock + " . $order['products_quantity'] . " WHERE products_attributes_id = '" . $gm_attributes_id['products_attributes_id'] . "' "); } } } } require_once(DIR_FS_CATALOG . 'gm/inc/set_shipping_status.php'); set_shipping_status($order['products_id']); } $delete_from='DELETE FROM '; $where=" WHERE orders_id = '" . (int) $order_id . "'"; xtc_db_query($delete_from . TABLE_ORDERS . $where); $t_orders_products_ids_sql = 'SELECT orders_products_id FROM ' . TABLE_ORDERS_PRODUCTS . $where; $t_orders_products_ids_result = xtc_db_query($t_orders_products_ids_sql); while ($t_orders_products_ids_array = xtc_db_fetch_array($t_orders_products_ids_result)) { xtc_db_query("DELETE FROM orders_products_quantity_units WHERE orders_products_id = '" . (int) $t_orders_products_ids_array['orders_products_id'] . "'"); } xtc_db_query($delete_from . TABLE_ORDERS_PRODUCTS . $where); xtc_db_query($delete_from . TABLE_ORDERS_PRODUCTS_ATTRIBUTES . $where); xtc_db_query($delete_from . TABLE_ORDERS_STATUS_HISTORY . $where); xtc_db_query($delete_from . TABLE_ORDERS_TOTAL . $where); xtc_db_query($delete_from . "banktransfer" . $where); xtc_db_query($delete_from . "sepa" . $where); } //Temp-Order löschen Ende $_SESSION['mytmp_oID'] = $_SESSION['tmp_oID']; }}