Вопрос

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

Я преуспел с первым битом. Мой код может получить информацию от PayPal, добавить в дополнения и опубликовать ее обратно. Тем не менее, я не получаю ответа от песочницы, говоря «проверенный» или «недействительный». Я в значительной степени скопировал свой код с веб -сайта PayPal, поэтому я надеялся, что это будет довольно простым, поэтому, если вы сможете занять минуту, чтобы посмотреть мой код, возможно, некоторые новые глаза могут выбрать, где я пошел не так Анкет

Вот код. Ничего особенного, он буквально просто получает информацию, настраивает ее, передает ее обратно и читает ответ (который он либо не получает, либо не понимает, что он получает)

<?php

$debug=true;

//Put together postback info

$postback = 'cmd=_notify-validate';

foreach($_POST as $key =>$value){
     $postback .= "&$key=$value";
}

// build the header string to post back to PayPal system to validate
$header = "POST /cgi-bin/webscr HTTP/1.1\r\n";
$header .= "Host: www.sandbox.paypal.com\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($postback) . "\r\n\r\n";

$fp = fsockopen ('www.sandbox.paypal.com', 80, $errno, $errstr, 30);//open the connection

if(!$fp){ //no conn
    die();
}

//post data back
fputs($fp, $header . $postback);

while(!feof($fp)){

    $res=fgets ($fp, 1024);

    if((strcmp($res, "VERIFIED")) == 0){ //verified!
        if($debug){         
            $filename = 'debug/debug5_verified.txt'; //create a file telling me we're verified
            $filehandle=fopen($filename, 'w');
            fwrite($filehandle,'VERIFIED!');
            fclose($filehandle);
        }
    }
}

?>

Заранее спасибо!

Это было полезно?

Решение 2

Так что я думаю, что нашел решение. Оказывается, у него не было проблем с подключением к SSL: // Sandbox ...., на самом деле это было извлечено ответ. Код был зациклен на

while(!feof($fp)){
    $res=fgets($fp,1024);
}

кусочек. Все, что я сделал, это заменил его:

$res=stream_get_contents($fp, 1024);

И это сработало в первый раз! Теперь я могу продолжить свою жизнь. Еще раз спасибо за помощь в этом.

Другие советы

Переключитесь на использование URL -адреса HTTPS, я не уверен, когда в последнее время все мои тестовые скрипты начали сбой в простой HTTP -версии. Они выглядят мигрирующими.

Я использую тот же код образца PayPal, в котором вы:

    $fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30);    

или же

    $fp = fsockopen ('ssl://www.paypal.com', 443, $errno, $errstr, 30);

Возможно, исходный код отсутствовал:$header .= "Connection: close\r\n\r\n";

Обратите внимание, что PayPal образец кода использует http/1.0, поэтому нет этой линии. И http/1.1 в порядке, но может понадобиться линия.

С другой стороны, Sandbox больше не может поддерживать порт 80. Я получаю 302 перенаправления на https://www.sandbox.paypal.com.

Я заметил, что URL, который вы публикуете, немного отличается от ниже, возможно, это так?

Это со страницы справки по тестированию IPN:

Убедитесь, что вы публикуете свой ответ на правильный URL, который https://www.sandbox.paypal.com/cgi-bin/webscr или же https://www.paypal.com/cgi-bin/webscr, в зависимости от того, тестируете ли вы в песочнице или живете, соответственно.

Убедитесь, что ваш ответ содержит точно одинаковые переменные IPN и значения в одном и том же порядке, в котором предшествует cmd = _notify-Validate.

Убедитесь, что вы кодируете свою строку ответа и используете тот же кодирование символов, что и исходное сообщение.

РЕДАКТИРОВАТЬ: Извините, я также хотел упомянуть, что порт для HTTP и HTTPs отличается, 80, в отличие от 443. Я не слишком знаком с API PayPal, но могу изучить его, поскольку я вижу, что вы используете 80.

Тестовый сервер PayPal перенесен на:

$fp = fsockopen('ssl://ipnpb.paypal.com', 443, $errno, $errstr, 30);

Проверьте PHP версию TLS Socket. Это должен быть TLS 1.2, чтобы получить ответ из учетной записи песочницы. Обновите версию PHP до 5.5, чтобы получить TLS 1.2 сокет.

PayPal отключил службу SSLV3 и изменился на TLS 1.2.

Если вам нужно получить ответ, версия PHP должна потребовать TLS 1.2, чтобы получить TLS 1.2 PHP может быть обновлен до 5,5 или более.

посетить ссылка на сайт.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top