Paypal unzulässige Zahlung via IPN

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

  • Paypal unzulässige Zahlung via IPN

    Servus,
    ich bin dabei PayPal auf einer Seite einzubinden. In der Sandbox funktioniert alles soweit. Was mir bis jetzt noch Kopfschmerzen bereitet ist folgendes:

    Ich nutze ExpressCheckOut von PayPal
    Ich habe eine notify_url angegeben und nutze das PHP Script von PayPal

    Da die Daten über ein Formular abgesendet werden kann man die leicht via Firebug o.ä. verändern. Das Problem ist: Wie mach ich PayPal klar das die Zahlung falsch ist?

    hier das Script ( hab schon soweit versucht zu ändern )

    PHP-Code:

    <?php




    /////////////////////////////////////////////////
    /////////////Begin Script below./////////////////
    /////////////////////////////////////////////////

    // read the post from PayPal system and add 'cmd'
    $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";

    // If testing on Sandbox use:
    //$fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30);

    $fp fsockopen ('ssl://www.paypal.com'443$errno$errstr30);






    // assign posted variables to local variables
    $item_name $_POST['item_name'];
    $business $_POST['business'];
    $item_number $_POST['item_number'];
    $payment_status $_POST['payment_status'];
    $mc_gross $_POST['mc_gross'];
    $payment_currency $_POST['mc_currency'];
    $txn_id $_POST['txn_id'];
    $receiver_email $_POST['receiver_email'];
    $receiver_id $_POST['receiver_id'];
    $quantity $_POST['quantity'];
    $num_cart_items $_POST['num_cart_items'];
    $payment_date $_POST['payment_date'];
    $first_name $_POST['first_name'];
    $last_name $_POST['last_name'];
    $payment_type $_POST['payment_type'];
    $payment_status $_POST['payment_status'];
    $payment_gross $_POST['payment_gross'];
    $payment_fee $_POST['payment_fee'];
    $settle_amount $_POST['settle_amount'];
    $memo $_POST['memo'];
    $payer_email $_POST['payer_email'];
    $txn_type $_POST['txn_type'];
    $payer_status $_POST['payer_status'];
    $address_street $_POST['address_street'];
    $address_city $_POST['address_city'];
    $address_state $_POST['address_state'];
    $address_zip $_POST['address_zip'];
    $address_country $_POST['address_country'];
    $address_status $_POST['address_status'];
    $item_number $_POST['item_number'];
    $tax $_POST['tax'];
    $option_name1 $_POST['option_name1'];
    $option_selection1 $_POST['option_selection1'];
    $option_name2 $_POST['option_name2'];
    $option_selection2 $_POST['option_selection2'];
    $for_auction $_POST['for_auction'];
    $invoice $_POST['invoice'];
    $custom $_POST['custom'];
    $notify_version $_POST['notify_version'];
    $verify_sign $_POST['verify_sign'];
    $payer_business_name $_POST['payer_business_name'];
    $payer_id =$_POST['payer_id'];
    $mc_currency $_POST['mc_currency'];
    $mc_fee $_POST['mc_fee'];
    $exchange_rate $_POST['exchange_rate'];
    $settle_currency  $_POST['settle_currency'];
    $parent_txn_id  $_POST['parent_txn_id'];
    $pending_reason $_POST['pending_reason'];
    $reason_code $_POST['reason_code'];
    $user_hash $_REQUEST['hash'];


    // subscription specific vars

    $subscr_id $_POST['subscr_id'];
    $subscr_date $_POST['subscr_date'];
    $subscr_effective  $_POST['subscr_effective'];
    $period1 $_POST['period1'];
    $period2 $_POST['period2'];
    $period3 $_POST['period3'];
    $amount1 $_POST['amount1'];
    $amount2 $_POST['amount2'];
    $amount3 $_POST['amount3'];
    $mc_amount1 $_POST['mc_amount1'];
    $mc_amount2 $_POST['mc_amount2'];
    $mc_amount3 $_POST['mcamount3'];
    $recurring $_POST['recurring'];
    $reattempt $_POST['reattempt'];
    $retry_at $_POST['retry_at'];
    $recur_times $_POST['recur_times'];
    $username $_POST['username'];
    $password $_POST['password'];

    //auction specific vars

    $for_auction $_POST['for_auction'];
    $auction_closing_date  $_POST['auction_closing_date'];
    $auction_multi_item  $_POST['auction_multi_item'];
    $auction_buyer_id  $_POST['auction_buyer_id'];



    //DB connect creds and email 
    $notify_email =  "***"//email address to which debug emails are sent to
    $DB_Server "***"//your MySQL Server
    $DB_Username "***"//your MySQL User Name
    $DB_Password "***"//your MySQL Password
    $DB_DBName "***"//your MySQL Database Name


    if (!$fp) {
    // HTTP ERROR
    } else {
    fputs ($fp$header $req);
    while (!
    feof($fp)) {
    $res fgets ($fp1024);
    if (
    strcmp ($res"VERIFIED") == 0) {



    $fecha date("m")."/".date("d")."/".date("Y");
    $fecha date("Y").date("m").date("d");

    //check if transaction ID has been processed before
    $checkquery "select txnid from paypal_payment_info where txnid='".$txn_id."'";
    $sihay mysql_query($checkquery) or die(mysql_error());
    $nm mysql_num_rows($sihay);

    $preis '***'// preisabfrage aus der DB

    if ($nm == && $preis == $mc_gross){

    //execute query



        
    if ($txn_type == "cart"){
    //$strQuery
    $result mysql_query($strQuery);
         for (
    $i 1$i <= $num_cart_items$i++) {
             
    $itemname "item_name".$i;
             
    $itemnumber "item_number".$i;
             
    $on0 "option_name1_".$i;
             
    $os0 "option_selection1_".$i;
             
    $on1 "option_name2_".$i;
             
    $os1 "option_selection2_".$i;
             
    $quantity "quantity".$i;

    //$struery
    $result mysql_query($struery);

         }
        }



        else{
    //$strQuery
    //$result
        
    }


        
    // send an email in any case
     
    echo "Verified";
    }
    else {

    }

        
    //subscription handling branch
        
    if ( $txn_type == "subscr_signup"  ||  $txn_type == "subscr_payment"  ) {

          
    // insert subscriber payment info into paypal_payment_info table
          //$strQuery
          //$result


            // insert subscriber info into paypal_subscription_info table
            //$strQuery2
            //$result


        
    }
    }

    // if the IPN POST was 'INVALID'...do this


    else if (strcmp ($res"INVALID") == 0) {
    // log for manual investigation

    //mail($notify_email, "INVALID IPN", "$res\n $req");
    }
    }
    fclose ($fp);
    }
    ?>
    hab den Code soweit - hoffentlich genügend - umgebrochen und die Querys rausgenommen da sie funktionieren und im Forum nur Platz verschwenden.

    Die Frage war folgende: Wie mach ich PayPal klar das wenn $preis != $mc_gross ist das die Zahlung invalid ist?
    Zuletzt geändert von bloodyorchid; 30.04.2010, 12:24.
    Pierre Voit ( Freelancer seit 2004 )

  • #2
    Hallo,

    warum überprüfst du das nicht selbst in deinem Skript? Die Kommunikation mit PayPal machst du doch nur serverseitig, also kannst du dort ja auch die Manipulation erkennen und zwar oben in der foreach-Schleife: Dort musst du nur $key und $value prüfen, bevor du es in die PayPal-Anfrage übernimmst.

    Gruß,

    Amica
    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
    Super, danke!
    [/COLOR]

    Kommentar


    • #3
      atm stellt sich mir die Frage: Wo poste ich das?
      Vielleicht mag ich blind sein aber ich denk mal an PayPal zurückposten funktioniert via PHP nur mit cURL?

      überprüfen tu ich es ja schon - nur scheinbar falsch...
      siehe
      PHP-Code:
      if ($nm == && $preis == $mc_gross){} 
      Pierre Voit ( Freelancer seit 2004 )

      Kommentar


      • #4
        Zitat von bloodyorchid Beitrag anzeigen
        Wo poste ich das?
        Ziemlich weit oben, dort wo der Kommentar "post back to PayPal system to validate" steht. In diesem Falle passiert das nicht über cURL, sondern direkt per Socketverbindung.

        Zitat von bloodyorchid Beitrag anzeigen
        überprüfen tu ich es ja schon - nur scheinbar falsch...
        Du prüfst es viel zu spät, da ist es ja schon an PayPal gesendet worden. Wie bereits gesagt: Oben in der foreach-Schleife musst du es prüfen, noch vor dem o. g. Kommentar.
        [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
        Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
        Super, danke!
        [/COLOR]

        Kommentar


        • #5
          oh man bin ich deppert. Okay Wald viele Bäume und so ... Dank dir
          Pierre Voit ( Freelancer seit 2004 )

          Kommentar


          • #6
            Im Übrigen würde ich an deiner Stelle auf die ganzen hidden-Felder verzichten und die unveränderlichen Variablen direkt im PHP-Skript festlegen.
            [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
            Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
            Super, danke!
            [/COLOR]

            Kommentar


            • #7
              ich bin ehrlich, was paypal angeht steh ich wie der ochse vorm scheunentor :/
              Pierre Voit ( Freelancer seit 2004 )

              Kommentar


              • #8
                Falls du damit den letzten Tipp meinst, der hat weniger mit PayPal zu tun. Ich meine damit, dass es einfacher, sicherer und besser ist

                PHP-Code:
                $someVar "someValue"
                zu verwenden, als

                PHP-Code:
                $someVar $_POST["someVar"];
                ...
                <
                input type="hidden" name="someVar" value="someValue" /> 
                [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                Super, danke!
                [/COLOR]

                Kommentar


                • #9
                  PHP-Code:
                  $someVar $_POST["someVar"];
                  ...
                  <
                  input type="hidden" name="someVar" value="someValue" /> 
                  postet der das an die nächste seite mit? ist mir neu
                  Pierre Voit ( Freelancer seit 2004 )

                  Kommentar


                  • #10
                    Zitat von bloodyorchid Beitrag anzeigen
                    postet der das an die nächste seite mit? ist mir neu
                    Was meinst du damit? Jetzt hab ich dich nicht verstanden.
                    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                    Super, danke!
                    [/COLOR]

                    Kommentar


                    • #11
                      ich hab dein beispiel iwie nich wirklich verstanden
                      Pierre Voit ( Freelancer seit 2004 )

                      Kommentar


                      • #12
                        hidden-Felder mit festem Wert sind sinnlos. Die Variablen, die damit übergeben werden sollen, kann man auch im verarbeitenden Skript direkt festlegen. Das wollte ich damit sagen.

                        Ich hab zwar den Formularcode nicht gesehen, aber lt. dem Skript-Code liest du alles über POST aus dem Formular aus. Daher nehme ich an, dass du die ganzen PayPal-Variablen (zumindest die, die sich nicht ändern) als hidden-Felder dort reingeschrieben hast. Das ist sinnlos, zumal du Manipulationen daran sowieso nur erkennen kannst, wenn du den richtigen Wert im Skript hast, um es zu vergleichen.

                        Daher: Feste Werte gleich ins Skript, hidden-Felder raus!

                        Jetzt klar?
                        [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                        Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                        Super, danke!
                        [/COLOR]

                        Kommentar


                        • #13
                          Ja das ist schon klar... Problem ist allerdings ein anderes

                          Man bindet das Formular für Paypal auf seiner Seite ein...
                          Nach dem Abschicken wird man auf Paypal weiter geleitet...
                          Dort loggt man sich ein... bestätigt die Zahlung und kommt auf einer gewissen url wieder raus...

                          Danach oder während dessen greift Paypal auf das Skript oben zu und überprüft die gesendeten Formular daten mit den Daten die ich habe... Das oben ist quasi nur das Double Check Script
                          Pierre Voit ( Freelancer seit 2004 )

                          Kommentar


                          • #14
                            Achso, das ist nur das Skript das von PayPal aufgerufen wird, nicht das, mit dem du die Daten vom Benutzer bekommst. Das wusste ich nicht.
                            [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                            Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                            Super, danke!
                            [/COLOR]

                            Kommentar


                            • #15
                              genau das ist es

                              es gibt sicherlich auch bessere methoden als ein Formular... Aber für den Einstieg reicht es erst einmal... Später kann ich mir immernoch um die anderen Lösungen von PayPal gedanken machen
                              Pierre Voit ( Freelancer seit 2004 )

                              Kommentar

                              Lädt...
                              X