【问题标题】:PayPal IPN not working after payment redirect to success URL付款重定向到成功 URL 后,PayPal IPN 不起作用
【发布时间】:2017-09-20 00:00:19
【问题描述】:

我正在本地主机上工作。我已经在我的网站上成功实施了 Payza,但我也没有打算整合 Paypal。我从某个网站下载了一个代码(不记得从哪里下载了),并尝试在收到的本地主机上对其进行测试,然后才能根据我的要求在我的网站上修改和实施它。该代码似乎适用于所有步骤,而不是接收发送到我的 URL 的 IPN 数据。由于我使用 localhost 进行开发,因此我使用 ngrok 进行测试(在 Internet 上运行我的 localhost)。下面是两页。

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);
?>

【问题讨论】:

    标签: php mysql paypal paypal-ipn paypal-sandbox


    【解决方案1】:

    IPN 不会在 localhost 中接收,它只会在域或实时站点中接收。如果要查看IPN码,

    1. 登录 sandbox.paypal.com
    2. 进入IPN历史,点击任意一条历史,即可获得IPN完整url。
    3. 使用邮递员发送请求到您的本地主机。现在您可以验证 IPN 响应

    【讨论】:

    • 我正在使用 ngrok 通过互联网访问 localhost。在使用 Payza 进行测试时,即使它们没有发送到 localhost,但是当我使用 ngrok 时,它们会发送 IPN 数据,因为 ngrok 使 localhost 可以通过 INTERNET 访问。如果payza可以,那为什么paypal不能?
    • 我没有使用 ngrok,所以我不知道它如何处理 localhost 到域。 developer.paypal.com/docs/classic/ipn/integration-guide/… 参考这里,您将找到 IPN 故障排除提示。它可以帮助你:)
    猜你喜欢
    • 2017-08-01
    • 2014-11-07
    • 2014-07-15
    • 2013-07-02
    • 1970-01-01
    • 2013-07-31
    • 2014-01-23
    • 2012-11-07
    • 2011-11-24
    相关资源
    最近更新 更多