Paypal: неверная проблема с IPN

Привет, я знаю, что в 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 пуст. Скажите, пожалуйста, где я ошибаюсь. благодаря

Related of "Paypal: неверная проблема с IPN"

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

  <?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); } ?> 

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

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