简体   繁体   中英

Paypal IPN listener not hearing

I have some sample IPNs in Paypal and am trying to set up the listener but regardless of what I try it is simply not talking to it, although it says it is.

Here's the listener code:

$debug=true;

//Put together postback info
$postback = 'cmd=_notify-validate';

foreach($_POST as $key =>$value){
     $postback .= "&$key=$value";
}

// build the header string to post back to PayPal system to validate
$header = "POST /cgi-bin/webscr HTTP/1.1\r\n";
$header .= "Host: www.sandbox.paypal.com\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($postback) . "\r\n\r\n";

$fp = fsockopen ('www.sandbox.paypal.com', 80, $errno, $errstr, 30);//open the connection

if(!$fp){ //no conn
    die();
}

//post data back
fputs($fp, $header . $postback);

$res=stream_get_contents($fp, 1024);

if((strcmp($res, "VERIFIED")) == 0){ //verified!
    if($debug){         
        $filename = 'debug/verify.txt'; //create a file telling me we're verified
        $filehandle=fopen($filename, 'w');
        fwrite($filehandle,'VERIFIED!');
        fclose($filehandle);
    }
} else {
    if($debug){       
        $filename = 'debug/verify.txt'; //create a file telling me we're NOT verified
        $filehandle=fopen($filename, 'w');
        fwrite($filehandle,'NOT VERIFIED!');
        fclose($filehandle);
    }
}

if($debug){       
    $filename = 'debug/alive.txt'; //create a file telling me we're alive at least
    $filehandle=fopen($filename, 'w');
    fwrite($filehandle,'NOT VERIFIED!');
    fclose($filehandle);
}

Very simple, and here's a screenshot of a IPN i'm sending which is doing nothing:

在此处输入图片说明

I added the code at the end of the listener file to at least let me know its been hit but it doesn't do anything.

Is there anything obvious I've missed? Tearing my hair out with this stuff. Is there any more debugging I can do?

I don't know about your code, but try the code I'm currently using in my IPN listener, it works absolutely fine:

$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

$ch = curl_init('https://www.sandbox.paypal.com/cgi-bin/webscr');
if ($ch == FALSE) {
    return FALSE;
}

curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
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);

// 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 "http://curl.haxx.se/docs/caextract.html" 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) {
    error_log(date('[Y-m-d H:i:s] '). "Couldn't connect to PayPal to validate IPN message: " . curl_error($ch) . PHP_EOL, 3, LOG_FILE);
    curl_close($ch);
    exit;

} else {
        curl_close($ch);
}

// Inspect IPN validation result and act accordingly
if (strcmp($res, 'VERIFIED') == 0) {
    // do something...
} elseif (strcmp($res, 'INVALID') == 0) {
    // do something...
}

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