v2.1.x Eigene Entwicklung fürt zu Fehler bei Sofortüberweisung

Thema wurde von Steffen (indiv-style.de), 10. Dezember 2014 erstellt.

  1. Steffen (indiv-style.de)

    Steffen (indiv-style.de) G-WARD 2013/14/15/16

    Registriert seit:
    30. Juni 2011
    Beiträge:
    5.143
    Danke erhalten:
    1.466
    Danke vergeben:
    452
    Beruf:
    Systemadmin, Webentwickler bei Indiv-Style
    Ort:
    PhpStorm
    #1 Steffen (indiv-style.de), 10. Dezember 2014
    Zuletzt bearbeitet: 10. Dezember 2014
    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......
     
  2. Wilken (Gambio)

    Wilken (Gambio) Erfahrener Benutzer

    Registriert seit:
    7. November 2012
    Beiträge:
    18.737
    Danke erhalten:
    7.310
    Danke vergeben:
    2.208
    Wird geprüft.
     
  3. Anonymous

    Anonymous Erfahrener Benutzer
    Mitarbeiter

    Registriert seit:
    22. Juni 2011
    Beiträge:
    4.760
    Danke erhalten:
    1.749
    Danke vergeben:
    137
    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.
     
  4. Steffen (indiv-style.de)

    Steffen (indiv-style.de) G-WARD 2013/14/15/16

    Registriert seit:
    30. Juni 2011
    Beiträge:
    5.143
    Danke erhalten:
    1.466
    Danke vergeben:
    452
    Beruf:
    Systemadmin, Webentwickler bei Indiv-Style
    Ort:
    PhpStorm
    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!
     
  5. Wilken (Gambio)

    Wilken (Gambio) Erfahrener Benutzer

    Registriert seit:
    7. November 2012
    Beiträge:
    18.737
    Danke erhalten:
    7.310
    Danke vergeben:
    2.208
    Stimmt fast :)
     
  6. Avenger

    Avenger G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
     
  7. Steffen (indiv-style.de)

    Steffen (indiv-style.de) G-WARD 2013/14/15/16

    Registriert seit:
    30. Juni 2011
    Beiträge:
    5.143
    Danke erhalten:
    1.466
    Danke vergeben:
    452
    Beruf:
    Systemadmin, Webentwickler bei Indiv-Style
    Ort:
    PhpStorm
    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.... ;) ;) ;)
     
  8. Anonymous

    Anonymous Erfahrener Benutzer
    Mitarbeiter

    Registriert seit:
    22. Juni 2011
    Beiträge:
    4.760
    Danke erhalten:
    1.749
    Danke vergeben:
    137
    Dabei muss man aber sehr vorsichtig sein, dass der Kunde per F5 auf der checkout_success keine seltsamen Effekte bewirken kann.
     
  9. Steffen (indiv-style.de)

    Steffen (indiv-style.de) G-WARD 2013/14/15/16

    Registriert seit:
    30. Juni 2011
    Beiträge:
    5.143
    Danke erhalten:
    1.466
    Danke vergeben:
    452
    Beruf:
    Systemadmin, Webentwickler bei Indiv-Style
    Ort:
    PhpStorm
    Ähm..... erinnere mich nicht an diesen Akt!!! Das war ein sogenannter "schwarzer Freitag"....... ;)
     
  10. Steffen (indiv-style.de)

    Steffen (indiv-style.de) G-WARD 2013/14/15/16

    Registriert seit:
    30. Juni 2011
    Beiträge:
    5.143
    Danke erhalten:
    1.466
    Danke vergeben:
    452
    Beruf:
    Systemadmin, Webentwickler bei Indiv-Style
    Ort:
    PhpStorm
  11. Avenger

    Avenger G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    Was noch fehlt ist ein

    PHP:
      xtc_db_query("DELETE FROM sepa WHERE orders_id = '" . (int) $order_id "'");
     
  12. Avenger

    Avenger G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    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 == || ($t_combis_array_length && $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 && (($t_use_combis_quantity == && 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'];
      }
    }