【问题标题】:Can't unset session during paypal ipn response在贝宝 ipn 响应期间无法取消设置会话
【发布时间】:2012-02-20 11:57:37
【问题描述】:

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

最简单的脚本如下

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

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

可能是什么问题?

谢谢

更新

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

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

session_id();

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

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

【问题讨论】:

  • 您需要提供更多代码。您发布的任何内容都不会导致该问题。
  • 我认为没有脚本会导致这样的问题。因为当我直接打开该文件(即没有发布,并从 if 语句中移出未设置)时,它工作正常。
  • 测试isset($_POST) 毫无意义,因为它总是正确的。
  • @Gumbo:除非你明确地unset()它。 :-P

标签: php session paypal-ipn unset


【解决方案1】:

我已经写了更新,但如果我写解决方案作为答案,它会很糟糕。

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

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

【讨论】:

    【解决方案2】:

    您应该检查特定的 post 变量。 $_POST 将始终被设置,即使只是一个空数组。

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

    【讨论】:

      【解决方案3】:

      这里的问题是 IPN 通知与正确的会话没有关联。

      IPN 实际上是一个新会话 - 它不会显示与您的客户端相同的会话 cookie,因为您没有设置它们。会话对客户端来说是唯一的,而贝宝网关与您的用户的客户端不同。

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

      【讨论】:

      • 当然,你是真的。您的想法是,如果我将会话 ID 发送到贝宝,当它返回时,我将清除与我的会话 ID 关联的会话...
      • 我不认为有任何方法可以做到这一点。当您向 Paypal 发送内容时,您是发出请求的客户端,并且客户端无法在服务器上设置 cookie - 这不是 cookie 的工作方式,即使是 Paypal 出于安全目的可能会忽略它。然后在 IPN 期间,Paypal 是客户端,而您是服务器,因此它将向您发送它拥有的任何 cookie - 但您无法设置它们,因为它实际上是每次请求链的开始。您将不得不使用数据库并使用事务/客户端/等 ID 将其与客户端会话绑定。
      • @Syom 如果这对您有用,那么您可以使用它,我不会阻止您,但请注意警告:当脚本运行时,它对会话具有独占锁定数据(或更准确地说,会话 file)。这意味着在脚本打开会话时收到的任何请求都将阻塞,直到前一个脚本完成会话数据。您可以使用 session_write_close() 解决此问题 - 但要明智地使用它。
      【解决方案4】:

      你的条件应该是:

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

      那么这应该可以工作:

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

      【讨论】:

      • 这并不重要。我也尝试在没有if 声明的情况下做同样的事情。
      • 嗯,你的脚本看起来不错 - 当你转储 $_POST 时你看到了什么?该字段及其内容是什么样的?
      猜你喜欢
      • 2015-11-15
      • 2013-01-27
      • 2011-03-12
      • 2017-03-15
      • 2015-06-29
      • 1970-01-01
      • 2016-10-01
      • 2014-08-15
      相关资源
      最近更新 更多