Проблемы с интеграцией PayPal: PDT зависает при возвращении на сайт

Я внедряю PayPal IPN и PDT. После некоторой головной боли и времени в песочнице IPN работает хорошо, и PDT возвращает правильные данные $_GET. Реализация выглядит следующим образом:

  • Передать идентификатор пользователя в форме в PayPal
  • Пользователь покупает продукт и запускает IPN, который обновляет базу данных для данного идентификатора пользователя.
  • PDT возвращает идентификатор транзакции, когда пользователь возвращается на сайт
  • На странице возврата написано «пожалуйста, подождите» и повторите Ajax-проверку статуса транзакции.
  • Пользователь перенаправляется на страницу успеха/неудачи

Все работает хорошо, ЗА ИСКЛЮЧЕНИЕМ того, что при использовании готового PHP-кода PayPal для PDT для выполнения возврата POST страница зависает. Пользователь никогда не возвращается на мой сайт. Я не получаю статус сбоя, просто ничего. Самое смешное, что как только возникает неизвестная ошибка, мой тестовый домен на короткое время перестает отвечать на запросы.

Код (PHP): https://www.paypal.com/us/cgi-bin/webscr?cmd=p/xcl/rec/pdt-code-outside

Если я прокомментирую POST обратно, все будет работать нормально. Я могу определить проблему до того, как код войдет в цикл while{}. К сожалению, у меня недостаточно опыта, чтобы написать замену кода PayPal с нуля, поэтому буду очень признателен за любые идеи о том, что может быть не так.

POST возвращается на ssl://www.sandbox.paypal.com, и я использую код кнопки и токен авторизации, которые были созданы с помощью тестовой учетной записи песочницы.

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

ОБНОВЛЕНИЕ:

Я сузил проблему до этой строки: $line = fgets($fp, 1024);

Он просто зависает, и я не уверен, почему.


person Tom    schedule 17.05.2010    source источник


Ответы (1)


РЕШЕНО:

Переход на cURL решает все проблемы. Вот код на случай, если кто-то придет к этому и будет в таком же отчаянии, как и я:

// Prepare data
$req = 'cmd=_notify-synch';
$tx_token = $_GET['tx'];
$auth_token = '<-- your token (sandbox or live) -->';
$req .= '&tx='.$tx_token.'&at='.$auth_token;
// Post back to PayPal to validate
$c = curl_init('https://www.sandbox.paypal.com/cgi-bin/webscr'); // SANDBOX
curl_setopt($c, CURLOPT_POST, true);
curl_setopt($c, CURLOPT_POSTFIELDS, $req);
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
$contents = curl_exec($c);
$response_code = curl_getinfo($c, CURLINFO_HTTP_CODE);
curl_close($c);
if(!$contents || $response_code != 200) {
   // HTTP error or bad response, do something
} else {
   // Check PayPal verification (FAIL or SUCCESS)
   $status = substr($contents, 0, 4);
   if($status == 'FAIL') {
      // Do fail stuff
   } elseif($status == 'SUCC') {
      // Do success stuff
   }
}

Технически substr() проверяет не "SUCCESS", а "SUCC". Однако, учитывая, что возможными значениями являются только "УСПЕХ" или "НЕУДАЧА", это не имеет значения.

Этот же код работает и для IPN с очевидными небольшими изменениями.

person Tom    schedule 17.05.2010