我在处理paypal和ipn时尝试删除一些会话变量的方式有问题.我希望有人登录(或不登录)我的在线零售店,浏览我的购物车,重定向支付宝贝,然后重定向到我的网站.
我一直在使用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']);
但当我回到视图购物车页面时,它仍然存在.任何想法将不胜感激.任何更有帮助的特定代码,让我知道,我会发布它.
解决方法:
Paypal IPN呼叫由Paypal进行,仅服务器到服务器.您也不知道该IPN呼叫何时到来.通常它们会在几秒钟内发生,但它们可以在很晚之后发生.如果IPN呼叫失败,他们将再次重试一段时间.您无法执行与IPN中的用户会话相关的任何操作.每个用户都拥有自己的会话,您无法编辑其他任何人.在这种情况下,您的用户有一个会话,Paypal(IPN呼叫)获得它自己的会话.
成功付款后,您必须在返回网站时清除会话变量.这不是万无一失的 – 有可能仍然无法清除推车,但这几乎是唯一的方法.