简体   繁体   中英

PayPal IPN not working after payment redirect to success URL

I am working on localhost. I have successfully implemented Payza on my website and not I have headed towards integrating Paypal too. I downloaded a code from some website (don't remember from where) and tried testing it on localhost as received before I could modify and implement it on my website as per my requirement. The code seems to work on all the steps rather than receiving the IPN data sent to my URL. Since I am using localhost for development, I am using ngrok for testing purposes (to run my localhost on internet). Below are the two pages.

index.php

<?php
$data=array(
'merchant_email'=>'shubhamjha900@gmail.com',
'product_name'=>'Demo Product',
'amount'=>5.50,
'currency_code'=>'USD',
'thanks_page'=>'http://229a1c8a.ngrok.io/sites/paypal3/success.php',
'notify_url'=>'http://229a1c8a.ngrok.io/sites/paypal3/ipn.php',
'cancel_url'=>'http://229a1c8a.ngrok.io/sites/paypal3/cancel.php',
'paypal_mode'=>true
);
if(isset($_POST['pay_now'])){
echo '<link rel="stylesheet" type="text/css" href="style.css" />';
echo '<div class="wait">PayPal is processing the payment, please wait...</div>';
echo '<div class="loader">
        <div></div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
    </div>';
echo infotutsPaypal($data);
}else{
?>
<html>
        <title>Integrate PayPal Payment gateway in php - InfoTuts</title>
        <head>
        <link rel="stylesheet" type="text/css" href="style.css" />
        </head>
        <div id="mhead"><h2>Integrate PayPal Payment gateway in PHP - <span class="red">Info</span>Tuts</h2></div>
        <div id="product">
        <form id='paypal-info' method='post' action='#'>
        <label>Product Name : <?php echo $data['product_name']; ?></label></br>
        <label>Product Price : <?php echo $data['amount'].''.$data['currency_code']; ?></label>
        <input type='submit' name='pay_now' id='pay_now' value='Pay' />
        </form>
        </div>
</html>
<?php
}
    function infotutsPaypal( $data) {

            define( 'SSL_URL', 'https://www.paypal.com/cgi-bin/webscr' );
            define( 'SSL_SAND_URL', 'https://www.sandbox.paypal.com/cgi-bin/webscr' );

            $action = '';
            //Is this a test transaction?
            $action = ($data['paypal_mode']) ? SSL_SAND_URL : SSL_URL;

            $form = '';

            $form .= '<form name="frm_payment_method" action="' . $action . '" method="post">';
            $form .= '<input type="hidden" name="business" value="' . $data['merchant_email'] . '" />';
            // Instant Payment Notification & Return Page Details /
            $form .= '<input type="hidden" name="notify_url" value="' . $data['notify_url'] . '" />';
            $form .= '<input type="hidden" name="cancel_return" value="' . $data['cancel_url'] . '" />';
            $form .= '<input type="hidden" name="return" value="' . $data['thanks_page'] . '" />';
            $form .= '<input type="hidden" name="rm" value="2" />';
            // Configures Basic Checkout Fields -->
            $form .= '<input type="hidden" name="lc" value="" />';
            $form .= '<input type="hidden" name="no_shipping" value="1" />';
            $form .= '<input type="hidden" name="no_note" value="1" />';
            // <input type="hidden" name="custom" value="localhost" />-->
            $form .= '<input type="hidden" name="currency_code" value="' . $data['currency_code'] . '" />';
            $form .= '<input type="hidden" name="page_style" value="paypal" />';
            $form .= '<input type="hidden" name="charset" value="utf-8" />';
            $form .= '<input type="hidden" name="item_name" value="' . $data['product_name'] . '" />';
            $form .= '<input type="hidden" value="_xclick" name="cmd"/>';
            $form .= '<input type="hidden" name="amount" value="' . $data['amount'] . '" />';

            $form .= '</form>';
            $form .= '<script>';
            $form .= 'setTimeout("document.frm_payment_method.submit()", 0);';
            $form .= '</script>';
            return $form;
        }

ipn.php

<?php
class PayPal_IPN {
  function infotuts_ipn($im_debut_ipn) {
      define('SSL_P_URL', 'https://www.paypal.com/cgi-bin/webscr');
      define('SSL_SAND_URL', 'https://www.sandbox.paypal.com/cgi-bin/webscr');
      $hostname = gethostbyaddr($_SERVER['REMOTE_ADDR']);
      if (!preg_match('/paypal\.com$/', $hostname)) {
          $ipn_status = 'Validation post isn\'t from PayPal';
          if ($im_debut_ipn == true) {
                // mail test
          }
          return false;
      }

    // parse the paypal URL
      $paypal_url = ($_REQUEST['test_ipn'] == 1) ? SSL_SAND_URL : SSL_P_URL;
      $url_parsed = parse_url($paypal_url);

    $post_string = '';
      foreach ($_REQUEST as $field => $value) {
          $post_string .= $field . '=' . urlencode(stripslashes($value)) . '&';
      }
      $post_string.="cmd=_notify-validate"; // append ipn command
      // get the correct paypal url to post request to
      $paypal_mode_status = $im_debut_ipn; //get_option('im_sabdbox_mode');
      if ($paypal_mode_status == true)
          $fp = fsockopen('ssl://www.sandbox.paypal.com', "443", $err_num, $err_str, 60);
      else
          $fp = fsockopen('ssl://www.paypal.com', "443", $err_num, $err_str, 60);

      $ipn_response = '';

      if(!$fp){
        // could not open the connection.  If loggin is on, the error message
        // will be in the log.
        $ipn_status = "fsockopen error no. $err_num: $err_str";
        if ($im_debut_ipn == true) {
            echo 'fsockopen fail';
        }
        return false;
      }else{
        // Post the data back to paypal
        fputs($fp, "POST $url_parsed[path] HTTP/1.1\r\n");
        fputs($fp, "Host: $url_parsed[host]\r\n");
        fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n");
        fputs($fp, "Content-length: " . strlen($post_string) . "\r\n");
        fputs($fp, "Connection: close\r\n\r\n");
        fputs($fp, $post_string . "\r\n\r\n");
        // loop through the response from the server and append to variable
        while (!feof($fp)) {
            $ipn_response .= fgets($fp, 1024);
        }
        fclose($fp); // close connection
      }
      // Invalid IPN transaction.  Check the $ipn_status and log for details.
      if (!preg_match("/VERIFIED/s", $ipn_response)) {
          $ipn_status = 'IPN Validation Failed';
          if ($im_debut_ipn == true) {
              echo 'Validation fail';
              print_r($_REQUEST);
          }
          return false;
      }else{
          $ipn_status = "IPN VERIFIED";
          if ($im_debut_ipn == true) {
              echo 'SUCCESS';
        }
      return true;
      }
  }
    function ipn_response($request){
    mail("shubhamjha1000@gmail.com","My subject",print_r($request,true));
    $im_debut_ipn=true;
     if ($this->infotuts_ipn($im_debut_ipn)) {
             // if paypal sends a response code back let's handle it
       if ($im_debut_ipn == true) {
            $sub = 'PayPal IPN Debug Email Main';
            $msg = print_r($request, true);
            $aname = 'infotuts';
          //mail send
        }
                // process the membership since paypal gave us a valid +
        $this->insert_data($request);
      }
    }
  function issetCheck($post,$key){
    if(isset($post[$key])){
      $return=$post[$key];
    }else{
      $return='';
    }
    return $return;
  }
  function insert_data($request){
    require_once('dbconnect.php');
    $post=$request;
    $item_name=$this->issetCheck($post,'item_name');
    $amount=$this->issetCheck($post,'mc_gross');
    $currency=$this->issetCheck($post,'mc_currency');
    $payer_email=$this->issetCheck($post,'payer_email');
    $first_name=$this->issetCheck($post,'first_name');
    $last_name=$this->issetCheck($post,'last_name');
    $country=$this->issetCheck($post,'residence_country');
    $txn_id=$this->issetCheck($post,'txn_id');
    $txn_type=$this->issetCheck($post,'txn_type');
    $payment_status=$this->issetCheck($post,'payment_status');
    $payment_type=$this->issetCheck($post,'payment_type');
    $payer_id=$this->issetCheck($post,'payer_id');
    $create_date=date('Y-m-d H:i:s');
    $payment_date=date('Y-m-d H:i:s');

    mysqli_query($con,"INSERT INTO infotuts_transection_tbl(item_name,payer_email,first_name,last_name,amount,currency,country,txn_id,txn_type,payer_id,payment_status,payment_type,create_date,payment_date)
    VALUES('$item_name','$payer_email','$first_name','$last_name','$amount','$currency','$country','$txn_id','$txn_type','$payer_id','$payment_status','$payment_type','$create_date','$payment_date')");
    mysqli_close($con);
  }
}
$obj = New PayPal_IPN();
$obj->ipn_response($_REQUEST);
?>

IPN will not receive in localhost, it will receive only in domain or live site. if you want to check IPN code,

  1. login in to sandbox.paypal.com
  2. go IPN history ,click any one history , you will get IPN full url.
  3. using postman send request to your localhost. Now you can validate IPN response

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM