2013-06-17 2 views
0

Во-первых, спасибо за внимание. Приходит к вопросу.PayPal IPN Listener больше не работает

Я использую этот 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\r\n"; 
$header .= "Content-Type: application/x-www-form-urlencoded\r\n"; 
$header .= "Host: www.sandbox.paypal.com\r\n"; // www.paypal.com for a live site 
$header .= "Content-Length: " . strlen($req) . "\r\n"; 
$header .= "Connection: close\r\n\r\n"; 

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

Он сделал работу раньше, но не сейчас ... Я проверил переменные, которые PayPal вернуться на свой веб-сайт с var_dump и payment_status=Completed. Они выглядят нормально.

Я проверил, если соединение установлено, а также работает:

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

Проблема возникает с переменными stripos($res, "VERIFIED")stripos($res, "INVALID"). var_dump возврат как bool (false).

Просмотр профиля Sandbox История (покупателя и продавца), все результаты транзакций завершены. Но то, что делает меня сумасшедшим, заключается в том, что через неделю работает отлично ... Я искал, возможно, некоторые изменения в портах, хосте или переменных IPN-прослушивателя через PayPal, но, похоже, никто не изменился. Правильно?

Я написал прослушиватель IPN непосредственно на странице формы покупки, это означает, что прослушиватель IPN вызывается также без $_POST переменных. Только ответ для меня - это защита от спама от прослушивателя IPN в стороне PayPal, которая заблокировала меня, это возможно? Потому что слушатель вызывается также без cmd=_notify-validate, но просто он просто не работает (но сделал пустой звонок, который, возможно, не очень ценится PayPal).

EDIT:

Извините, ребята, повторно отлажена (да благословит var_dump). гнал var_dump в то время как петли так:

.... 
     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 == 0 и if !== false)? PayPal Просто изменено VERIFIED значение возврата?

ответ

0

Что сработало для меня было, чтобы удалить заголовок закрытия соединения и добавить триммер к ответу от PP.Вот заголовки:

$header = "POST /cgi-bin/webscr HTTP/1.1\r\n"; 
$header .= "Content-Type: application/x-www-form-urlencoded\r\n"; 
$header .= "Host: www.paypal.com\r\n"; 
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n"; 

Вот fsockopen:

$fp = fsockopen ('ssl://www.paypal.com', 443, $errno, $errstr, 30); 

и вот дифферент на ответ обратно из полипропилена:

if (!$fp) { 
// HTTP ERROR 
    error_mail("Could not open socket"); 
// 
} else { 
    fputs ($fp, $header . $req); 
    while (!feof($fp)) { 
    $res = trim(fgets ($fp, 1024)); 
    } 
// 
// check the payment_status is Completed 
// check that receiver_email is your Primary PayPal email 
// 
    if ((strcmp ($res, "VERIFIED") == 0) && ($payment_status == "Completed") && ($receiver_email == $valid_receiver_email)) { 

Это работало для меня.

0

У меня была аналогичная проблема, определена следующим образом:

Время от времени, когда мой слушатель сообщений обратно ЦМД = _notify-Validate, чтобы проверить новую IPN, вы получите нечто иное, чем «проверенную» или "INVALID" назад.

Иногда я получаю это: '. 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))

Я думаю, что если вы проверите эти две строки в дополнение к «VERIFIED» или «VERIFIED», INVALID "со мной все будет хорошо. Если нет, покажите мне, что вы получаете от paypal, что приводит к отказу от ваших полос ($ res, «VERIFIED») и stripos ($ res, «INVALID»).

Также стоит отметить, что иногда я получаю сообщение об ошибке промежуточного кеша или моего интернет-провайдера или PayPal, поэтому ваш код должен быть в состоянии восстановиться после этого, выполнив cmd = _notify-validate для этого IPN позже.

Наконец ... Я много лет боролся с системами IPN. Это всегда немного ненадежно, документация серьезно ошибается в нескольких местах, а IPN отстают от транзакций, часто на 15 минут и более.

Я нашел, что гораздо лучше использовать методы TransactionSearch и GetTransactionDetails API.

Документация здесь:

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. Дайте мне знать, хотите ли вы дальнейших указаний по внедрению.

Смежные вопросы