Modul Bestellungen exportieren mit REST API

Thema wurde von Anonymous, 13. Februar 2021 erstellt.

  1. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    19. Juni 2012
    Beiträge:
    4.831
    Danke erhalten:
    1.124
    Danke vergeben:
    947
    #1 Anonymous, 13. Februar 2021
    Zuletzt bearbeitet: 13. September 2022
    Hallo,

    es gibt zwar schon eine Lösung für den Bestellungsexport, der direkt auf die Datenbank zugreift, aber dieser basiert auf der REST API und sollte dementsprechend, wenn man Gambio glauben kann, niemals inkompatibel werden.

    Was macht die Datei?
    Sie ermöglicht dir, von jedem beliebigen Webserver (aber natürlich auch von deinem eigenen) Bestelldaten abzurufen und in eine CSV-Datei zu packen. Dabei kann man nach Datum, Bestellnummer oder Bestellstatus suchen.

    Anwendungsmöglichkeiten:
    • Für den Buchhaltungs-Export, z.B. monatsweise Export oder ab der ersten Bestellnummer des Monats. Denkbar wäre sogar, dass der Steuerberater sich die Daten der Debitorenbuchhaltung von seinem Schreibtisch aus selbst zieht.
    • Für die Erstellung von Paketscheinen
    • Für die Umsatzstatistik
    • Für die Erstellung von Adressdateien für Postwerbesendungen oder Newslettern
    • ...
    Sicherheit:
    Es wird ein Gambio-Zugriffs-Token in der URL abgefragt. Diesen musst du für einen beliebigen Admin aus deinem Gambio Backend erzeugen unter "Kunden->Rollen und Berechtigungen->API Tokens verwalten". Der Aufruf des Scripts muss dann mit dem Token als Parameter "sec" aufgerufen werden, also z.B. (Link nur für registrierte Nutzer sichtbar.). Da der Token sehr lang ist, empfehle ich ein Bookmark. Ich empfehle außerdem, die Datei in einen separaten Ordner mit einem Verzeichnisschutz abzulegen.

    Installation & Konfiguration:
    Das Modul besteht aus nur einer Datei, das im Kopf-Bereich ein paar Konfigurationsmöglichkeiten bietet:


    Nach getätigten Eingaben muss die Datei nur noch irgendwo hin hochgeladen werden und dann mit (Link nur für registrierte Nutzer sichtbar.)MeinErstellterGambioAdminToken aufgerufen werden.

    Ein Wort zum Stand der Technik:
    Gambio mag keine direkten Zugriffe auf die Datenbank und empfiehlt die REST API. Gambio mag aber auch keinen Datenaustausch per CSV. Dieses Modul ist also als Brückentechnologie zu verstehen, für diejenigen, deren Steuerberater, Warenwirtschaften, ... noch keine API-Integration ermöglichen.

    Cloud-Kunden:
    Können das auch benutzen, so lange sie diese Datei irgendwo hochladen können.

    Disclaimer:
    Es kann am Shop nichts kaputtgehen, da keine Dateien vom Shop-Kern überschrieben oder überladen werden. Dennoch: Das Ding ist gratis. Ich schenke es und schließe jegliche Haftung, Support oder Gewährleistung aus. Der Form halber empfehle ich trotz allem vor Inbetriebnahme eine komplette Shopsicherung.

    VG und viel Spaß!

    -- Download wird nicht mehr für die Allgemeinheit angeboten --
     
  2. markus_wick

    markus_wick Erfahrener Benutzer

    Registriert seit:
    10. Oktober 2018
    Beiträge:
    976
    Danke erhalten:
    217
    Danke vergeben:
    153
    Sehr cool, danke!
    Klitzekleiner Fehler in Zeile 32:

    Code:
    echo '<h1>Bestellungsexport</h2>';
    Das Hintere sollte </h1> sein, oder?
     
  3. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    19. Juni 2012
    Beiträge:
    4.831
    Danke erhalten:
    1.124
    Danke vergeben:
    947
    Jo, das stimmt. Habe ich in der Datei im Eingangspost gerade angepasst.
     
  4. Anonymous

    Anonymous Administrator
    Mitarbeiter

    Registriert seit:
    26. April 2011
    Beiträge:
    1.757
    Danke erhalten:
    1.370
    Danke vergeben:
    305
    @L & B Hab mir das Script kurz angeschaut und ich empfehle keine Login Daten in der PHP Datei zu speichern.

    Da die API auch ein Token nutzen kann statt E-Mail und Passwort empfehle ich das Script entsprechend anzupassen.

    Man muss um die API dann zu nutzen im Gambio Admin unter "Kunden->Rollen und Berechtigungen->API Tokens verwalten" für einen Admin ein Token anlegen. Die Gültigkeit des Tokens kann dort selbt bestimmt werden und man kann mit dem Token dann ohne E-Mail und Passwort zugreifen.

    Der Vorteil es wird keine E-Mail und Passwort im PHP Script benötigt, der Token kann per URL übergeben werden, dann braucht man selbst im Script auch kein Token mehr.

    PHP:
    $request->setHeader(array(
      
    'Content-Type' => 'application/json',
      
    'Authorization' => 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJodHRwczpcL1wvdHQuc3VwcC5nYW1iaW8tc2VydmVyLm5ldCIsImV4cCI6MTkyODY4NzI1MiwiaWF0IjoxNjEzMzI3MjUyLCJjdXN0b21lcl9pZCI6MX'
    ));
     
  5. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    19. Juni 2012
    Beiträge:
    4.831
    Danke erhalten:
    1.124
    Danke vergeben:
    947
    Ok danke für den Tipp. Habe ich umgesetzt und die Datei im ersten Post aktualisiert.
     
  6. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    13. Mai 2019
    Beiträge:
    492
    Danke erhalten:
    234
    Danke vergeben:
    156
    Hallo @L & B !

    Ich wollte direkt zwei Daumen für den Post geben. Vielen Dank, damit kann ich auf jeden Fall einiges anfangen. Leider habe ich es noch nicht zum Laufen gebracht. Gibt es eine spezielle php-Version mit der man das verwenden sollte? Mir gibt das nur eine weiße Seite unter der Überschrift (Bestellungsexport) aus.

    Ich habe erst einen API Token von einem Benutzer erzeugt, der Packtisch heisst und den ich bisher für den Export von Bestellungen für GLS nutze. Dann habe ich es nochmal mit einem Token vom Super-Administrator probiert, aber daran lag es scheinbar nicht. Token ist scheinbar richtig, habe bewusst mal einen falschen genutzt um die Fehlermeldung zu provozieren.
     
  7. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    19. Juni 2012
    Beiträge:
    4.831
    Danke erhalten:
    1.124
    Danke vergeben:
    947
    Hallo Til,

    also wenn du einen falschen Token angibst bekommst du eine andere Seite als wenn du den richtigen angibst? Oder ist die Seite immer weiß?

    Kannst du mal prüfen,
    • dass du die Domain mit abschließenden / angegeben hast wie im Beispiel?
    • dass dein Token nur Zahlen, Buchstaben, Bindestriche, Unterstriche und Punkte enhält?
    • dass du in den drei Konfigurationsfeldern überall die Anführungszeichen hast und am Ende das Semikolon?
    • dass du überall vor den Erläuterungen // beibehalten hast (zur Auskommentierung)?

    Spezielle Anforderungen zur PHP-Version gibt es nicht. Müsste von 7.0 aufwärts alles gehen.
     
  8. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    13. Mai 2019
    Beiträge:
    492
    Danke erhalten:
    234
    Danke vergeben:
    156
    Wenn der Token falsch ist, kommt unter der Überschrift die Fehlermeldung: "Zugriff verweigert! Token falsch!". Mit richtigem Token bleibt die Seite unter der Überschrift weiß.

    Habe ich alles geprüft. token hat Zahlen, große und kleine Buchstaben, Punkte und Bindestriche. Domain mit .eu/ und die Syntax hab ich nicht kaputt gemacht. Bearbeite das aber auch mit Sublime Text mit Syntax Highlighting, da fällt sofort auf wenn man da Anführungsstriche weglässt.

    PHP-Version ist übrigens 7.3.26.
     
  9. Anonymous

    Anonymous Administrator
    Mitarbeiter

    Registriert seit:
    26. April 2011
    Beiträge:
    1.757
    Danke erhalten:
    1.370
    Danke vergeben:
    305
    @L & B Ich hab noch festgestellt, dass du die folgende Klassen nutzt:

    PHP:
            $client = new http\Client;
                    
    $request = new http\Client\Request;
    Das ist nicht in jeder PHP Version inkl. eventuell sollte man noch eine Alternative mit cURL anbieten wenn die Klassen nicht vorhanden sind.
     
  10. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    19. Juni 2012
    Beiträge:
    4.831
    Danke erhalten:
    1.124
    Danke vergeben:
    947
    Ist denn cURL in jeder PHP Version vorhanden? Dann vielleicht komplett darauf umbauen? Wüsste gerade nicht wie man das als Alternative machen kann, ohne dass man zwei Dateien verwendet?
     
  11. Wilken (Gambio)

    Wilken (Gambio) Erfahrener Benutzer

    Registriert seit:
    7. November 2012
    Beiträge:
    18.737
    Danke erhalten:
    7.310
    Danke vergeben:
    2.208
    Curl ist normal immer vorhanden.
     
  12. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    19. Juni 2012
    Beiträge:
    4.831
    Danke erhalten:
    1.124
    Danke vergeben:
    947
    Mit CURL schaffe ich es nicht. Was ist denn an dieser Suche falsch?


    Code:
                        $curl = curl_init();
                        curl_setopt_array($curl, array(
                          CURLOPT_URL => $domain ."api.php/v2/orders/search",
                          CURLOPT_RETURNTRANSFER => true,
                          CURLOPT_ENCODING => "",
                          CURLOPT_MAXREDIRS => 10,
                          CURLOPT_TIMEOUT => 30,
                          CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
                          CURLOPT_CUSTOMREQUEST => "GET",
                          CURLOPT_POSTFIELDS => "{\"search\": {\"greater\": {\"orders.orders_date_purchased\": \"2021-02-14\"}}}",
                          CURLOPT_HTTPHEADER => array(
                            "accept: application/json",
                             "authorization: Bearer " . $gtoken,
                            "content-type: application/json"
                            ),
    
                        ));
    Läuft in einen Timeout, so dass ich vermute, dass die CURLOPT_POSTFIELDS nicht greifen? Wenn ich den Timeout auf 300 stelle, dann läufts durch, aber ohne Treffer.

    Habe mich hieran orientiert:
    (Link nur für registrierte Nutzer sichtbar.)
     
  13. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    19. Juni 2012
    Beiträge:
    4.831
    Danke erhalten:
    1.124
    Danke vergeben:
    947
    Oder geht das mit der Authorization bei CURL anders?
     
  14. Anonymous

    Anonymous Administrator
    Mitarbeiter

    Registriert seit:
    26. April 2011
    Beiträge:
    1.757
    Danke erhalten:
    1.370
    Danke vergeben:
    305
    @L & B setzte mal
    PHP:
    CURLOPT_POSTREDIR => 3,
    bei mir hat damit der cURL funktioniert. Das Problem hier wurde umgeleitet, wobei die POST Daten verloren gingen, damit cURL der Umleitung folgt und die POST Daten erneut nach der Umleitung sendet muss oben gegebener Parameter gesetzt werden.
     
  15. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    19. Juni 2012
    Beiträge:
    4.831
    Danke erhalten:
    1.124
    Danke vergeben:
    947
    Danke, aber das war noch nicht des Rätsels Lösung bei mir...
     
  16. Anonymous

    Anonymous Administrator
    Mitarbeiter

    Registriert seit:
    26. April 2011
    Beiträge:
    1.757
    Danke erhalten:
    1.370
    Danke vergeben:
    305
    @L & B mit folgenden Parametern hat es bei mir ohne Probleme funktioniert:

    PHP:
     CURLOPT_RETURNTRANSFER => 1,
      
    CURLOPT_ENCODING => '',
      
    CURLOPT_MAXREDIRS => 10,
      
    CURLOPT_TIMEOUT => 30,
      
    CURLOPT_FOLLOWLOCATION => 1,
      
    CURLOPT_POSTREDIR => 3,
      
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
      
    CURLOPT_CUSTOMREQUEST => 'POST',
      
    CURLOPT_POST            => 1,
      
    CURLOPT_POSTFIELDS => $data,
      
    CURLOPT_SSL_VERIFYHOST => 0,
      
    CURLOPT_SSL_VERIFYPEER => 0,
      
    CURLOPT_VERBOSE        => 1,
      
    CURLOPT_HTTPHEADER => array(
        
    'Authorization: Bearer '.$sec,
        
    'Content-Type: application/json'
      
    )
     
  17. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    19. Juni 2012
    Beiträge:
    4.831
    Danke erhalten:
    1.124
    Danke vergeben:
    947
    Ok, ich hatte versehentlich GET statt POST, und die Formatierung von $data war auch falsch. Ich hatte schön artig alle " escaped. Mit der Hilfe von @Till (Gambio) läufts jetzt über CURL, vielleicht dann auch bei @Til . Datei-Update im ersten Post.

    VG
     
  18. KlausK

    KlausK Erfahrener Benutzer

    Registriert seit:
    7. Oktober 2012
    Beiträge:
    556
    Danke erhalten:
    110
    Danke vergeben:
    21
    In meinem Shop GX v4.3.3.1 mit PHP 7.4.80 will es einfach nicht funktionieren.
    Das Script lässt sich aufrufen, Eingabefelder, Buttons, alles da. Nach Klick auf einem Button, werde ich direkt auf meine Startseite geleitet. In der Adressleiste steht dann:
    Code:
    https://meinshop.de/mods/orders_export?automatic=1&sec=TOKEN&action=1&id=2021-02-08&Submit=Bestellungen+exportieren
    Es wird keine Datei angelegt. Auch in den Logs lässt sich nichts finden.
    Eigentlich sollten ja einige Meldungen angezeigt werden :(
    Code:
    GX v4.3.3.1
    PHP 7.4.80
    MySQL 5.5.62
    cURL support enabled
    cURL Information 7.38.0
     
  19. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    19. Juni 2012
    Beiträge:
    4.831
    Danke erhalten:
    1.124
    Danke vergeben:
    947
    (Link nur für registrierte Nutzer sichtbar.).php?automatic=1&sec=TOKEN&action=1&id=2021-02-08&Submit=Bestellungen+exportieren

    Es hatte sich in der letzten Aktualisierung noch ein Fehler eingeschlichen. Bitte aus dem 1. Post nochmal die orders_export.php neu herunterladen.

    VG
     
  20. KlausK

    KlausK Erfahrener Benutzer

    Registriert seit:
    7. Oktober 2012
    Beiträge:
    556
    Danke erhalten:
    110
    Danke vergeben:
    21
    So, erstmal ein DANKE für das Script.
    Da Till und Wilken nix zu meckern hatten, gehe ich davon aus, dass es bzgl. zukünftiger Änderungen am Shopsystem weitgehend Updatesicher sein wird!?

    Ich habe mir nun ein paar Datensätze exportiert. Ein Kunde hat jedoch seine Straße auch im zusätzlichen Adressfeld angelegt und mit einem Zeilenumbruch "2. OG" eingefügt.
    Der Datensatz verteilt sich nach dem Export dann auf 4 Datensätze:
    Code:
    10989441,2,"2021-02-15 19:13:23",EUR,,401,paypal3,freeamount_freeamount,max.muster@gmx.net,017612345678,Max,Muster,,"Karl-Firlefanz-Str. 12 1/4",,"Karl-Firlefanz-Str. 12 1/4
    2. OG",10550,Berlin,81,Max,Muster,,"Karl-Firlefanz-Str. 12 1/4",,"Karl-Firlefanz-Str. 12 1/4
    2. OG",10550,Berlin,81,Max,Muster,,"Karl-Firlefanz-Str. 12 1/4",,"Karl-Firlefanz-Str. 12 1/4
    2. OG",10550,Berlin,81,759,637.82,19,https://MeineDomain.de/api.php/v2/orders/10034441/tracking_codes
    
    Ich vermute mal, dass LineFeed und Return gefiltert werden müssen.