会话ID已知但无法启动会话时删除会话变量

时间:2011-05-19 05:44:18

标签: php session paypal cart paypal-ipn

我遇到的问题是我在处理paypal和ipn时试图删除一些会话变量的方式,我希望有人在我的在线零售店登录(或不登录),浏览我的购物车,重定向到paypal付款,然后重定向到我的网站。

我一直在使用paypal ipn让PayPal在付款完成后通知我,我可以将用户带回我的网站,会话可以再次启动,但我希望能够取消购物车(但是付款完成后,一旦他们登录,则不是整个会话。如果用户没有回到我网站上的付款已完成页面但返回到不同页面上的网站,这将覆盖我的基础。

问题是虽然我在访问PayPal之前在我网站上的最后一个发货信息页面上获得相同的会话ID,并且当付款完成后我的网站上的登陆页面从PayPal返回我无法访问此会话在我的网站上运行的ipn脚本以响应paypal。我在这三个页面中的每个页面上运行session_start()但是当我通过电子邮件发送或发布在发货方法页面和付款完成登录页面时,我得到相同的会话ID。当我在我的ipn脚本中给自己发送会话ID的结果时,我什么都没得到。

我可以在去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 个答案:

答案 0 :(得分:1)

Paypal IPN呼叫由Paypal进行,仅限服务器到服务器。您也不知道该IPN呼叫何时到来。通常它们会在几秒钟内发生,但它们可以在很晚之后发生。如果IPN呼叫失败,他们将再次重试一段时间。您无法执行与IPN中的用户会话相关的任何操作。每个用户都拥有自己的会话,您无法编辑其他任何人。在这种情况下,您的用户有一个会话,Paypal(IPN呼叫)获得它自己的会话。

成功付款后,您必须在返回网站时清除会话变量。这不是万无一失的 - 有可能仍然无法清除推车,但这几乎是唯一的方法。