Ankündigung

Einklappen
Keine Ankündigung bisher.

Saferpay -> Übergabe der Bestellnummer

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Saferpay -> Übergabe der Bestellnummer

    Habe ja mal vor ca. zwei Monaten eine Payment-Modul-Version für OS-Commerce umgearbeitet für die Verwendung in ZC.

    Jetzt ist mir vorerst noch ein Problem übrig geblieben.

    Saferpay bietet die Möglichkeit, dass man, zwecks leichterer Zuordnung der einzelnen Zahlungen zu den im Shop getätigten Einkäufen, an Saferpay eine Referenznummer bei jeder Transaktion übermitteln kann. Die im Idealfall mit der orders_id aus der Tabelle orders der DB befüllt wird.

    Im Code der entsprechenden Datei sieht das so aus:
    Code:
    $query  = $db->Execute("SELECT MAX(orders_id)+1 as new_id FROM " . TABLE_ORDERS);
        $this->orderid = '1';
    
        if ( $query->RecordCount() > 0)
        {
          $orders = $db->Execute("SELECT MAX(orders_id)+1 as new_id FROM " . TABLE_ORDERS);
          if ( isset($orders['new_id']) && (int)$orders['new_id'] > 0 )
            $this->orderid = $orders['new_id'];
            //$this->orderid = '45';
        } else {
          $db->Execute("alter table " . TABLE_ORDERS . " auto_increment=1");
        }
        // order_id + Time  XXX_HHMMSS 
        $this->orderid .= '_' . date("YmdHis");
    Bei mir funktioniert das insoweit als sich der Prozess bis zur Zeile
    Code:
            $this->orderid = $orders['new_id'];
            //$this->orderid = '45';
    durcharbeitet und aber in diesem IF-Zweig aus mir unerfindlichen Gründen die Anweisung
    Code:
    $this->orderid = $orders['new_id'];
    nicht bzw. fehlerhaft ausführt. An Saferpay wird immer nur die 1 übermittelt, die ganz oben in dem Code per
    Code:
    $this->orderid = '1';
    festgelegt wurde.

    Wenn ich die Zeile //$this->orderid = '45'; auskommentiere, wird an Saferpay die 45 übertragen. Ganz eindeutig sind also die Voraussetzungen so, dass genau dieser Zweig durchlaufen wird.

    Wenn ich nur das SQL-Statement
    Code:
    SELECT MAX(orders_id)+1 as new_id FROM orders
    im SQL-Eingabefeld der DB ausführen lasse, erhalte ich auch genau die richtige Zahl als Ergebnis.

    Für mich ein Rätsel! Der ganze Code scheint zu stimmen, aber die Übergabe findet nicht richtig statt.

    Wer kann mir helfen?

    Danke euch

    Smartsoul

    #2
    Hmm, also wenn ich mir mal so die Vorgehensweise in anderen Zen-Cart Erweiterungen ansehe, das ist die Übergabe der Werte scheinbar zwischen OSC und ZC etwas anders.

    Versuche mal bitte folgende Zeile
    Code:
    $this->orderid = $orders->fields['new_id'];
    Gruß
    MaleBorg

    Kommentar


      #3
      Hi MaleBorg!

      Wir saßen gestern Abend noch bis Mitternacht an der sache dran und konnten uns nicht erklären, warum in der Übergabe offenbar überhaupt nichts drin stand.

      Bis wir dann genau die von dir vorgeschlagene Änderung vorgenommen haben:
      Code:
          $query  = $db->Execute("SELECT MAX(orders_id)+1 as new_id FROM " . TABLE_ORDERS);
          $this->orderid = '1';
      
          if ( $query->RecordCount() > 0)
          {
      
            $orders = $db->Execute("SELECT MAX(orders_id)+1 as new_id FROM " . TABLE_ORDERS);
            if ( isset($orders->fields['new_id']) && (int)$orders->fields['new_id'] > 0 )
              $this->orderid = $orders->fields['new_id'];
          } else {
            $db->Execute("alter table " . TABLE_ORDERS . " auto_increment=1");
          }
          // order_id + Time  XXX_HHMMSS 
          $this->orderid .= '_' . date("YmdHis");
      Seitdem klappt die Übergabe der Artikelnummer an Saferpay.

      Leider haben wir dann in weiteren Tests festgestellt, dass die Prüfung der Zonen wohl auch nicht ganz dasselbe wie in ZC ist und die Kartenzahlung dann nur den Schweizer Kunden zur Verfügung stand und nicht allen wie beabsichtigt.

      Habe den Aufruf der Funktion, da für meine Zwecke nicht zwingend notwendig, jetzt einfach herausgenommen und somit kann jetzt jeder Kunde (egal aus welcher Zone) mit Karte zahlen.

      Aber vielleicht magst du mal drüber schauen:

      Code:
          function update_status() {
          global $order, $db;
      
              if ( ($this->enabled == true) && ((int)MODULE_PAYMENT_SAFERPAYGW_ZONE > 0) ) {
            $check_flag = false;
            $check_query = $db->Execute("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_SAFERPAYGW_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id");
            while (!$check->EOF) {
              if ($check['zone_id'] < 1) {
                $check_flag = true;
                break;
              }
              elseif ($check['zone_id'] == $order->billing['zone_id']) {
                $check_flag = true;
                break;
              }
              $check->MoveNext();
            }
      
            if ($check_flag == false) {
              $this->enabled = false;
            }
          }
          }
      Vielleicht ist ja das selbe Problem der Übergabe mit fields?

      Danke wie immer für dein Engagement

      Smartsoul

      Kommentar


        #4
        Nicht ganz, leider ist das der gleiche Fehler wie in der Rechnung ab xter Bestellung Contrib.

        Ein Variablenname ist falsch und schon funktioniert das Ganze nicht mehr :( Dürfte im Übrigen auch nicht in OSC funktionieren, ist aber wohl niemanden bisher aufgefallen *g*

        Ändere mal bitte

        Code:
        $check_query = $db->Execute("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_SAFERPAYGW_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id");
        in

        Code:
        $check = $db->Execute("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_SAFERPAYGW_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id");
        Einzige Änderung die Variable heisst nun $check und nicht $check_query. Denn die weiteren Zeilen beziehen sich immer nur auf die Variable $check

        Um ganz sicher zu gehen, schnapp dir einfach ein anderes Zahlungsmodul und vergleiche die oberen Zeilen. Da in jedem Zahlungsmodul eine Gültigkeitszone angegeben werden kann, ist die Abfrage bei jedem gleich.

        Gruß
        MaleBorg

        Kommentar


          #5
          Wir sind auch gerade dabei, ein OSC Zahlungsmodul anzupassen. Eine weitere Klippe war, dass statt der Variable $payment im Zencart $_SESSION['payment'] verwendet werden muss.

          Kommentar


            #6
            Hi MaleBorg!

            Stimmt, die Variable in der das Ergebnis der SQL-Abfrage gespeichert wurde war anders benannt als die, die in der Funktion dann weiter verwendet wurde.
            Aber die Übergabe der Daten fand in der Funktion auch wieder ohne fields statt. Nach Vergleich mit dem funktionierenden invoice.php habe ich es dann so geändert:

            Code:
                function update_status() {
                global $order, $db;
            
                    if ( ($this->enabled == true) && ((int)MODULE_PAYMENT_SAFERPAYGW_ZONE > 0) ) {
                  $check_flag = false;
                  //$check_query = $db->Execute("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_SAFERPAYGW_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id");
                  $check = $db->Execute("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_INVOICE_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id");
                  while (!$check->EOF) {
                    if ($check->fields['zone_id'] < 1) {
                      $check_flag = true;
                      break;
                    }
                    elseif ($check->fields['zone_id'] == $order->billing['zone_id']) {
                      $check_flag = true;
                      break;
                    }
                    $check->MoveNext();
                  }
            
                  if ($check_flag == false) {
                    $this->enabled = false;
                  }
                }
                }
            Bin jetzt aber drauf gekommen, dass meine Kunden aus der Zone 2 (alle EU-Länder) immer dann nicht per Kreditkarte zahlen können, wenn sie die Währung CHF im Shop ausgewählt haben. Unabhängig davon, ob ich die function update_status aufrufe oder nicht.
            Sie können nur per Kreditkarte bezahlen, wenn sie im Shop die Währung auf Euro umgestellt haben.

            Hast du einen Erklärungsansatz für dieses Phänomen?

            THX und Gruß

            Smartsoul

            Kommentar


              #7
              Mir wurde gerade mitgeteilt, dass in der Schweiz die kleinste Währungseinheit 5 Rappen sind und es somit laut Definition nur Preise geben kann, die auf 0 oder 5 enden.

              Dadurch, dass aber in dem Shop Kunden einkaufen, die von außerhalb der Schweiz kommen und denen keine MwSt. verrechnet werden darf, werden aus den schönen Brutto hässliche und unbrauchbar krumme Nettozahlen, die von Saferpay zurückgewiesen werden.

              Meine Idee war nun, im Modul order_total einen Umbau vorzunehmen, der einerseits checkt, ob die MwSt. gleich null ist und dann den Endbetrag auf 5 oder 0 rundet.

              Ist das ein guter Ansatz?

              Oder ist es besser zu checken, ob der Kunde aus der Euro-Zone kommt und als Währung CHF eingestellt hat und dann den Endbetrag zu runden.

              Oder gibt es elegantere Lösungen?

              Gruß

              smartsoul

              Kommentar


                #8
                Puh, also bei order_total streikt mein Hirn. Den Aufbau dort hab ich bisher noch nicht verarbeiten können.

                Aber ich denke mal dein Lösungsansatz ist soweit richtig. jedenfalls würde ich es auch so versuchen.

                Das Problem mit der Währung müsste ich testen, das kann jetzt allerdings etwas dauern.

                Gruß
                MaleBorg

                Kommentar

                Info zu diesem Forenarchiv:
                Mit Release von 1.5.7 wurde die deutsche Zen Cart Version auf eine reine DIY-Lösung umgestellt.
                Für einen Support via Forum stehen keine personellen und zeitlichen Ressourcen mehr zur Verfügung.
                Dieses Supportforum bleibt im Nur-Lesen-Modus als Wissensarchiv noch online verfügbar.
                PM Funktionalität, Registrierung und Posten neuer Beiträge sind deaktiviert.
                Zugriff auf Anhänge in den Postings ist auch ohne Registrierung/Einloggen möglich.
                FAQ und Downloadbereich des Forums wurden in die neue umfangreiche Knowledgebase auf der zen-cart-pro.at Website übernommen.

                Das Development der deutschen Zen Cart Version geht wie bisher auf Github weiter.
                Wir werden auch weiterhin neue Versionen bereitstellen und die Onlinedokumentation/Knowledgebase aktualisieren.
                Fehler in der Software können auf Github als Issues gemeldet werden.
                Follow us
                aktuelle version
                Zen Cart 1.5.7g deutsch
                vom 12.12.2023
                [Download]
                Lädt...
                X