当会话 ID 已知但无法启动会话时删除会话变量
Posted
技术标签:
【中文标题】当会话 ID 已知但无法启动会话时删除会话变量【英文标题】:delete session variables when session id is known but not able to start session 【发布时间】:2011-08-28 14:23:50 【问题描述】:我在处理 paypal 和 ipn 时尝试删除一些会话变量的方式有问题。具体来说,我想让某人在我的在线零售店登录(或不登录),浏览我的购物车,被重定向到支付宝付款,然后被重定向到我的网站。
我一直在使用 paypal ipn 让 paypal 在付款完成时通知我,我可以将用户引导回我的站点,在那里可以再次开始会话,但我希望能够取消设置购物车(但是不是整个会话,以防他们登录)付款完成后。这将覆盖我的基础,以防用户没有返回我网站上的付款完成页面,而是在不同页面上返回该网站。
问题是,虽然我在去贝宝之前在我网站上的最后一个运输信息页面上获得了相同的会话 ID,并且在付款完成后从贝宝回到我的网站上的登陆页面我无法访问此会话在我的网站上运行以响应贝宝的 ipn 脚本中。我在这三个页面中的每一个上都运行 session_start(),但是当我在运输方式页面和付款完成登录页面上发送电子邮件或发布时,我得到了相同的会话 ID。当我通过电子邮件向自己发送 ipn 脚本中会话 id 的结果时,我什么也得不到。
我可以在去贝宝之前杀掉购物车,但如果他们想回去改变东西怎么办?我可以杀死着陆页上的购物车,但如果他们以某种方式进入不同的页面怎么办?当我收到付款确认时,我真的很想销毁购物车,但不是整个会话,但我不确定如何。我在我的 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 调用)获得它自己的会话。
成功付款后,您必须在返回您的网站时清除会话变量。这不是万无一失的 - 有可能仍然无法清除购物车,但这几乎是唯一的方法。
【讨论】:
这就是我的想法,可能是这种情况,你说它的方式现在在我脑海中更有意义。这将是与贝宝而不是用户的会话的想法是真正让它在我脑海中点击的原因。所以即使我可以从这个会话访问另一个会话的会话 ID,也没有办法从这个会话中终止另一个会话,对吗?我会假设会话涉及存储在原始会话机器的用户上的 cookie。太糟糕了,但我想这应该可行。我只是想要一些更简单的东西。谢谢! 如果您曾经转换为 Paypal Pro(或您在自己的网站上收集信用卡信息的任何其他处理器),您将能够做更多您想做的事情。使用该系统,您可以使用用户的信用卡信息拨打 Paypal,无论是否授权,他们都会立即给您回复。以上是关于当会话 ID 已知但无法启动会话时删除会话变量的主要内容,如果未能解决你的问题,请参考以下文章