Paypal: неверная проблема с IPN - PullRequest
1 голос
/ 19 марта 2011

Привет, я знаю, что в SO уже есть много вопросов, связанных с моей проблемой, но я не нашел решения ни по одному из них. Я реализовал PayPal. Работает хорошо. Теперь я хочу внедрить ipn в мою реализацию PayPal. Я искал и нашел некоторый код. Я реализовал это, но я получаю недействительным IPN. Я могу получить все детали из транзакции PayPal, но для IPN это всегда недействительно. Я использовал следующий код в файле DoExpressCheckoutPayment.php

$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";

// If testing on Sandbox use: 
$header .= "Host: www.sandbox.paypal.com:443\r\n";
//$header .= "Host: www.paypal.com:443\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n";

// If testing on Sandbox use:
//$fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30);
$fp =fsockopen('ssl://www.sandbox.paypal.com',443,$err_num,$err_str,30);
echo('<br>'.$req);
// assign posted variables to local variables
/*$item_name = $_POST['item_name'];
$item_number = $_POST['item_number'];
$payment_status = $_POST['payment_status'];
$payment_amount = $_POST['mc_gross'];
$payment_currency = $_POST['mc_currency'];
$txn_id = $_POST['txn_id'];
$receiver_email = $_POST['receiver_email'];
$payer_email = $_POST['payer_email'];*/

if (!$fp)
{
    echo(' HTTP ERROR');
}
else
{
    fputs ($fp, $header . $req);
    while (!feof($fp))
    {
        $res = fgets ($fp, 1024);
        echo('<br> res is '.$res);
    if (strcmp ($res, "VERIFIED") == 0)
    {
        // check the payment_status is Completed
        // check that txn_id has not been previously processed
        // check that receiver_email is your Primary PayPal email
        // check that payment_amount/payment_currency are correct
        // process payment

        $mail_From = "From: me@mybiz.com";
        $mail_To = "xxxx@gmail.com";
        $mail_Subject = "VERIFIED IPN";
        $mail_Body = $req;
        foreach ($_SESSION as $key => $value)
        {
            $emailtext .= $key . " = " .$value ."\n\n";
        }
        if(mail($mail_To, $mail_Subject, $emailtext . "\n\n" . $mail_Body, $mail_From))
        echo('<br>mail 1 sent');
        else
        echo('<br>mail1 not sent');
    }
    else if (strcmp ($res, "INVALID") == 0)
    {
        // log for manual investigation
        $mail_From = "From: me@mybiz.com";
        $mail_To = "xxx@gmail.com";
        $mail_Subject = "INVALID IPN";
        $mail_Body = $req;
        foreach ($_SESSION as $key => $value)
        {
            $emailtext .= $key . " = " .$value ."\n\n";
        }
        if(mail($mail_To, $mail_Subject, $emailtext . "\n\n" . $mail_Body, $mail_From))
        echo('<br>mail sent');
        else
        echo('<br>not sent');
    }
}
fclose ($fp);
}

Я устанавливаю notify_url в другом файле, который указывает на этот файл, как этот

&lt;input type="hidden" name="notify_url" value="http://www.mysite.com/paypal/DoExpressCheckoutPayment.php"/>

Я получаю следующее письмо:

**notify_url = http://www.mysite.com/paypal/DoExpressCheckoutPayment.php
cmd=_notify-validate&notify_url=http%3A%2F%2Fwww.mysite.com%2Fpaypal%2FDoExpressCheckoutPayment.php**

Одна вещь, которую я заметил, что я ничего не получаю от $ _POST. Мой $ _POST пуст. Пожалуйста, скажите мне, где я не прав. Спасибо

Ответы [ 2 ]

1 голос
/ 26 июля 2011

URL, указанный как обратная ссылка, вызывается 2 раза! Первый раз он приходит из PayPal и отправляет данные POST, второй раз пользователь перенаправляется. Вы увидите некоторые переменные GET, но они совершенно бесполезны (по крайней мере, для запроса транзакции).

Единственный способ проверить, поступают ли данные POST (в первом запросе), - использовать error_log или что-то в этом роде.

1 голос
/ 19 марта 2011

Попробуйте этот код здесь.Это немного отличается от того, который вы использовали выше.У меня это работает.

    <?php
    $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.sandbox.paypal.com', 443, $errno, $errstr, 30);

    // assign posted variables to local variables
    $item_name          = $_POST['item_name'];
    $item_number        = $_POST['item_number'];
    $payment_status     = $_POST['payment_status'];
    $payment_amount     = $_POST['mc_gross'];
    $payment_currency   = $_POST['mc_currency'];
    $txn_id             = $_POST['txn_id'];
    $receiver_email     = $_POST['receiver_email'];
    $payer_email        = $_POST['payer_email'];

    if (!$fp) {

        // HTTP ERROR

    } else {
        fputs ($fp, $header . $req);
            while (!feof($fp)) {
            $res = fgets ($fp, 1024);
            if (strcmp ($res, "VERIFIED") == 0) {
                //Process Order
            }else if (strcmp ($res, "INVALID") == 0) {
                //Send Email To You 
            }
        }

        fclose ($fp);
    }
    ?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...