2013-07-19 2 views
1

Я настроил Paypal уведомления счетов URL для перехода к этому сценарию:Paypal IPN отказ

// Read the notification from PayPal which comes in the form of a POST array and create the acknowledgement response 
    $req = 'cmd=_notify-validate';    // add 'cmd' to beginning of the acknowledgement you send back to PayPal 

    foreach ($_POST as $key => $value) 
    { // Loop through the notification NV pairs 
    $value = urlencode(stripslashes($value)); // Encode the values 
    $req .= "&$key=$value";     // Add the NV pairs to the acknowledgement 
    } 


    // Assign the paypal payment notification values to local variables 
    if($_POST){ 
    $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'];} 

    //Set up the acknowledgement request headers (this is the updated version for http 1.1) 
    $header .= "POST /cgi-bin/webscr HTTP/1.1\r\n"; 
    $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; 
    $header .= "Host: www.paypal.com\r\n"; 
    $header .= "Connection: close\r\n"; 
    $header .= "Content-Length: " . strlen($req) . "\r\n\r\n"; 
    //Open a socket for the acknowledgement request 
    $fp = fsockopen ('www.paypal.com', 80, $errno, $errstr, 30); 

    if(!$fp){ 
     echo "HTTP ERROR"; 
    } 
    else 
    {//start 1 

    // Post request back to PayPal for validation 
    fputs ($fp, $header . $req); 

    //once paypal receives the acknowledgement response, another message will be send containing the single word VERIFIED or INVALID 

    while (!feof($fp)) 
     { //start 2, while not EndOfFile 
    $res = fgets ($fp, 1024); // Get the acknowledgement response 
    $res = trim($res); 
     if (strcmp ($res, "VERIFIED") == 0) 
      {// start 3, Response is OK 

      if ($payment_status == "Completed") 
       {//start 4 

       //send email announcing success 

       $from = "Rupert Heath Literary Agency"; 
       $to = $payer_email; 
       $subject = "Ebook"; 
       $body = "It works"; 
       mail($to, $subject, $body, $from); 

       }//end 4 
      }//end 3 
      else if(strcmp ($res, "INVALID") == 0) 
       {//start 5 

       //send email announcing failure 
       //$error_log .= 'Line 57' 

       $from = "Guide Test Page"; 
       $to = $payer_email; 
       $subject = "INVALID IPN"; 
       $body = "Doesn't work"; 
       mail($to, $subject, $body, $from); 
       }//end 5 


    } //end 2 
fclose ($fp); //close file pointer 
} //end 1 

который основан на ряде размещенных в Интернете примеров и обслуживает обновления до HTTP 1.1

Сценарий, как тест, отправляет либо сообщение об успехе, либо сообщение об отказе в зависимости от того, какой из ответов вы получили VERIFIED или INVALID от Paypal. Проблема в том, что я всегда получаю INVALID-адрес электронной почты и не могу понять, почему. Я просмотрел историю IPN Paypal, а код ответа HTTP - 200, который, похоже, указывает, что обмен IPN работал правильно, поэтому, возможно, Paypal отвечает VERIFIED, но у моего скрипта есть ошибка.

Подробности История IPN являются:

Моментальная оплата Уведомление (IPN) детали

сообщение ID69025489S2598613V

Дата/время created18/07/2013 23:22 PDT

Оригинал/Resent Оригинал

Последняя дата поставки/время поставки 18/07/2013 23:22 PDT

Уведомление URL http://www.rupertheath.com/ipn/ipn_script

код ответа HTTP 200

Статус доставки Направлено

Количество повторных попыток 0

Сделка ID4D0877596N038120Y

IPN typeTransaction сделал

IPN Сообщение mc_gross = 0,01 & protection_eligibility = Приемлемые & address_status = подтвердил & payer_id = C3USV8A4Q2QDW & налог = 0,00 & address_street = Рэмси Дом 34 Fowlers Дорога & PAYMENT_DATE = 23: 22: 44 18 июля 2013 PDT & payment_status = Завершено & кодировок = Windows- 1252 & address_zip = SP1 2QU & first_name = Michael & mc_fee = 0,01 & address_country_code = GB & address_name = Майкл Хит & notify_version = 3,7 & пользовательские = & payer_status = проверено & [email protected] & address_country = Великобритания & address_city = Salisbury & количество = 1 & verify_sign = AhKyCHsfiy2frgZNNoQmGHQ3LhKMAboweJqZzYCdqp30Hb7b99tF.04a & [email protected] & txn_id = 4D0877596N038120Y & payment_type = мгновенная & last_name = Хит & address_state = Уилтшир & receiver_email = emailagency @ rupertheath.ком & payment_fee = & receiver_id = BRM2TYMP4ACZ8 & txn_type = web_accept & item_name = Ebook & mc_currency = GBP & ITEM_NUMBER = & residence_country = GB & handling_amount = 0,00 & transaction_subject = Ebook & payment_gross = & доставка = 0,00 & ipn_track_id = b0a3b4ae3c51c

Может ли кто-нибудь помочь мне отладить эту проблему?

+0

Откуда у вас этот код подтверждения? –

+0

Paypal имеет страницу истории IPN, и если вы нажмете на конкретное событие IPN, вы получите все эти данные. По имеющимся данным, Paypal думает, что все прошло хорошо, поэтому я подозрительно отношусь к моему сценарию, несмотря на то, что перестал это сто раз! – Perkin5

ответ

0

Это вполне может быть проблема с этой линии:

$value = urlencode(stripslashes($value)); 

В частности, с помощью stripslashes там. Вам нужно включить только stripslashes, если ваша конфигурация PHP (бог вам помочь) Magic Quotes. К счастью, Волшебные Кавычки были удалены в PHP 5.4, так что вы, вероятно, можете безопасно удалить stripslashes от этой линии, что делает его:

$value = urlencode($value); 

Верьте или нет, Paypal позволяет пользовательские данные содержат символы. Поэтому, если IPN имеет обратную косую черту, и вы удаляете их с stripslashes, когда вы отправляете данные IPN обратно в PayPal для проверки Paypal, вы получите ответ INVALID, так как данные не совпадают.

1

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

file_get_contents(
    'https://www.paypal.com/cgi-bin/webscr?cmd=_notify-validate', 
    false, 
    stream_context_create(array(
     'http'=>array(
      'method'=>'POST', 
      'header' => 'Content-Type: application/x-www-form-urlencoded', 
      'content' => file_get_contents('php://input'), 
     ) 
    )) 
); 

Его можно легко превратить в cURL.

+0

Спасибо за то, что может быть улучшением, но мой сценарий довольно стандартный, и в Интернете есть десятки примеров, все в основном одинаковые, так почему же это не работает для меня? – Perkin5

+0

@ Perkin5 В принципе, я ничего не верю, после анализа PHP, чтобы снова стать исходной строкой; извините, я не могу точно сказать, почему ваш скрипт не работает. –