Ankündigung

Einklappen
Keine Ankündigung bisher.

PayPal IPN Listener soll weiteren Script auswführen - funktioniert nicht

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

  • PayPal IPN Listener soll weiteren Script auswführen - funktioniert nicht

    Guten Morgen liebes Forum,

    ich habe gestern stundenlang an einer kleinen PHP-Anwedung gebastelt die auf die Instant Notifications (IPN) von PayPal reagieren soll. Das ist ein Service von PayPal der bei jeder eingehenden Transakation ein Script auf der Webseite ausführt. Soweit so gut. Über den IPN Simulator kann man in der Sandbox Umgebung eine eingehende Transaktion simulieren. In meinem Script lasse ich mir die Daten, bei einem verifizierten Kauf, in einer externen Datei
    Code:
    ipn_errors.log
    loggen. Das Script funktioniert soweit. Außer dem Logging möchte ich jetzt aber ein weiteres Script ausführen, welches die E-Mail Adresse des Käufers über eine weitere Schnittstelle "Acuity Scheduling API" - unser Programm für Terminverwaltungen - in die Datenbank des Anbieters einfügt und automatisch ein Paket hinterlegt. Wenn ich das API-Script gesondert ausführe wird funktioniert alles, sobald ich aber das API-Script in meinem IPN Programm ausführen lassen, erscheinen keine neuen E-Mail Adressen in meinem Acuity Scheduling Dashboard.

    Links:
    Code:

    - PayPal IPN führt dieses Script nach einer eingehenden Transaktion aus. Die Datei
    Code:
    IpnListener.php
    liegt bei mir auf dem Server und kommt direkt von PayPal's Github.

    PHP-Code:
    <?php

    /*
     * This script verifies and logs to a file all received IPN requests.
     * You can use it with PayPal IPN Simulator, just upload it to your server
     * and specify its path as IPN handler URL:
     * https://developer.paypal.com/developer/ipnSimulator/
     *
     * Make sure that your web server has write access to the folder with this script,
     * otherwise you won't see any logs being created.
     */

    include(dirname(dirname(__FILE__)).'/src/IpnListener.php');

    use 
    dezlov\PayPal\IpnListener;

    $listener = new IpnListener();
    $listener->use_sandbox true;

    $error null;
    $verified $listener->tryProcessIpn(null$error);
    $report $listener->getTextReport();
    ipn_log($verified$report$error);

    function 
    ipn_log($verified$report$error)
    {
        
    // Kauf wurde verifiziert, führe Script aus
        
    if ($verified)
        {
            
    $filename 'ipn_verified.log';
            
    $content $report;

            
    // Hole die E-Mail des Käufers
            
    $payer_email $_POST['payer_email'];

            
    // Lade 10er-Karten Script
            
    include(dirname(dirname(__FILE__)).'/controller/healformCard.php');

            
    // Füge dem Käufer eine neue 10er-Karte (product) hinzu
            
    $appointment $acuity->request('/certificates', array(
          
    'method' => 'POST',
          
    'data' => array(
            
    'productID'     => 425193,
            
    'email'       => $payer_email
          
    )
            ));

        }
        else
        {
            
    $filename 'ipn_errors.log';
            
    $content 'ERROR: '.$error.PHP_EOL.$report;
        }
        
    file_put_contents($filename$contentFILE_APPEND LOCK_EX);
    }
    - Die Datei
    Code:
    healformCard.php
    lädt das Acuity Scheduling PHP SDK und fügt meine API Zugangsdaten ein.

    PHP-Code:
    <?php

        
    // Lade das Acuity Scheduling SDK
        
    include(dirname(dirname(__FILE__)).'/src/AcuityScheduling.php');

        
    // Setze API Zugangsdaten
        
    $userId 'x';
        
    $apiKey 'x';

        
    $acuity = new AcuityScheduling(array(
          
    'userId' => $userId,
          
    'apiKey' => $apiKey
        
    ));
    Wie gesagt, das Logging funktioniert, PayPal erkennt also das Script und führt es aus, jedoch funktioniert das Hinzufügen einer 10er-Karte im Acuity Scheduling Backend nicht.
    Ich hoffe mir kann jemand helfen.

    Beste Grüße,
    dmnktoe


  • #2
    "funktioniert nicht" ist halt keine brauchbare Fehlerbeschreibung. Debugging betreiben, Fehlerlog anschauen, Variablen ausgeben/mitloggen, usw.

    Kommentar


    • #3
      Zitat von hellbringer Beitrag anzeigen
      "funktioniert nicht" ist halt keine brauchbare Fehlerbeschreibung. Debugging betreiben, Fehlerlog anschauen, Varaiblen ausgeben/mitloggen, usw.
      PayPal IPN hat in dem Sinne keine Ausgabe, ich weiß absolut nicht wo ich genau anfangen soll zu debuggen. Das macht es mir sehr schwer, bin auch noch ein ziemlicher Anfänger - aber bin für jede Hilfe dankbar!

      Kommentar


      • #4
        Es bleibt bei dem, das ich geschrieben habe. Fehlerlog anschauen und Variablen mitloggen. Und wenn du nicht weißt, wo du anfangen sollst, dann halt überall. Wenns sein muss in jeder Zeile. Besser zu viel als zu wenig.

        Kommentar


        • #5
          Wie und wo soll ich loggen? Ich habe ja keine Ausgabe - das Programm wird im Hintergrund ausgeführt. In meinen Serverlogfiles sehe ich leider auch keine Fehlermeldung!
          Code:
          my.healform.de anon-173-0-80-11.paypal.com - - [06/Feb/2018:09:53:54 +0100] "POST /controller/listener.php HTTP/1.1" 200 - "-" "Needle/1.6.0 (Node.js v4.8.7; linux x64)"
          Der Listener ist mein PHP-Programm was auch das API-Script ausführen soll.

          Kommentar


          • #6
            Zitat von dmnktoe Beitrag anzeigen
            Wie und wo soll ich loggen?
            In der PHP-Datei. z.B.:

            PHP-Code:
            function _log(array $values) {
                
            $values['timestamp'] = date('c');
                
            file_put_contents(__DIR__ '/log.txt'var_export($valuestrue) . PHP_EOLFILE_APPEND);

            PHP-Code:
            _log(['__LINE__' => __LINE__'$foo' => $foo'$bar' => $bar]); 

            Kommentar


            • #7
              Tut mir leid, aber bin jetzt ein bisschen überfragt.

              PHP-Code:
              <?php

              include(dirname(dirname(__FILE__)).'/src/IpnListener.php');

              use 
              dezlov\PayPal\IpnListener;

              $listener = new IpnListener();
              $listener->use_sandbox true;

              $error null;
              $verified $listener->tryProcessIpn(null$error);
              $report $listener->getTextReport();
              ipn_log($verified$report$error);

              function 
              ipn_log($verified$report$error)
              {
                  
              // Kauf wurde verifiziert, führe Script aus
                  
              if ($verified)
                  {

                      
              // Hole die E-Mail des Käufers
                      
              $payer_email $_POST['payer_email'];

                      
              // Lade 10er-Karten Script
                      
              require('healformCard.php');

                      
              // Füge dem Käufer eine neue 10er-Karte (product) hinzu
                      
              $appointment $acuity->request('/certificates', array(
                    
              'method' => 'POST',
                    
              'data' => array(
                      
              'productID'     => 425193,
                      
              'email'       => $payer_email
                    
              )
                      ));

                      function 
              _log(array $values) {
                      
              $values['timestamp'] = date('c');
                      
              file_put_contents(__DIR__ '/log.txt'var_export($valuestrue) . PHP_EOLFILE_APPEND);
                      }

                      
              _log(['__LINE__' => __LINE__'$foo' => $foo'$bar' => $bar]);  

                      
              $filename 'ipn_verified.log';
                      
              $content $report;

                  }
                  else
                  {
                      
              $filename 'ipn_errors.log';
                      
              $content 'ERROR: '.$error.PHP_EOL.$report;
                  }
                  
              file_put_contents($filename$contentFILE_APPEND LOCK_EX);
              }
              Ich habe eine Datei mit dem Namen "log.txt" erstellt, wenn ich das Script über PayPal ausführe wird diese leider nicht beschrieben.

              Kommentar


              • #8
                Dann kommt das Script niemals zu dieser Code-Stelle.

                Kommentar


                • #9
                  Hast du das bisherige Skript selbst geschrieben?
                  Du versucht eine Funktion in einer anderen Funktuion zu definieren, das wird nicht funktionieren. (Spätestens hier solltest du auch einen Fehler im errorlog sehen)

                  edit: Mein Fehler, das funktioniert in der Tat, sah für mich nur komisch aus. Dessen ungeachtet würde ich der übersicht halber die Funktion an einer anderen Stelle definieren. Ob die Methode log() aufgerufen werden kann hängt jetzt nämlich davon ab, ob die Methode ipn_log() aufgerufen wird.

                  Kommentar


                  • #10
                    Zitat von ChromOxid Beitrag anzeigen
                    edit: Mein Fehler, das funktioniert in der Tat, sah für mich nur komisch aus. Dessen ungeachtet würde ich der übersicht halber die Funktion an einer anderen Stelle definieren. Ob die Methode log() aufgerufen werden kann hängt jetzt nämlich davon ab, ob die Methode ipn_log() aufgerufen wird.
                    Ja, aber was ich mich erinnern kann ist die dann auf den Scope der Elternfunktion beschränkt. Dennoch .. nicht machen.

                    Jeder beliebige korrekte PHP-Code kann in einer Funktion vorkommen, sogar andere Funktionen und Klassen-Definitionen.
                    http://php.net/manual/de/functions.user-defined.php
                    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                    PHP.de Wissenssammlung | Kein Support per PN

                    Kommentar


                    • #11
                      Hmm. Ich habe gerade versucht, erst die API Funktion aufzurufen und erst im Anschluss das Logging (jedoch das von PayPal - welches ja sowieso schon funktioniert) auszugeben und die Funktion funktioniert trotzdem. Irgendwie wird der Acuity Request einfach übersprungen.

                      Echt schwierig...

                      Kommentar


                      • #12
                        Zitat von ChromOxid Beitrag anzeigen
                        Hast du das bisherige Skript selbst geschrieben? Du versucht eine Funktion in einer anderen Funktuion zu definieren, das wird nicht funktionieren. (Spätestens hier solltest du auch einen Fehler im errorlog sehen)
                        Ich habe nur den Part mit dem Acuity Request selber geschrieben - dieser funktioniert auch wenn ich das Script auf einer eigenen Seite laufen lasse. Der Rest ist quasi ein Starter-Template von PayPal (zu finden auf der PayPal Github Seite). Wo wird denn eine zweite Funktion aufgerufen, wenn ich den zweiten Log-Aufruf weglasse?

                        Kommentar


                        • #13
                          Zitat von dmnktoe Beitrag anzeigen
                          Hmm. Ich habe gerade versucht, erst die API Funktion aufzurufen und erst im Anschluss das Logging (jedoch das von PayPal - welches ja sowieso schon funktioniert) auszugeben und die Funktion funktioniert trotzdem. Irgendwie wird der Acuity Request einfach übersprungen.

                          Echt schwierig...
                          Tja, "funktioniert nicht" ist immer noch keine Fehlerbeschreibung. Auf dem Stand kann man sich jetzt im Kreis drehen und nichts geht weiter.

                          Kommentar


                          • #14
                            Schau doch mal ins Error Log deines Webservers...

                            Kommentar


                            • #15
                              Zitat von dmnktoe Beitrag anzeigen
                              Wie und wo soll ich loggen? Ich habe ja keine Ausgabe - das Programm wird im Hintergrund ausgeführt.
                              Wenn du etwas mehr sehen möchtest binde diese Debug-Klasse ein. Beschreibung hier, Forumbeitrag mit Beispiel für eine einfaches Requestlogging. Damit kannst du in einen 2.Browsertab dein Logging "beobachten".
                              PHP-Klassen auf jspit.de und github

                              Kommentar

                              Lädt...
                              X