我在处理 paypal 和 ipn 时尝试删除一些 session 变量的方式有问题。具体来说,我想让某人登录(或不登录)我的在线零售店,通过我的购物车, 被重定向到 paypal 进行付款,然后被重定向到我的网站。
我一直在使用 paypal ipn 让 paypal 在付款完成时通知我,我可以将用户引导回我的网站,在那里可以再次开始 session ,但我希望能够取消设置购物车(但是如果他们已登录,则不是整个 session )一旦付款完成。这将涵盖我的基础,以防用户没有返回到我网站上的付款完成页面,而是在另一个页面上返回网站。
问题是,虽然我在使用 paypal 之前在我网站上的最后一个运输信息页面以及付款完成后从 paypal 返回我网站的登录页面都获得了相同的 session ID,但我无法访问此 session 在我的网站上运行以响应 Paypal 的 ipn 脚本中。我在这三个页面中的每一个上都运行 session_start() 但是当我在运输方式页面和付款完成登陆页面上发送电子邮件或发帖时,我得到相同的 session ID。当我通过电子邮件向自己发送 ipn 脚本中 session ID 的结果时,我什么也得不到。
我可以在去 paypal 之前取消购物车,但如果他们想回去改变东西怎么办?我可以在着陆页上取消购物车,但如果他们以某种方式到达不同的页面怎么办?当我收到付款确认时,我真的很想销毁购物车而不是整个 session ,但我不确定如何销毁。我已经在我的 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']);
但是当我返回查看购物车页面时,它仍然存在。任何想法将不胜感激。任何有帮助的更具体的代码,请告诉我,我会发布。
最佳答案
Paypal IPN 调用由 Paypal 发起,并且仅限于服务器到服务器。您也不知道 IPN 调用何时到来。通常它们会在几秒钟内发生,但也可能会晚得多。如果 IPN 调用失败,他们将重试一段时间。您不能在 IPN 中执行与用户 session 相关的任何操作。每个用户都有自己的 session ,您不能编辑其他任何人的 session 。在这种情况下,您的用户有一个 session ,而 Paypal(IPN 调用)有自己的 session 。
付款成功后,您必须在返回您的网站时清除 session 变量。这并非万无一失 - 购物车仍有可能无法清空,但这几乎是唯一的方法。
关于php - 当 session ID 已知但无法启动 session 时删除 session 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6054318/