Проблемы интеграции с PayPal: PDT зависает при возврате на сайт - PullRequest
1 голос
/ 17 мая 2010

Я внедряю 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, и я использую код кнопки и токен авторизации, которые были созданы с помощью тестовой учетной записи песочницы.

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

UPDATE:

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

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

1 Ответ

1 голос
/ 17 мая 2010

ПОСТАНОВИЛИ:

Переход на 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». Однако, учитывая, что только «SUCCESS» или «FAIL» являются возможными значениями, это не имеет значения.

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

...