在paypal ipn响应期间无法取消会话

时间:2012-01-27 13:53:52

标签: php session paypal-ipn unset

当PayPal返回IPN时,我需要取消设置会话变量。

最简单的脚本如下

<?php
session_start();
unset($_SESSION['my_item']);
?>

Paypal发送IPN,一切正常,但在请求后我的会话变量保存了它的值。

可能有什么问题?

由于

更新

如上所述,当ipn发送请求时,它已经是另一个会话,所以我可以执行以下操作。

在将用户发送到paypal之前,请将自定义变量设置为当前

  

SESSION_ID();

当paypal发送ipn时,我可以将当​​前会话更改为previus会话,并清除它。

session_id($_POST[custom]); 
session_start(); 
session_destroy(); //works fine

4 个答案:

答案 0 :(得分:3)

此处的问题是IPN通知与正确的会话无关。

IPN实际上是一个新会话 - 它不会提供与客户端相同的会话cookie,因为您尚未设置它们。会话对于客户来说是唯一的,而paypal网关是与您的用户不同的客户端。

您需要通过数据库退回此信息。没有明智,简单的方法让IPN接收器直接修改用户的会话数据。

答案 1 :(得分:1)

您应该检查特定的帖子变量。即使只是一个空数组,也总会设置$ _POST。

<?php
session_start();
if(isset($_POST['name'])) {
    unset($_SESSION['my_item']);
}
?>

答案 2 :(得分:1)

我已经写了这个更新,但是如果我把解决方案作为答案写的话,那就更好了。

如果我将session_id发送给paypal,当它返回时,我可以将当​​前会话设置为它的vallue,并将其删除。

session_id($_POST[custom]); //$_POST[custom] is user's session id
session_start(); 
session_destroy();

答案 3 :(得分:0)

您的条件是:

if(isset($_POST['ipn'])){
  ...do something
}

然后这应该有效:

if(isset($_POST['ipn'])){
  unset($_SESSION['my_item']);
}