0

Zend Framework 1 アプリケーションの問題に取り組むのに苦労しています。これは、チェックアウト ページからクライアントが支払いゲートウェイ プロバイダーにリダイレクトされるカスタム Web ショップ アプリケーションです。したがって、次のようになります。

  1. クライアントがチェックアウト ページで支払い方法を選択すると、バックグラウンドでトランザクション ハンドシェイクがアプリケーションと支払いプロバイダーの間で行われます。

  2. 次に、支払いプロバイダーから、クライアントがリダイレクトされる支払い URL が返されます。

  3. クライアントが支払いを行うと、支払いプロバイダーはクライアントをウェブショップにリダイレクトして成功 URL に戻します。

ほとんどの場合、これで問題なく動作しますが、成功ページにリダイレクトされた後、クライアントが新しいセッション ID を取得する場合があります。その時点でセッション データが注文を完了するために使用されているため、これは問題です。

ローカルでは、おそらく 50 回の試行のうち、この問題を再現できたのは 1 回だけです。したがって、「シナリオが機能することもあれば、機能しないこともある」というシナリオの1つ、つまり*デバッグと修正が面倒です。

application.ini のセッション設定と Bootstrap の _initSession をいじってみましたが、実際には、これらの変更の後、問題を再現することができました (その 1 回)。

元の application.ini と Bootstrap.php (関連する部分のみ) は次のようになります。

アプリケーション.ini:

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

Bootstrap.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(...); を呼び出す必要がありますか? Bootstrap の 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

私はまさにこの問題と闘い、2 つの異なるドメインを扱っていることがわかりました。一部のユーザーはmydomain.comで開始し、支払いプロバイダーを終了した後、www.mydomain.comにリダイレクトされました。これにより、まったく新しいセッションが発生します。

これがあなたの問題である可能性はありますか?

もしそうなら、ブートストラップ プロセスの早い段階で、おそらく index.php ファイルの一番上に、次のようなものを貼り付けます。

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

これにより、ユーザーが使用したいドメインをユーザーが使用していることを事前に確認できます。リダイレクトは、GET 変数を含む完全な URL を保持します。

于 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 では、2 つの異なる URL を参照するたびに、同じセッション ID が使用されるたびに 2 つのセッションが取得されます。これを修正するには、application.ini にセッションの名前を追加するだけです。

resources.session.name = NEWSESSID

そのため、ブラウザは、デフォルトの PHPSESSID ではなく、新しい名前で新しい Cookie を作成することを余儀なくされます。

すべてが再び機能しているようです。助けてくれてありがとう、どうもありがとう!

于 2013-03-29T03:26:14.513 に答える