title: Why is my PayPal IPN script failing?
body: <p>I'm developing a lightweight e-commerce solution that uses <em>PayPal</em> as the payment gateway. However, my IPN callback is constantly returning an <code>INVALID</code> response. I even tried using the sample PHP script provided by <em>PayPal</em>:</p>
  
  <pre><code>// 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";
  $fp = fsockopen ('ssl://www.paypal.com', 443, $errno, $errstr, 30);
  
  // assign posted variables to local variables
  $item_name = $_POST['item_name'];
  $item_number = $_POST['item_number'];
  $payment_status = $_POST['payment_status'];
  $payment_amount = $_POST['mc_gross'];
  $payment_currency = $_POST['mc_currency'];
  $txn_id = $_POST['txn_id'];
  $receiver_email = $_POST['receiver_email'];
  $payer_email = $_POST['payer_email'];
  
  if (!$fp) {
    // HTTP ERROR
  }
  else {
    fputs ($fp, $header . $req);
    while (!feof($fp)) {
      $res = fgets ($fp, 1024);
      if (strcmp ($res, "VERIFIED") == 0) {
        // check the payment_status is Completed
        // check that txn_id has not been previously processed
        // check that receiver_email is your Primary PayPal email
        // check that payment_amount/payment_currency are correct
        // process payment
      }
      else if (strcmp ($res, "INVALID") == 0) {
        // log for manual investigation
      }
    }
    fclose ($fp);
  }
  </code></pre>
  
  <p>But as I say, I keep getting an <code>INVALID</code> response. This is in fact the response I get using a PHP class that writes the response to a log file:</p>
  
  <pre><code>[2011-06-02 19:18:49] - FAIL: IPN Validation Failed.
  IPN POST data from PayPal:
  test_ipn=1,
  payment_type=instant,
  payment_date=11:07:43 Jun 02, 2011 PDT,
  payment_status=Completed,
  payer_status=verified,
  first_name=John,
  last_name=Smith,
  payer_email=buyer@paypalsandbox.com,
  payer_id=TESTBUYERID01,
  business=seller@paypalsandbox.com,
  receiver_email=seller@paypalsandbox.com,
  receiver_id=TESTSELLERID1,
  residence_country=US,
  item_name1=something,
  item_number1=AK-1234,
  quantity1=1,
  tax=2.02,
  mc_currency=USD,
  mc_fee=0.44,
  mc_gross=15.34,
  mc_gross_1=12.34,
  mc_handling=2.06,
  mc_handling1=1.67,
  mc_shipping=3.02,
  mc_shipping1=1.02,
  txn_type=cart,
  txn_id=4362187,
  notify_version=2.4,
  custom=xyz123,
  invoice=abc1234,
  charset=windows-1252,
  verify_sign=AjbdIvvDAW2fh1O9jAbEym4myX.WAV7-jCEiEWMqoSkewvM6L3Co6oUQ
  </code></pre>
  
  <p>This is from the official <em>PayPal</em> IPN test tool. So something between <em>PayPal</em>'s sample code and test tool is causing my script to fail. Any one have any ideas?</p>