Paypal IPN симулятор ведет себя странно - PullRequest
0 голосов
/ 03 июля 2019

Я установил код для ответа на вызовы PayPal IPN, и он работал, но по какой-то причине недавно сломался.(в течение последнего месяца).Я вернулся, чтобы протестировать его с помощью симулятора PayPal IPN, и теперь наблюдаю очень странное поведение.Если я указываю симулятор на респондента на моем веб-сайте и выбираю web_accept без каких-либо изменений в других полях, а затем нажимаю кнопку Отправить IPN, он возвращается с сообщением «IPN был отправлен, и квитирование было подтверждено».

Однако, если я заполняю все поля, как если бы это была реальная покупка, а затем нажимаю кнопку Отправить IPN, я получаю сообщение: «IPN не был отправлен, и рукопожатие не было проверено. Проверьте вашу информацию».Если я просматриваю базу данных и ошибки, которые регистрируются, мой сервер выполняет код, который я установил, чтобы ввести человека в группу, как если бы он заплатил, и транзакция была записана, как я хочу, чтобы она была,Этот код срабатывает только в том случае, если получена транзакция от PayPal и PayPal отправляет обратно проверенный код.Что дает?

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

Вот мой код для проверки ...

public function processIpn($post_data = null) {

        $encoded_data = 'cmd=_notify-validate';

        if ($post_data === null) {
            // use raw POST data
            if (!empty($_POST)) {
                $raw_post_data = file_get_contents('php://input');
                $ray_post_array = explode('&', $raw_post_data);
                $myPost = [];
                foreach($ray_post_array as $keyval){
                    $keyval = explode('=', $keyval);
                    if(count($keyval) == 2){
                        $myPost[$keyval[0]] = urldecode($keyval[1]);
                    }
                }
                foreach($myPost as $key => $value){
                    $encoded_data .= "&$key=" . urlencode($value);
                }
                $this->entryData = $encoded_data;
            } else {
                throw new Exception("No POST data found.");
            }
        } else {
            // use provided data array
            $this->post_data = $post_data;

            foreach ($this->post_data as $key => $value) {
                $encoded_data .= "&$key=" . urlencode($value);
            }
        }
        if ($this->debug) {
            $this->response = "VERIFIED";
            $this->response_status = '200 OK';
        } else {
            $this->curlPost($encoded_data);
        }
        if (strpos($this->response_status, '200') === false) {
            throw new Exception("Invalid response status: " . $this->response_status . $encoded_data);
        }

        if (strpos($this->response, "VERIFIED") !== false) {
            return true;
        } elseif (strpos($this->response, "INVALID") !== false) {
            return false;
        } else {
            throw new Exception("Unexpected response from PayPal. " . $encoded_data);
        }
    }
protected function curlPost($encoded_data) {

        $uri = $this->getPaypalHost();

        $ch = curl_init($uri);
        curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $encoded_data);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
        curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Connection: Close'));
        curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__) . "/cacert.pem");

        $this->response = curl_exec($ch);
        $this->response_status = strval(curl_getinfo($ch, CURLINFO_HTTP_CODE));

        if ($this->response === false || $this->response_status == '0') {
            $errno = curl_errno($ch);
            $errstr = curl_error($ch);
            curl_close($ch);
            throw new Exception("cURL error: [$errno] $errstr");
        }
        curl_close($ch);
    }
...