удалять переменные сеанса, когда известен идентификатор сеанса, но не удается запустить сеанс

#php #session #paypal #cart #paypal-ipn

#php #сеанс #paypal #Корзина #paypal-ipn

Вопрос:

у меня возникла проблема с тем, как я пытаюсь удалить некоторые переменные сеанса при работе с PayPal и ipn. в частности, я хочу, чтобы кто-то зарегистрировался (или нет) в моем интернет-магазине розничной торговли, прошел через мою корзину, был перенаправлен на PayPal для оплаты, а затем был перенаправлен на мой сайт.

я использую paypal ipn, чтобы заставить paypal уведомлять меня о завершении платежа, и я могу направить пользователя обратно на мой сайт, где сеанс может быть запущен снова, но я хочу иметь возможность отключить корзину (но не весь сеанс, если они вошли в систему), как только платеж будет завершен. это должно было бы покрыть мои основания на случай, если пользователь не вернется на страницу завершения платежа на моем сайте, а вернется на сайт на другой странице.

проблема в том, что, хотя я получаю один и тот же идентификатор сеанса как на последней странице информации о доставке на моем сайте перед переходом в paypal, так и на целевой странице на моем сайте от paypal, когда платеж завершен, я не могу получить доступ к этому сеансу в моем скрипте ipn, который запускается на моем сайте в ответ на paypal. я запускаю session_start () на каждой из этих трех страниц, но когда я отправляю электронное письмо или публикую на странице способа доставки и целевой странице завершения оплаты, я получаю тот же идентификатор сеанса. когда я отправляю себе по электронной почте результат идентификатора сеанса в моем скрипте ipn, я ничего не получаю.

я мог бы отключить корзину перед переходом в PayPal, но что, если они захотят вернуться и что-то изменить? я мог бы отключить корзину на целевой странице, но что, если они каким-то образом попадут на другую страницу? я бы действительно хотел уничтожить корзину, но не весь сеанс сразу после получения подтверждения платежа, но я не уверен, как это сделать. я пробовал это на своей странице ipn:

 session_start();

$a = session_id();

mail("webmaster@mysite.com", "ipn session id 0", $a, "From: webmaster@mysite.com");

//results in blank email, unlike in other locations on actual displayed pages

// Unset all of the session variables.

$_SESSION = array();

// Delete the session cookie to kill the session

if (isset($_COOKIE[session_name()])) {

setcookie(session_name(), '', time()-42000, '/');

}

// Finally, destroy the session.

session_destroy();

unset($_SESSION['cart']);

unset($_SESSION['product_id_array']);

unset($_SESSION['pp_checkout_btn']);

unset($_SESSION['state']);

unset($_SESSION['total']);

unset($_SESSION['shipping']);

unset($_SESSION['grand_total']);
  

но когда я возвращаюсь на страницу просмотра корзины, она все еще там. любые идеи будут высоко оценены. любой более конкретный код, который мог бы помочь, дайте мне знать, и я опубликую его.

Ответ №1:

Вызов Paypal IPN выполняется Paypal и выполняется только между серверами. Вы также не знаете, когда придет этот IPN-вызов. Обычно это происходит в течение нескольких секунд, но может произойти намного позже. Если вызов IPN завершается неудачей, они будут повторять попытку снова в течение некоторого времени. Вы не можете сделать ничего, связанного с сеансом пользователя в IPN. У каждого пользователя свой сеанс, и вы не можете редактировать чужой. В этой ситуации у вашего пользователя есть сеанс, и Paypal (вызов IPN) получает свой собственный сеанс.

Вам придется очистить переменные сеанса при возвращении на ваш сайт после успешной оплаты. Это не надежно — есть вероятность, что корзина все еще не будет очищена, но это практически единственный способ сделать это.

Комментарии:

1. это то, о чем я думал, может быть так, и то, как вы заявляете, что это имеет гораздо больше смысла в моей голове сейчас. идея о том, что это будет сеанс с paypal, а не с пользователем, — это то, что действительно заставило меня щелкнуть в моей голове. таким образом, нет способа завершить другой сеанс из этого сеанса, даже если я могу получить доступ к идентификатору сеанса другого сеанса из этого сеанса, верно? я бы предположил, что это так, поскольку в сеансе используется файл cookie, хранящийся на компьютере пользователя исходного сеанса. жаль, но я думаю, это должно сработать. я просто хотел что-то более надежное. Спасибо!

2. Если вы когда-нибудь перейдете на Paypal Pro (или любой другой процессор, где вы собираете информацию о кредитной карте на своем собственном сайте), вы сможете делать больше из того, что вы хотите делать. В этой системе вы звоните в Paypal с информацией о кредитной карте пользователя, и они немедленно дают вам ответ, авторизован он или нет.