Почему песочница PayPal не отправляет мне IPN? - PullRequest
1 голос
/ 25 августа 2010

Мой обработчик и PayPal общались несколько дней назад, затем произошло нечто, из-за чего последний перестал отправлять IPN.Я попытался смоделировать отправку IPN с помощью собственного сценария без возможности обратной отправки для проверки с использованием cURL.Мой обработчик отлично работает.Я также помещаю простую строку кода (уже проверенную с помощью cURL) перед строками, которые отправляются обратно в PayPal, чтобы я мог проверить ответ PayPal.Эта строка кода просто записывает IPN в базу данных.Это также не записывалось.Это должно правильно?Потому что PayPal отправляет IPN дважды.Я удостоверился, что IPN включен в моей учетной записи продавца, и ссылка указывает на мой обработчик.Теперь я начинаю подозревать, что PayPal не отправляет мне ничего.Вот мой обработчик:

<?php

require_once 'classes/Mysql.php';
require_once 'classes/Email.php';

$mysql = new Mysql();
$myemail = new Email();

// read the post from PayPal system and add 'cmd'
$req = 'cmd=_notify-validate';

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

// assign posted variables to local variables
$item_name = $_POST['item_name'];
$payment_status = $_POST['txn_type'];
$payment_amount = $_POST['mc_amount3'];
$payment_currency = $_POST['mc_currency'];
$subscr_id = $_POST['subscr_id'];
$receiver_email = urldecode($_POST['receiver_email']);
$payer_email = $_POST['payer_email'];
$subscr_type = $_POST['option_selection1'];
$username = $_POST['custom'];

//Save a copy of $req to the database. If paypal sends IPN, this should at least grab the first one before validation. 
$memberID = $mysql->get_member_id($username);
$mysql->test_message($req.$payment_amount.$payment_currency, $memberID, $username, $payment_amount, $payment_currency);

// post back to PayPal system to validate
$header .= "POST /cgi-bin/webscr HTTP/1.0\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n";
$fp = fsockopen ('ssl://www.paypal.com', 443, $errno, $errstr, 30);

if (!$fp) {
// HTTP ERROR
} else {
fputs ($fp, $header . $req);
while (!feof($fp)) {
$res = fgets ($fp, 1024);
if (strcmp ($res, "VERIFIED") == 0) {

//This if block does the payment processing. If I place this before the validation/post back occurs, it doesn't work either. But it works when testing using my cURL script--- before the validation.
if($memberID)
{
    if($payment_status=='subscr_signup' && $payment_currency=='USD' && !$mysql->check_if_transactionID_exists($subscr_id)) 
    {
        $mysql->activate_subscription($memberID, $subscr_id, $subscr_type, $payment_amount);
    }

}

}
else if (strcmp ($res, "INVALID") == 0) {
// log for manual investigation
}
}
fclose ($fp);
}

Я слышал так много историй, которые PayPal так расстраивает.Может быть, PayPal просто не отправляет IPN или что-то не так с моим обработчиком?

1 Ответ

0 голосов
/ 30 августа 2011

Я столкнулся с подобной проблемой - если вы сбросите переменную $res со строки $res = fgets ($fp, 1024);, вы увидите HTTP/1.1 200 OK, а не VERIFIED / INVALID, который вы ищете .

Попробуйте проверить этот ответ для получения дополнительной информации: Paypal IPN возвращает HTTP / 1.1 200 OK

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...