Во-первых, спасибо за внимание. Приходит к вопросу.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
значение возврата?