0

我很难解决 Zend Framework 1 应用程序的问题。这是一个自定义的网上商店应用程序,客户端从结帐页面被重定向到支付网关提供商。所以它看起来像这样:

  1. 当客户在后台在我们的结帐页面上选择一种付款方式时,我的应用程序和支付提供商之间正在进行交易握手。

  2. 然后,支付提供商将客户重定向到的支付 URL 发回给我。

  3. 客户付款,付款提供商将客户重定向回我们的网上商店,并获得成功的 url。

在大多数情况下,这工作得很好,但在某些情况下,客户端在被重定向到我们的成功页面后会获得一个新的会话 ID。这是一个问题,因为此时正在使用会话数据来完成订单。

在本地,我只能在大约 50 次尝试中重现这个问题。因此,它是“有时有效,有时无效”的情况之一,或者换句话说,是调试和修复的痛苦之一

我尝试使用我的 application.ini 中的会话设置以及我的 Bootstrap 中的 _initSession,但实际上在进行了这些更改之后,我设法重现了该问题(那一次)。

原始的 application.ini 和 Bootstrap.php(仅相关部分)如下所示:

应用程序.ini:

  resources.session.save_path = APPLICATION_PATH "/../data/sessions"
  resources.session.gc_maxlifetime = 2592000
  resources.session.remember_me_seconds = 2592000

引导程序.php:

  protected function _initSession()
  {
     // set up the session as per the config.
     $options = $this->getOptions();

     $sessionOptions = $options['resources']['session'];

     Zend_Session::setOptions($sessionOptions);
     Zend_Session::start();
  }

请注意,在所有其他情况/用例中,会话在整个站点中都可以正常工作。只有在重定向之后,某些客户端才会出错。我让应用程序记录了额外的信息,并且在这些情况下我实际上可以看到会话 ID 的变化。

这可能与较长的会话生命周期(1 个月)有关吗?还是我必须调用 Zend_Session::rememberMe(...); 在引导程序中的 Zend_Session::start() 之后?或任何其他想法、提示和建议?

编辑:我尝试过的其他会话选项如下:

resources.session.name = myuniquesessionname
resources.session.use_cookies = on
resources.session.use_only_cookies = on
resources.session.save_path = APPLICATION_PATH "/../data/sessions" 
resources.session.gc_maxlifetime = 2592000
resources.session.remember_me_seconds = 2592000
resources.session.strict = on
4

2 回答 2

1

我与这个问题进行了斗争,发现我正在处理两个不同的域。我的一些用户从mydomain.com开始,然后在与支付提供商合作完成后,他们被重定向回www.mydomain.com。这将导致一个全新的会话。

可能这是你的问题?

如果是这样,我会在引导过程的早期坚持这样的事情,可能就在你的 index.php 文件的顶部:

if($_SERVER['SERVER_NAME'] != 'www.mydomain.com') {
   Header("Location: http://www.mydomain.com" . $_SERVER['REQUEST_URI']);
   exit;
}

这可以确保用户正在使用您希望他们使用的域。重定向将保留完整的 url,以及任何 GET 变量。

于 2013-03-29T02:13:27.677 回答
0

对我有用的是:问题确实是会话 cookie 的域。在我的 application.ini 中,我添加了:

resources.session.cookie_domain = .mydomainname.com 其中显然 mydomainname.com 是网店的域名。

现在,在我的开发人员 Firefox 中清除我的 cookie 之后,一切正常。我不使用 www 登录该站点。前缀和之后,如果我使用包括 www 的 URL 访问该站点。前缀我仍在使用相同的会话。

我清除了服务器端的所有会话。但是,在我没有清除 cookie 的其他非开发人员浏览器中,由于现有的 cookie 与特定域名相关联,我仍然遇到会话 id 被重复使用的问题。因此,例如,在我的 Safari 中,每当我浏览到两个不同的 URL 并且每次使用相同的会话 ID 时,我都会得到两个会话。为了解决这个问题,我只是在 application.ini 中添加了会话的名称:

resources.session.name = NEWSESSID

因此,浏览器被迫使用新名称而不是默认的 PHPSESSID 创建一个新的 cookie。

看起来现在一切都恢复正常了。非常感谢您的帮助,非常感谢!

于 2013-03-29T03:26:14.513 回答