• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

ipn script wird nicht ausgeführt?

syuam

Neues Mitglied
hier mein test-ipn-script:
PHP:
define('SECURE', true);
include "connect_to_mysql.php";
  
// read the data send by PayPal
$req = 'cmd=_notify-validate';
foreach ($_POST as $key => $value) {
    $value = urlencode(stripslashes($value));
    $req .= "&$key=$value";
}
  
// post back to PayPal system to validate
$header = "POST /cgi-bin/webscr HTTP/1.0\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n";
  
$fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30);
if (!$fp) {
// HTTP ERROR
} else {
    fputs ($fp, $header . $req);
    while (!feof($fp)) {
      $res = fgets ($fp, 1024);
      if (strcmp ($res, "VERIFIED") == 0) {
        $errors = array();
        // PAYMENT VALID
                 
        // Check payment status 
        if ($_POST['payment_status'] != 'Completed') { 
            $errors[] .= "Payment not completed";
        }
 
        // Check seller e-mail
        if ($_POST['receiver_email'] != '[email protected]')  {
            $errors[] .= "Incorrect seller e-mail";
        }
 
        // Compare the amount received on PayPal with the price you charged for the product or service
        if ($_POST['mc_gross'] != '100.00') {
            $errors[] .= "Incorrect product price";
        }
 
        // Check the currency code
        if ($_POST['mc_currency'] != 'USD')  {
            $errors[] .= "Incorrect currency code";
        }
 
        // Check transaction id
        $txn_id = $_POST['txn_id'];
  $payer_email = $_POST['payer_email'];
  $mc_gross = $_POST['mc_gross'];
 
        $row = mysqli_query($mysqli, "SELECT `txn_id` from `trans` where `txn_id` = $txn_id");
        $num = mysqli_num_rows($row);
        if($num == 0) {
            // Transaction not processed, store it in the database´
            $insert = mysqli_query($mysqli, "INSERT INTO `trans`(`txn_id`, `payer_email`, `mc_gross`) 
                                                  VALUES('".$txn_id."', '".$payer_email."', '".$mc_gross."')");
            $message = "Transaction processed";
            mail('email', 'IPN Fraud Warning', $message, $headers);
        } elseif($num >= 1) {
            $message = "Transaction already prozessed";
            mail('email', 'IPN Fraud Warning', $message, $headers);  
        }
 
        if (count($errors) > 0)  {
 
            // IPN data is incorrect - possible fraud
            // It is a good practice to send the transaction details to your e-mail and investigate manually
 
            $message = "paypal invalid";
            mail('email', 'IPN', $message, $headers);
   
        } else {
 
            // PayPal payment is valid
            // Process order here
   
            $message = "paypal valid";
            mail('email', 'IPN', $message, $headers);
 
        }
      } else if (strcmp ($res, "INVALID") == 0) {
  
          // PAYMENT INVALID
    
          $message = "payment invalid";
          mail('email', 'IPN', $message, $headers);    
  
      }
    }
    fclose ($fp);
}
Nun wird das Geld auf den Sandbox-paypal-account überwiesen, allerdings...ist der Zahlungsstatus: "wird geprüft" . Wieso? Desweitern findet kein Eintrag in die DB statt, wie im script vorgesehen, wieso? auch bekomme ich keine email´s auf meinen email-account, kann mir da jmd helfen? lg
 
Wie wäre es denn, wenn du mal die grundlegen Dinge in Sachen Fehlersuche durchführst

Richtig debuggen

1. Man bemerkt, dass ein Skript nicht das tut, was es soll.
2. Man schreibt an den Anfang des Scriptes die Zeile: error_reporting(-1);
3. Man verwendet ini_set('display_errors', true); damit die Fehler auch angezeigt werden.
4. Man versucht, die Stelle die daran Schuld sein kann, schonmal einzugrenzen. Falls dies nicht geht, wird zunächst das komplette Skript als fehlerhaft angesehen.
5. An markanten Stellen im Skript lässt man sich wichtige Variableninhalte ausgeben und ggf. auch in bedingten Anweisungen eine kurze Ausgabe machen, um zu überprüfen, welche Bedingung ausgeführt wurde. Wichtig bei MySQL Fehlern (...not a valid MySQL result resource...): mysqli_error() verwenden oder Abfrage ausgeben und zb mit phpmyadmin testen.
6. Schritt 5 wird so lange wiederholt, bis Unstimmigkeiten im Skript auffallen
7. Damit hat man das Problem (Unstimmigkeit) gefunden und kann versuchen diese zu beheben. Hierzu dienen dann die PHP-Dokumentation und andere Quellen als Ratgeber.
8. Lässt sich das konkrete Problem trotzdem nicht beheben, kann man in Foren um Rat fragen.
9. Das Programm läuft und man kann die Debug-Ausgaben wieder entfernen.
 
ja gut das mit error_reporting hatte ich schon angeschaltet, aber wie sol ich den sehen, welche Zeilen(n) einen error erzeugen? Das ipn-script wird ja schließlich von paypal aufgerufen. Wenn ich das script aufrufe, bekomme ich eine leere Seite. Darum ging es mir ja: Ich sehe nicht wo der Fehler ist, weil ich nicht weiß, wie ich von einem ipn-script die error-Meldungen bekommen kann. lg edit: all in all, wie bekomme ich in einem ipn-script debug-Ausgaben?
 
Das ipn-script wird ja schließlich von paypal aufgerufen.
Und was hindert dich daran, ein Testscript zu schreiben, dass dein Script mit den nötigen Parametern auf deiner Testumgebung aufruft?
Wenn du dein eigenes Script nicht debuggen kannst, wie sollen wir das können?
 
Hallo,

mach einfach ein mail funktion rein.

zuerst alleine um zu schauen das Mail versendet wird
dann eine am anfang um zu schauen ob der IPN überhaupt aufgerufen wird.
dann geht weiter und verschiebst die halt tiefer in den code oder baust gleich 10 mail funktionen ein an verschiedenen stellen und schaust welche ankommen und welche nicht :O)

mail('[email protected]', 'Mail1', 'nachricht');


ach ich seh gerade, da sind ja schon mail() drin.
$message = "paypal invalid";
mail('email', 'IPN', $message, $headers);
füge die mal einfach ganz oben ein oder einzeln nur die und rufe die mal direkt auf ob mail raus geht aber natürlich mit deiner E-Mail und nicht nur 'email' :O).

Wenn mails raus gehen kannst die zur debug ausgabe nehmen.

Cheffchen
 
danke das hat echt geholfen !! Der Fehler liegt nun hier:
PHP:
if (strcmp ($res, "VERIFIED") == 0) {
Wieso liefert mit paypal "Invalid" zurück ? Der Teil wird ausgeführt :
PHP:
else if (strcmp ($res, "INVALID") == 0) {
 
Zurück
Oben