簡體   English   中英

PayPal IPN偵聽器在沙箱內部運行,但不在外部

[英]PayPal IPN Listener works inside sandbox but not outside

我正在運行由tutsplus編寫的PayPal IPN偵聽器,已對其進行了一些修改以滿足我的需要。 一切正常,直到我從沙盒轉到實時模式。 我已經看過代碼,並且不太了解我是否需要切換任何東西,或者它是否正在檢查沙箱/實時環境。

<?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("mssoad@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');
$date=$this->issetCheck($post,'custom');
$create_date=date('Y-m-d H:i:s');
$payment_date=date('Y-m-d H:i:s');

$firstLast = $first_name . $last_name;

$explode = explode('|', $item_name);

foreach($explode as $slot) {

    if(strlen($slot) > 0) {

        $query = "INSERT INTO bookings (date, start, name, email, phone, order_id) VALUES ('$date', '$slot', '$firstLast', '$payer_email', '$phone', '$orderid')"; 
        $result = mysqli_query($con, $query) or die(mysqli_error($link)); 

    } // Close if

} // Close foreach


mysqli_query($con,"INSERT INTO trans_tbl (item_name,ride_day,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','$date','$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);

    ?>

在貝寶(Paypal)網站的IPN歷史記錄中,它停留在發送-重新發送。

我已經設置了IPN設置,並在配置文件設置中通知了URL,並且擁有一個企業帳戶。 我的電子郵件也已通過該帳戶驗證。 還要注意的另一件事是,我一直在用簡單的$ 0.01來測試此外部沙箱模式,並且返回頁面工作正常,但不是ipn監聽器。

非常感謝任何幫助,謝謝。

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

可能不正確,您應該進行測試以進行確認,但是我認為這是因為$im_debut_ipn變量(設置為TRUE時)不僅“調試”,而且由於某種原因還被用來確定$im_debut_ipn網址。 然后將網址設置為貝寶沙箱網址(請參見上文)。

即,何時

$im_debut_ipn = true

然后,

$fp = fsockopen('ssl://www.sandbox.paypal.com', "443", $err_num, $err_str, 60);

也是如此。

請注意,我認為$im_debut_ipn實際上是一個錯字,應該是..debug.. ,這意味着一種調試模式可以顯示錯誤消息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM