PayPal IPN侦听器与沙箱一起工作,但不是实时的


PayPal IPN Listener Working with sandbox but not live

我有一个paypal ipn监听器ipn.php,它链接到一个数据库,用通知信息更新通知表,然后通过电子邮件向付款人发送一个密钥。

这是ipn.php

<?php    
include("class.phpmailer.php");
include("class.smtp.php");
include("config.php");
    //Send an empty HTTP 200 OK response to acknowledge receipt of the notification
ini_set("log_errors", "On");
ini_set("error_log", "error.log");
$con = mysql_connect($dbhost,$dbuser,$dbpass);
if($con == false){ echo "Could not connect to mysql: " . mysql_error();}
else{echo "Connected to database successfully!";}
header('HTTP/1.0 200 OK');
header('Connection: close');

$item_name        = $_POST['item_name'] != null ? $_POST['item_name'] : "none"; 
$item_number      = $_POST['item_number'] != null ? $_POST['item_number'] : "none";
$payment_status   = $_POST['payment_status'] != null ? $_POST['payment_status'] : "none";
$payment_amount   = $_POST['mc_gross'] != null ? $_POST['mc_gross'] : "none";
$payment_currency = $_POST['mc_currency'] != null ? $_POST['mc_currency'] : "none";
$txn_id           = $_POST['txn_id'] != null ? $_POST['txn_id'] : "none";
$receiver_email   = $_POST['receiver_email'] != null ? $_POST['receiver_email'] : "none";
$payer_email      = $_POST['payer_email'] != null ? $_POST['payer_email'] : "none";
// Build the required acknowledgement message out of the notification just received
$req = 'cmd=_notify-validate';               // Add 'cmd=_notify-validate' to beginning of the acknowledgement
foreach ($_POST as $key => $value) {         // Loop through the notification NV pairs
    $value = urlencode(stripslashes($value));  // Encode these values
    $req  .= "&$key=$value";                   // Add the NV pairs to the acknowledgement
}
// Set up the acknowledgement request headers
$header  = "POST /cgi-bin/webscr HTTP/1.0'r'n";     // HTTP POST request
$header .= "Host: www.paypal.com'r'n";
$header .= "Content-Type: application/x-www-form-urlencoded'r'n";
$header .= "Content-Length: " . strlen($req) . "'r'n'r'n";
// Open a socket for the acknowledgement request
$fp = fsockopen('ssl://www.paypal.com', 443, $errno, $errstr, 30);
// Send the HTTP POST request back to PayPal for validation
fputs($fp, $header . $req);

    error_log("reached");
    $res = stream_get_contents($fp,1024);           // Get the acknowledgement response
    while(!feof($fp)){
        $res = trim(fgets($fp,1024));
        if(empty($res)){
            break;
        }
    }
    $res = trim(fgets($fp,1024));
    if (strcmp ($res, "VERIFIED") == 0) {  // Response contains VERIFIED - process notification

        $sql = "INSERT INTO notifications VALUES( DEFAULT, '$item_name','$item_number','$payment_status','$payment_amount','$payment_currency','$txn_id','$receiver_email','$payer_email')";
        mysql_select_db($dbname,$con);
        if(!mysql_query($sql)){
            error_log(mysql_error());
        }
        if(strcmp($payment_status,"Completed") == 0){
            mysql_select_db($dbname, $con);
            $key = get_new_key();
            $sql = "";
            $sql = "INSERT INTO activationkeys VALUES(DEFAULT, '$key', '0', $item_number)";
            if(!mysql_query($sql)){
                error_log("Could not execute query: " . mysql_error());
            }
            $mail = new PHPMailer(true);
            //Send mail using gmail
            if($config_gmail){
                $mail->IsSMTP();
                $mail->SMTPAuth = true;
                $mail->SMTPSecure = "tls";
                $mail->Host = "smtp.gmail.com";
                $mail->Port = 587;
                $mail->Username = $config_gmail_username;
                $mail->Password = $config_gmail_password;
            }
            //Typical mail data
            $mail->AddAddress($payer_email,"Donator");
            $mail->SetFrom($config_merchant_domain,$config_merchant_name);
            $mail->Subject = "You're Donation Key";
            $mail->Body = "Hey, your payment was successful.'nHere's your key: " . $key;
            if(!$mail->send()){
                error_log("Message could not be sent: " . $mail->ErrorInfo );
            }

        }
        mysql_close($con);

        // Authentication protocol is complete - OK to process notification contents
        // Possible processing steps for a payment include the following:
        // Check that 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 payment
    } 
    else if (strcmp ($res, "INVALID") == 0) { //Response contains INVALID - reject notification
        // Authentication protocol is complete - begin error handling
        // Send an email announcing the IPN message is INVALID
        $mail_From    = "IPN@example.com";
        $mail_To      = "Your-eMail-Address";
        $mail_Subject = "INVALID IPN";
        $mail_Body    = $req;
        mail($mail_To, $mail_Subject, $mail_Body, $mail_From);
    }
fclose($fp);  // Close the file
function get_new_key(){
    $keycharacters = "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    $key = "";
    for($i = 0; $i < 10; $i++){
        $key .= $keycharacters[rand(0,strlen($keycharacters)-1)];
    }
    return $key;
}
?>

问题是,当我通过沙盒发送时,它会更新数据库并通过电子邮件发送密钥,但当我尝试实时使用代码时,它什么都没做。。。

我不知道问题出在哪里。

有错误吗?已检查IPN历史日志?如果进行API呼叫,请确保使用LIVE凭据,如果仍然有问题,请向我提供帐号或电子邮件地址,或将票转到paypal.com/mts

我已经设法修复了它,问题是我读取响应的方式,我现在使用;

if (!$fp) {  
        error_log("could not open socket"); 
    } else {  
        fputs ($fp, $header . $req);  
        while (!feof($fp)) {  
            $res = fgets ($fp, 1024);  
            if (strcmp ($res, "VERIFIED") == 0){
                break;
            }
        }
    }