[PayPal IPN Sandbox - PHP] Always returning INVALID

Zack_S
Contributor
Contributor

Hello,

What I am trying to do is to verify if a payment was successfully made or not, but for some reason the PHP script I am using returns always invalid. I tried using different scripts but they will always return a 500 ERROR.

Currently, I have a subscription button setup and its code is copied straight from the PayPal Business Tools. I haven't added anything extra nor added a database. All I have done is set up the IPN listener in PayPal, I read some articles saying that a database is required to store information such as item_number and so on.

 

Anyways here is the PHP code:

<?php
// STEP 1: read POST data
// Reading POSTed data directly from $_POST causes serialization issues with array data in the POST.
// Instead, read raw POST data from the input stream.
$raw_post_data = file_get_contents('php://input');
$raw_post_array = explode('&', $raw_post_data);
$myPost = array();
foreach ($raw_post_array as $keyval) {
  $keyval = explode ('=', $keyval);
  if (count($keyval) == 2)
    $myPost[$keyval[0]] = urldecode($keyval[1]);
}
// read the IPN message sent from PayPal and prepend 'cmd=_notify-validate'
$req = 'cmd=_notify-validate';
if (function_exists('get_magic_quotes_gpc')) {
  $get_magic_quotes_exists = true;
}
foreach ($myPost as $key => $value) {
  if ($get_magic_quotes_exists == true && get_magic_quotes_gpc() == 1) {
    $value = urlencode(stripslashes($value));
  } else {
    $value = urlencode($value);
  }
  $req .= "&$key=$value";
}

// Step 2: POST IPN data back to PayPal to validate
$ch = curl_init('https://ipnpb.sandbox.paypal.com/cgi-bin/webscr');
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $req);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Connection: Close'));
// In wamp-like environments that do not come bundled with root authority certificates,
// please download 'cacert.pem' from "https://curl.haxx.se/docs/caextract.html" and set
// the directory path of the certificate as shown below:
// curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__) . '/cacert.pem');
if ( !($res = curl_exec($ch)) ) {
  // error_log("Got " . curl_error($ch) . " when processing IPN data");
  curl_close($ch);
  exit;
}
curl_close($ch);
// inspect IPN validation result and act accordingly
if (strcmp ($res, "VERIFIED") == 0) {
  // The IPN is verified, process it:
  // check whether 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 the notification
  // 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'];
  // IPN message values depend upon the type of notification sent.
  // To loop through the &_POST array and print the NV pairs to the screen:
  foreach($_POST as $key => $value) {
    echo $key . " = " . $value . "<br>";
  }
} else if (strcmp ($res, "INVALID") == 0) {
  // IPN invalid, log for manual investigation
  echo "The respone from the IPN was " .$res;
}
?>

Any help would be appreciated, thanks in advance.

Zack S

 

EDIT: I noticed that I am missing a cert file, is that necessary?

Login to Me Too
1 ACCEPTED SOLUTION

Accepted Solutions
Solved

MTS_Justin
Moderator
Moderator
Hi @Zack_S

IPN will return invalid if the data sent back to PayPal is not the exact data which was sent to your listener and the data also needs to be sent back in the exact order in which it was received. You will also receive an invalid response if you attempt to post sandbox data to a production endpoint and vice-versa.

https://developer.paypal.com/docs/classic/ipn/integration-guide/IPNTesting/#invalid

Also recommend starting to test with a PayPal IPN script, which we provide here : https://github.com/paypal/ipn-code-samples

Was my post helpful? If so, please give me a kudos!

View solution in original post

Login to Me Too
1 REPLY 1
Solved

MTS_Justin
Moderator
Moderator
Hi @Zack_S

IPN will return invalid if the data sent back to PayPal is not the exact data which was sent to your listener and the data also needs to be sent back in the exact order in which it was received. You will also receive an invalid response if you attempt to post sandbox data to a production endpoint and vice-versa.

https://developer.paypal.com/docs/classic/ipn/integration-guide/IPNTesting/#invalid

Also recommend starting to test with a PayPal IPN script, which we provide here : https://github.com/paypal/ipn-code-samples

Was my post helpful? If so, please give me a kudos!
Login to Me Too

Haven't Found your Answer?

It happens. Hit the "Login to Ask the community" button to create a question for the PayPal community.