AOW >> Add Paypal Instant Payment Notification (IPN)

Add Paypal Instant Payment Notification (IPN)

What is Instant Payment Notification (IPN)?

Paypal Instant Payment Notification is the very important option in the paypal because usually some developers and programmers use the paypal in the website for payment and make the success page in the website if you user make payment successfully it redirect to the success page and developer get the data from paypal on this page and mark payment successful and insert the data in the database but this procedure OR method have some major problem for example user make the payment success and when paypal redirect it to the website success page the internet connection of the user lost and it not redirect to the success page and on the website database payment status is not success but in fact the payment status is success. For overcome this type of problems programmers and developers use the IPN for save the data about the payment in the database and mark the payment status as success OR un-success.


How add paypal instant payment notification (IPN) to website?

Step by step method of adding IPN to your website is following:

1 – Create account on paypal and login
2 – Click on profile
3 – Click my selling tools
4 – Select instant payment notification option
5 – Enter the website url and enable the option for receiving the instant payment option
6 – Now do your coding example coding (ipn.php) is here

// CONFIG: Enable debug mode. This means we'll log requests into 'ipn.log' in the same directory.
// Especially useful if you encounter network errors or other intermittent problems with IPN (validation).
// Set this to 0 once you go live or don't require logging.
define("DEBUG", 1);
// Set to 0 once you're ready to go live
define("USE_SANDBOX", 1);
// Log file for save the payment log make it according to your requirement
define("LOG_FILE", "./ipn.log");
// Read POST data
// reading posted data directly from $_POST causes serialization
// issues with array data in POST. Reading raw POST data from input stream instead.
$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 post from PayPal system and add 'cmd'
$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";
// Post IPN data back to PayPal to validate the IPN data is genuine
// Without this step anyone can fake IPN data
if(USE_SANDBOX == true) {
  $paypal_url = "";
} else {
  $paypal_url = "";
$ch = curl_init($paypal_url);
if ($ch == FALSE) {
  return FALSE;
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);
if(DEBUG == true) {
  curl_setopt($ch, CURLOPT_HEADER, 1);
  curl_setopt($ch, CURLINFO_HEADER_OUT, 1);
// CONFIG: Optional proxy configuration
//curl_setopt($ch, CURLOPT_PROXY, $proxy);
//curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
// Set TCP timeout to 30 seconds
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Connection: Close'));
// CONFIG: Please download 'cacert.pem' from "" and set the directory path
// of the certificate as shown below. Ensure the file is readable by the webserver.
// This is mandatory for some environments.
//$cert = __DIR__ . "./cacert.pem";
//curl_setopt($ch, CURLOPT_CAINFO, $cert);
$res = curl_exec($ch);
if (curl_errno($ch) != 0) // cURL error
  if(DEBUG == true) {	
    error_log(date('[Y-m-d H:i e] '). "Can't connect to PayPal to validate IPN message: " . curl_error($ch) . PHP_EOL, 3, LOG_FILE);
} else {
    // Log the entire HTTP response if debug is switched on.
    if(DEBUG == true) {
      error_log(date('[Y-m-d H:i e] '). "HTTP request of validation request:". curl_getinfo($ch, CURLINFO_HEADER_OUT) ." for IPN payload: $req" . PHP_EOL, 3, LOG_FILE);
      error_log(date('[Y-m-d H:i e] '). "HTTP response of validation request: $res" . PHP_EOL, 3, LOG_FILE);
// Inspect IPN validation result and act accordingly
// Split response headers and payload, a better way for strcmp
$tokens = explode("\r\n\r\n", trim($res));
$res = trim(end($tokens));
if (strcmp ($res, "VERIFIED") == 0) {
  // check whether the payment_status is Completed
  // check that txn_id has not been previously processed
  // check that receiver_email is your PayPal email
  // check that payment_amount/payment_currency are correct
  // process payment and mark item as paid.
  // 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'];
  //You are able to get the payment information separately
  //Make your own coding logic and mark the payment as success in your website database
  if(DEBUG == true) {
    error_log(date('[Y-m-d H:i e] '). "Verified IPN: $req ". PHP_EOL, 3, LOG_FILE);
} else if (strcmp ($res, "INVALID") == 0) {
  // log for manual investigation
  // Add business logic here which deals with invalid IPN messages
  if(DEBUG == true) {
    error_log(date('[Y-m-d H:i e] '). "Invalid IPN: $req" . PHP_EOL, 3, LOG_FILE);

7 – upload file on your server and make logic, save values in the database.

See the complete tutorial video :)



Please follow and like us:

Leave a Reply

Your email address will not be published. Required fields are marked *