PayPal IPN监听器不再工作 [英] PayPal IPN Listener won't work anymore

查看:0
本文介绍了PayPal IPN监听器不再工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

首先,感谢您的关注。 说到点子上。

我使用的是以下IPN监听器代码:

// IPN LISTENER
// intercetta le variabili IPN inviate da PayPal
$req = 'cmd=_notify-validate';     
// legge l'intero contenuto dell'array POST
foreach ($_POST as $key => $value) {
    $value = urlencode(stripslashes($value));
    $req .= "&$key=$value";
}

// intestazione, prepara le variabili PayPal per la validazione
$header = "POST /cgi-bin/webscr HTTP/1.1
";
$header .= "Content-Type: application/x-www-form-urlencoded
";
$header .= "Host: www.sandbox.paypal.com
";  // www.paypal.com for a live site
$header .= "Content-Length: " . strlen($req) . "
";
$header .= "Connection: close

";

// apre una connessione al socket PayPal
$fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30);

// converte le variabili inviate da IPN in variabili locali
$txn_id = filter_var($_POST['txn_id'], FILTER_SANITIZE_STRING);
$payment_status = filter_var($_POST['payment_status'], FILTER_SANITIZE_STRING);
$receiver_email = filter_var($_POST['receiver_email'], FILTER_SANITIZE_EMAIL);
$payer_email = filter_var($_POST['payer_email'], FILTER_SANITIZE_EMAIL);
$first_name = filter_var($_POST['first_name'], FILTER_SANITIZE_STRING);
$last_name = filter_var($_POST['last_name'], FILTER_SANITIZE_STRING);
$address_street = filter_var($_POST['address_street'], FILTER_SANITIZE_STRING);
$address_city = filter_var($_POST['address_city'], FILTER_SANITIZE_STRING);
$address_state = filter_var($_POST['address_state'], FILTER_SANITIZE_STRING);
$address_zip = filter_var($_POST['address_zip'], FILTER_SANITIZE_STRING);

// verifica l'apertura della connessione al socket
if (!$fp) {

    // se la connessione non avviene l'esecuzione dello script viene bloccata
print("connessione PayPal non avvenuta, si prega di riprovare piu' tardi");

    // in alternativa è per esempio possibile inviare un'email al venditore
} else {

    // elaborazione delle informazioni
    fputs ($fp, $header . $req);
    while (!feof($fp)) {
        $res = fgets ($fp, 1024);

        // azioni in caso di risposta positiva da parte di PayPal
        if (stripos($res, "VERIFIED") !== false) {
$myvariables = 1;
$anothermyvariables = "INSERT INTO MyDB ( paid, name, email, date) 
VALUES ('". $txn_id ."','" . $first_name ." ". $last_name .  "','" . $payer_email ."','". the_date('Y-m-d','','',FALSE) . "');";
$wpdb->query($anothermyvariables);
            }

        }

        // azione in caso di risposta negativa da parte di PayPal else
        if (stripos($res, "INVALID") !== false) {
$anothervariablesofmine = 2;
$paypalerr = "Pagamento non riuscito!"; // Payment not success!
        }

    }

    // chiusura della sorgente di dati
    fclose($fp);
以前确实有效,但现在不行了.我用var_dumppayment_status=Completed测试了PayPal返回到我的网站的变量。他们看起来还好。

我已经测试了连接是否已建立并且工作正常:

if (!$fp) {
ecc..
} else {
print("Connection Established");
etc....

问题与变量stripos($res, "VERIFIED")stripos($res, "INVALID")有关。 var_dump将两者返回为bool (false)

查看沙盒档案历史记录(买方和卖方),所有交易结果都已完成。但让我抓狂的是一周后效果很好。 我通过PayPal搜索了IPN监听器端口、主机或变量的一些变化,但似乎没有变化。对吗?

我在购买表单页面中直接编写了IPN Listener,这意味着IPN Listener也是不带变量调用的。我唯一可能的回复是阻止我的PayPal侧的IPN侦听器的垃圾邮件保护,这是可能的吗?‘因为监听器也是在没有cmd=_notify-validate的情况下被调用的,但它就是不起作用(但发出了一个可能不太被PayPal认可的空白呼叫)。

编辑:

对不起,已重新调试(上帝保佑var_dump)。 已将var_dump放入While循环SO:

....
        while (!feof($fp)) {
        $res = fgets ($fp, 1024);
var_dump(stripos($res, "VERIFIED"));
print("<br> VERIFIED". stripos($res, "VERIFIED") ."<br>");
var_dump(stripos($res, "INVALID"));
print("<br> INVALID". stripos($res, "INVALID") ."<br>");
...

并找到一个VERIFIED int(0)而不是bool (false)

我刚刚更改了

 if (stripos($res, "VERIFIED") !== false) {

 if (stripos($res, "VERIFIED") == 0) {

我认为INVALID情况也是如此。

但我仍然不确定这是否正确。

这就是问题所在?或者我可以改变一些其他的东西吗?我可以同时使用if条件(if == 0if !== false)吗? PayPal刚刚更改VERIFIED返回值?

推荐答案

我遇到了类似的问题,修复方法如下:

当我的侦听器不时地回发cmd=_NOTIFY-VALIDATE来检查新的IPN时,您会得到"已验证"或"无效"之外的信息。

有时我会这样:

‘8’.chr(13).chr(10).‘VERIFIED’.chr(13).chr(10).‘0’.chr(13).chr(10).chr(13).chr(10)

有时我会这样:

‘00000008’.chr(13).chr(10).‘VERIFIED’.chr(13).chr(10).‘00000000’.chr(13).chr(10).chr(13).chr(10))

我认为,如果除了"已验证"或"无效"之外还检查这两个字符串,就不会有问题。如果没有,告诉我你从PayPal得到了什么,没有通过你的Stripos($res,"已验证")和Stripos($res,"无效")测试。

还值得注意的是,我有时会从中间缓存或我的ISP或PayPal超时时收到错误。因此,您的代码需要能够通过稍后对该IPN执行cmd=_NOTIFY-VALIDATE来恢复。

最后..。多年来,我一直在与IPN系统作斗争。它总是有点不可靠,文档在几个地方严重错误,IPN落后于交易,通常落后15分钟或更长时间。

我发现使用API的TransactionSearch和GetTransactionDetail方法要好得多。

此处的文档:

https://developer.paypal.com/docs/classic/api/merchant/GetTransactionDetails_API_Operation_NVP/

https://developer.paypal.com/docs/classic/api/merchant/TransactionSearch_API_Operation_NVP/

这些都是可靠的,并且延迟要小得多。我有一个cron作业,它每15分钟运行一次,以使用这些方法检查新事务。我还会在每次收到IPN时运行新的交易检查。如果您需要有关实施的进一步指导,请告诉我。

这篇关于PayPal IPN监听器不再工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆