2015-10-15 4 views
0

Я использую следующий класс для обработки данных IPN: https://github.com/WadeShuler/PHP-PayPal-IPN (и это работает прекрасно подходит для возрастов)Paypal IPN теперь возвращает INVALID - PHP код ранее работал прекрасный

Последний успешно обработал платеж был на 28 сентября следующий платеж IPN, который пришел, хотя 5 октября вернулся ответ INVALID, как и каждый платеж с тех пор.

Если я тестирую в симуляторе IPN, сообщение успешно обрабатывается. Песочница или Live, ответ НЕВЕРНЫЙ. Я бы подумал, что у Sandbox есть объект, где я могу проверить, почему сообщение было отклонено как INVALID, но похоже, что это не так? Конечно, был бы простой способ увидеть причину отказа, я что-то упустил?

Ссылка, которая приносит вам Paypal от моего сайта:

https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_ext-enter&redirect_cmd=_xclick&[email protected]&item_name=QLD++%28Pacific+pines+secondary+Sat+25th+July+%29&item_number=FYD15000003&custom=0001000003&currency_code=AUD&amount=0.01&no_shipping=1&image_url=http://www.fydentry.com/img/follow-your-dreams-100.jpg&return=http://www.fydentry.com/entry-test.php&cancel_return=http://www.fydentry.com/entry-test.php&notify_url=http://www.fydentry.com/payback-test.php

Данные, размещенные назад от Paypal является:

transaction_subject = 0001000003 & txn_type = web_accept & payment_date = 07% 3A05% 3A07 + окт. + 15% 2C + 2015 + PDT & last_name = покупатель & residence_country = AU & pending_reason = multi_currency & item_name = QLD ++% 28Pacific + сосны + вторичный + СБ + двадцать пятый + июля +% 29 & payment_gross = & mc_currency = AUD & бизнес = продаж, ведущий% 40fydentry.com & payment_type = мгновенная & protection_eligibility = Ineligible & verify_sign = Acssfl2b2v1gxOK33TD2StcDhf-OAZxwix74kxFlSgpWMku6myuy.WFL & payer_status = проверен & test_ipn = 1 & налога = 0,00 & payer_email = продажа-покупатель% 40fydentry.com & txn_id = 9BV63134E20871700 & количество = 1 & receiver_email = продажа-фасилитатор% 40fydentry.com & first_name = тест & payer_id = FY3RYW98GNMXG & receiver_id = 95FC3QCK53MHC & ITEM_NUMBER = FYD15000003 & handling_amount = 0,00 & payment_status = До & доставка = 0,00 & mc_gross = 0,01 & пользовательские = 0001000003 & кодировок = окна-1252 & notify_version = 3,8 & ipn_track_id = cfbd422d97d69

ответ я отправить обратно в Paypal является:

CMD = _notify-проверки & transaction_subject = 0001000003 & txn_type = web_accept & PAYMENT_DATE = 07% 3A05% 3A07 + октября + 15% 2C + 2015 + PDT & last_name = покупатель & residence_country = AU & pending_reason = multi_currency & item_name = QLD ++% 28Pacific + сосны + вторичные + сб + 25 + июль +% 29 & payment_gross = & mc_currency = AUD & business = sales-facator% 40fydentry.ком & payment_type = мгновенная & protection_eligibility = Ineligible & verify_sign = Acssfl2b2v1gxOK33TD2StcDhf-OAZxwix74kxFlSgpWMku6myuy.WFL & payer_status = проверено & test_ipn = 1 & налог = 0,00 & payer_email = продажи-покупатель% 40fydentry.com & txn_id = 9BV63134E20871700 & количество = 1 & receiver_email = продажи-фасилитатор% 40fydentry.com & first_name = тест & payer_id = FY3RYW98GNMXG & receiver_id = 95FC3QCK53MHC & ITEM_NUMBER = FYD15000003 & handling_amount = 0,00 & payment_status = До & доставка = 0,00 & mc_gross = 0,01 & пользовательские = 0001000003 & кодировок = окна-1252 & notify_version = 3,8 & ipn_track_id = cfbd422d97d69

И код в окупаемости-test.php является:

<?php 
    include_once("f_common.php"); 
    include_once("IpnListener.php"); 

    use wadeshuler\paypalipn\IpnListener; 

    $listener = new IpnListener(); 
    $listener->use_sandbox = true; 
    $dbh = open_db(); 

    $res = 'UNKNOWN'; 

    try { 
    $listener->requirePostMethod(); 
    $verified = $listener->processIpn(); 
    } catch (Exception $e) { 
    error_log($e->getMessage()); 
    exit(0); 
    } 


    if ($verified) { 
     $res = "VERIFIED"; 
    } else { 
     $res = "INVALID"; 
    } 

    $stmt_debug = $dbh->prepare('INSERT INTO fyd_paypal_ipn (post_data, response_data, status, message_time) VALUES (:post_data, :response_data, :status, UTC_TIMESTAMP())'); 
    $stmt_debug->execute(array(':post_data' => $listener->rawPostData, ':response_data' => $listener->debug_response, ':status' => $res)); 
?> 

Обратите внимание, что для цель этого упражнения, я также изменил класс IpnListener, чтобы получить копию ответа для целей отладки.

В верхней части файла в объявлениях переменных, я сделал $ rawPostData общественности, и добавили эту переменную:

public $debug_response; 

И хранить значение перед мы используем его:

 $this->debug_response = $req; 

     if ($this->use_curl) { 
      $res = $this->curlPost($req); 
     } else { 
      $res = $this->fsockPost($req); 
     } 

Я предполагаю, что что-то изменилось на стороне Paypal, чтобы остановить это в первую очередь, но я не вижу, что это такое, особенно, поскольку мой ответ кажется правильным (идентичным), и я не могу найти что-либо в сторона Sandbox, которая помогает мне определить, почему она считается недействительной? К сожалению, код отладки внизу, где я отслеживаю данные и ответные сообщения IPN, является новым, поэтому у меня нет более старого (рабочего!) Набора сообщений для сравнения содержимого.

+0

Damb ваш сайт нуждается в серьезной работы CSS. –

+0

Css стоит каждого цента, за который моя жена платила за него :) Да, это куда-то куда-то делать. –

+0

Удачи и отличная идея –

ответ

0

Я понял, что это проблема сертификата, в сочетании с ошибкой сценария.

Файл с моим сертификатом устарел до того, который находится в настоящее время в коде Уэйда. Я заметил это и обновил файл сертификата вчера. Теперь я подтвердил, что это стало основной причиной моего первоначального сбоя.

Однако, обновляя это, я также обновился до последнего класса - на самом деле это просто удалил какой-то устаревший код, который я не использовал, и больше не поддерживается, но я пропустил одно небольшое изменение, которое сломало вещи.

Там есть строчка в классе IpnListener, который задает расположение сертификата:

curl_setopt($ch, CURLOPT_CAINFO, dirname(dirname(__FILE__)) . '/cert/api_cert_chain.crt'); 

Но имя каталога заканчивается неправильно на моем сервере, и он не может найти сертификат. Предыдущая версия класса:

curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__) . '/cert/api_cert_chain.crt'); 

который работал. Теперь, когда я изменил его, все работает снова. Обратите внимание, что домен, над которым я работаю, настроен в подкаталоге моего основного домена, поэтому возможно, что новый код указывает на неправильное место (на одном уровне выше, где мне это нужно).

И я все еще смущен, почему работал симулятор IPN, в то время как в Sandbox и Live системах этого не было.

Смежные вопросы