为什么我的PHP会话会死?为什么我不能恢复它们?

时间:2008-10-08 17:37:52

标签: php session paypal

我有一个使用PHP和PayPal API的应用程序。它用于获得付款的基本方式是您对PayPal进行Web服务调用以获取令牌,然后使用该令牌将浏览器重定向到PayPal以供用户付费。确认付款细节后,PayPal会重定向回您最初在服务电话中设置的网址。

这一切都有效,数以百万计的人每天都在使用它等等。

奇怪的是,当PayPal重定向回来时,PHP会话就消失了。这是一个well-documented issue

第一个问题:为什么会发生这种情况?两个页面都在同一个域中,都使用HTTPS。该会话适用于PayPal重定向之前的所有请求。

链接的论坛主题建议一种解决方法,将会话ID保留在PayPal请求中,然后稍后检索并恢复会话。很好,除了它似乎没有用。

我可以添加一些日志语句:

log(session_id());

各种重定向之前和之后。从PayPal回来时,我会再记录一些。

log("session id is " . session_id());
$session_id = get_session_id_from_paypal();
log("setting it back to " . $session_id);
session_id($session_id);
session_start();
log("session id is now " . session_id());

结果根本不是我所期望的:

  

session_id是fc8f459a186a3f4695ff9ac71b563825
  将其设置回82460dcf8c8ddd538466e7cb89712e72
  session_id现在是360ba3fd99d233e0735397278d2b2e55

第二个问题:为什么会话ID根本不是我设置的?我究竟做错了什么?或者,至少,为什么没有会话变量返回?

2 个答案:

答案 0 :(得分:3)

只是一个想法......

您是否有session.referer_check设置给您的主人? 默认值是空字符串,但它可能已被更改...当页面'从PayPal'返回'时,php将丢弃会话信息。

您可以使用phpinfo()检查session.referer_check

答案 1 :(得分:1)

你能做一个phpinfo()并判断session.auto_start是否为真?