Почему мои сессии PHP умирают? И почему я не могу их восстановить?
Вопрос
У меня есть приложение, использующее PHP и API PayPal. Основной способ получения платежа заключается в том, что вы обращаетесь к PayPal через веб-службу для получения токена, а затем выполняете перенаправление браузера на PayPal с этим токеном, чтобы пользователь мог произвести оплату. После подтверждения платежных данных PayPal перенаправляет на URL-адрес, который вы изначально указали в служебном вызове.
Все это работает, миллионы людей используют его каждый день, и так далее.
Странно то, что когда PayPal перенаправляет назад, сеанс PHP исчезает. Это хорошо документированная проблема . р>
Первый вопрос: почему это происходит? Обе страницы находятся в одном домене, обе используют HTTPS. Сеанс работает для всех запросов вплоть до перенаправления PayPal назад.
Связанная ветка форума предлагает обходной путь - сохранить идентификатор сеанса в запросе 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
Второй вопрос: почему идентификатор сессии совсем не такой, как я его установил? Что я делаю неправильно? Или, по крайней мере, почему ни одна из переменных сеанса не возвращается?
Решение
Просто идея ...
Возможно, у вас есть session.referer_check
для вашего хоста?
По умолчанию используется пустая строка, но она могла быть изменена ... и когда страница «возвращается» из PayPal, php удалит информацию о сеансе.
Вы можете проверить session.referer_check
с помощью phpinfo ().
Другие советы
Можете ли вы сделать phpinfo () и сказать, верно ли для session.auto_start?