title: INVALID IPN if i use sandbox
body: <p>i have put that url <a href="http://pvpcoach.com/notification.php" rel="nofollow">http://pvpcoach.com/notification.php</a> in Instant Payment Notification setting in my profile and i m using that notification.php script code for Instant Payment Notification data.  </p>
  
  <p>notification.php</p>
  
  <pre><code>    &lt;?php
      // Revision Notes
      // 11/04/11 - changed post back url from https://www.paypal.com/cgi-bin/webscr to https://ipnpb.paypal.com/cgi-bin/webscr
      // For more info see below:
      // https://www.x.com/content/bulletin-ip-address-expansion-paypal-services
      // "ACTION REQUIRED: if you are using IPN (Instant Payment Notification) for Order Management and your IPN listener script is behind a firewall that uses ACL (Access Control List) rules which restrict outbound traffic to a limited number of IP addresses, then you may need to do one of the following: 
      // To continue posting back to https://www.paypal.com  to perform IPN validation you will need to update your firewall ACL to allow outbound access to *any* IP address for the servers that host your IPN script
      // OR Alternatively, you will need to modify  your IPN script to post back IPNs to the newly created URL https://ipnpb.paypal.com using HTTPS (port 443) and update firewall ACL rules to allow outbound access to the ipnpb.paypal.com IP ranges (see end of message)."
  
  
      /////////////////////////////////////////////////
      /////////////Begin Script below./////////////////
      /////////////////////////////////////////////////
  
      // read the post from PayPal system and add 'cmd'
      $req = 'cmd=_notify-validate';
      foreach ($_POST as $key =&gt; $value) {
      $value = urlencode(stripslashes($value));
      $req .= "&amp;$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://ipnpb.paypal.com', 443, $errno, $errstr, 30);
  
  
      // 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'];
  
  
      // 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 =  "vikastyagi87@gmail.com";         //email address to which debug emails are sent to
      $DB_Server = "localhost"; //your MySQL Server
      $DB_Username = "username"; //your MySQL User Name
      $DB_Password = "password"; //your MySQL Password
      $DB_DBName = "databasename"; //your MySQL Database Name
  
  
      if (!$fp) {
      // HTTP ERROR
      } else {
      fputs ($fp, $header . $req);
      while (!feof($fp)) {
      $res = fgets ($fp, 1024);
      if (strcmp ($res, "VERIFIED") == 0) {
  
  
  
      //create MySQL connection
      $Connect = @mysql_connect($DB_Server, $DB_Username, $DB_Password)
      or die("Couldn't connect to MySQL:&lt;br&gt;" . mysql_error() . "&lt;br&gt;" . mysql_errno());
  
  
      //select database
      $Db = @mysql_select_db($DB_DBName, $Connect)
      or die("Couldn't select database:&lt;br&gt;" . mysql_error(). "&lt;br&gt;" . mysql_errno());
  
  
      $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("Duplicate txn id check query failed:&lt;br&gt;" . mysql_error() . "&lt;br&gt;" . mysql_errno());
      $nm = mysql_num_rows($sihay);
      if ($nm == 0){
  
      //execute query
  
  
  
          if ($txn_type == "cart"){
          $strQuery = "insert into paypal_payment_info(paymentstatus,buyer_email,firstname,lastname,street,city,state,zipcode,country,mc_gross,mc_fee,memo,paymenttype,paymentdate,txnid,pendingreason,reasoncode,tax,datecreation) values ('".$payment_status."','".$payer_email."','".$first_name."','".$last_name."','".$address_street."','".$address_city."','".$address_state."','".$address_zip."','".$address_country."','".$mc_gross."','".$mc_fee."','".$memo."','".$payment_type."','".$payment_date."','".$txn_id."','".$pending_reason."','".$reason_code."','".$tax."','".$fecha."')";
  
           $result = mysql_query($strQuery) or die("Cart - paypal_payment_info, Query failed:&lt;br&gt;" . mysql_error() . "&lt;br&gt;" . mysql_errno());
           for ($i = 1; $i &lt;= $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 = "insert into paypal_cart_info(txnid,itemnumber,itemname,os0,on0,os1,on1,quantity,invoice,custom) values ('".$txn_id."','".$_POST[$itemnumber]."','".$_POST[$itemname]."','".$_POST[$on0]."','".$_POST[$os0]."','".$_POST[$on1]."','".$_POST[$os1]."','".$_POST[$quantity]."','".$invoice."','".$custom."')";
               $result = mysql_query($struery) or die("Cart - paypal_cart_info, Query failed:&lt;br&gt;" . mysql_error() . "&lt;br&gt;" . mysql_errno());
  
           }
          }
  
  
  
          else{
           $strQuery = "insert into paypal_payment_info(paymentstatus,buyer_email,firstname,lastname,street,city,state,zipcode,country,mc_gross,mc_fee,itemnumber,itemname,os0,on0,os1,on1,quantity,memo,paymenttype,paymentdate,txnid,pendingreason,reasoncode,tax,datecreation) values ('".$payment_status."','".$payer_email."','".$first_name."','".$last_name."','".$address_street."','".$address_city."','".$address_state."','".$address_zip."','".$address_country."','".$mc_gross."','".$mc_fee."','".$item_number."','".$item_name."','".$option_name1."','".$option_selection1."','".$option_name2."','".$option_selection2."','".$quantity."','".$memo."','".$payment_type."','".$payment_date."','".$txn_id."','".$pending_reason."','".$reason_code."','".$tax."','".$fecha."')";
           $result = mysql_query("insert into paypal_payment_info(paymentstatus,buyer_email,firstname,lastname,street,city,state,zipcode,country,mc_gross,mc_fee,itemnumber,itemname,os0,on0,os1,on1,quantity,memo,paymenttype,paymentdate,txnid,pendingreason,reasoncode,tax,datecreation) values ('".$payment_status."','".$payer_email."','".$first_name."','".$last_name."','".$address_street."','".$address_city."','".$address_state."','".$address_zip."','".$address_country."','".$mc_gross."','".$mc_fee."','".$item_number."','".$item_name."','".$option_name1."','".$option_selection1."','".$option_name2."','".$option_selection2."','".$quantity."','".$memo."','".$payment_type."','".$payment_date."','".$txn_id."','".$pending_reason."','".$reason_code."','".$tax."','".$fecha."')") or die("Default - paypal_payment_info, Query failed:&lt;br&gt;" . mysql_error() . "&lt;br&gt;" . mysql_errno());
          }
  
  
          // send an email in any case
       echo "Verified";
           mail($notify_email, "VERIFIED IPN", "$res\n $req\n $strQuery\n $struery\n  $strQuery2");
      }
      else {
      // send an email
      mail($notify_email, "VERIFIED DUPLICATED TRANSACTION", "$res\n $req \n $strQuery\n $struery\n  $strQuery2");
      }
  
          //subscription handling branch
          if ( $txn_type == "subscr_signup"  ||  $txn_type == "subscr_payment"  ) {
  
            // insert subscriber payment info into paypal_payment_info table
            $strQuery = "insert into paypal_payment_info(paymentstatus,buyer_email,firstname,lastname,street,city,state,zipcode,country,mc_gross,mc_fee,memo,paymenttype,paymentdate,txnid,pendingreason,reasoncode,tax,datecreation) values ('".$payment_status."','".$payer_email."','".$first_name."','".$last_name."','".$address_street."','".$address_city."','".$address_state."','".$address_zip."','".$address_country."','".$mc_gross."','".$mc_fee."','".$memo."','".$payment_type."','".$payment_date."','".$txn_id."','".$pending_reason."','".$reason_code."','".$tax."','".$fecha."')";
            $result = mysql_query($strQuery) or die("Subscription - paypal_payment_info, Query failed:&lt;br&gt;" . mysql_error() . "&lt;br&gt;" . mysql_errno());
  
  
               // insert subscriber info into paypal_subscription_info table
              $strQuery2 = "insert into paypal_subscription_info(subscr_id , sub_event, subscr_date ,subscr_effective,period1,period2, period3, amount1 ,amount2 ,amount3,  mc_amount1,  mc_amount2,  mc_amount3, recurring, reattempt,retry_at, recur_times, username ,password, payment_txn_id, subscriber_emailaddress, datecreation) values ('".$subscr_id."', '".$txn_type."','".$subscr_date."','".$subscr_effective."','".$period1."','".$period2."','".$period3."','".$amount1."','".$amount2."','".$amount3."','".$mc_amount1."','".$mc_amount2."','".$mc_amount3."','".$recurring."','".$reattempt."','".$retry_at."','".$recur_times."','".$username."','".$password."', '".$txn_id."','".$payer_email."','".$fecha."')";
              $result = mysql_query($strQuery2) or die("Subscription - paypal_subscription_info, Query failed:&lt;br&gt;" . mysql_error() . "&lt;br&gt;" . mysql_errno());
  
  
                   mail($notify_email, "VERIFIED IPN", "$res\n $req\n $strQuery\n $struery\n  $strQuery2");
  
          }
      }
  
      // 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);
      }
      ?&gt;
  </code></pre>
  
  <p>if i do real paypal payment on paypal that time notification.php script code work and if i use sandbox that time code not work and i got that output in email</p>
  
  <pre><code>INVALID
  cmd=_notify-validate&amp;amount3=12.00&amp;address_status=confirmed&amp;subscr_date=02%3A15%3A39+Feb+22%2C+2012+PST&amp;payer_id=A5DUBM9B67SU8&amp;address_street=1+Main+St&amp;mc_amount3=12.00&amp;charset=windows-1252&amp;address_zip=95131&amp;first_name=Test&amp;reattempt=1&amp;address_country_code=US&amp;address_name=Test+User&amp;notify_version=3.4&amp;subscr_id=I-0817P6BX3P66&amp;custom=c25a9064af5fe1e082f4d4dccf9ef8f1&amp;payer_status=verified&amp;business=vikast_1312898140_biz%40gmail.com&amp;address_country=United+States&amp;address_city=San+Jose&amp;verify_sign=ADSm5I2w3q7evTcsSPu0fdxbnxnTAsg9iSN23V8wbqKs9Jyf0Yeapofa&amp;payer_email=vikast_1316757002_per%40gmail.com&amp;btn_id=2401055&amp;last_name=User&amp;address_state=CA&amp;receiver_email=vikast_1312898140_biz%40gmail.com&amp;recurring=1&amp;txn_type=subscr_signup&amp;item_name=test&amp;mc_currency=USD&amp;residence_country=US&amp;test_ipn=1&amp;period3=1+M&amp;ipn_track_id=d9bef80986ce7
  </code></pre>
  
  <p>if any problem to understand question plz tell me</p>
  
  <p>thanks in advance, vikas tyagi</p>