Я установил код для ответа на вызовы 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);
}