PayPal IPN php всегда недействителен

0

Я попытался написать небольшой обработчик IPN PayPal, но я всегда получаю "INVALID" при использовании симулятора IPN https://developer.paypal.com/webapps/developer/applications/ipn_simulator. Я не уверен, что о URL-адресе, который я отправляю обратно, является неправильным. Я рассматривал некоторых Гистов для этой темы, но все они кажутся немного длинными. Их документы на этом находятся здесь https://developer.paypal.com/webapps/developer/docs/classic/ipn/integration-guide/IPNIntro/#protocol_and_arch, и я думаю, что я выполнил все шаги для протокола. Любая помощь приветствуется

<?php

    /**
     * Validates a PayPal IPN notification
     * @param  array $req The $_POST variable for the request
     * @return String     Returns the validity: 'VALID' or 'INVALID'
     */
    function verifyPayPalIPN($req) {

        // Base URL for the php validation
        $baseURL = 'https://www.paypal.com/cgi-bin/webscr?cmd=_notify-validate';

        // Loop through the POST parameters to 
        // create the validaton URL
        $postVars = '';
        foreach ($req as $key => $value) {
            $postVars .= $key . '=' . urlencode($value) . '&';
        }

        // Strip the last & off of the URL
        $postVars        = substr($postVars, 0, -1);

        // Send the request to PayPal to confirm 
        // whether the request to the script is 
        // from PayPal
        $requestValidity = system("curl --data '$postVars' $baseURL");

        return $requestValidity;
    }
    file_put_contents('/tmp/result.txt', verifyPayPalIPN($_POST));

?>
Теги:
paypal

2 ответа

0

во-первых, проверьте, является ли ваша платная среда и проверяющая среда одинаковой (как sandbox и обе production), если это не так, скажите, что ваш клиент оплатил заказ в production среде, но затем ваш код PHP пытается запросить конечную точку среды sandbox для проверки запроса IPN, он всегда будет заканчиваться как INVALIDE

0

cmd=_notify-validate должен быть частью вашей строки postVars

$baseURL = 'https://www.paypal.com/cgi-bin/webscr';

// Loop through the POST parameters to 
// create the validaton URL
$postVars = 'cmd=_notify-validate';
foreach ($req as $key => $value) {
    $postVars .= $key . '=' . urlencode($value) . '&';
}

Код, который я использовал в прошлом, следующий:

$req = 'cmd=_notify-validate';

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

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

        } else if (strcmp ($res, "INVALID") == 0) {

        }
    }
    fclose($fp);
}

Обратите внимание на номер порта. 443 также

  • 0
    Попробуйте этот метод, и я все еще получаю недействительным. Придется ли мне совершать фактическую покупку, чтобы получить значение VALID, или симулятор IPN будет отправлять запросы «VERIFIED» слушателю?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню