Почему мои сеансы 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?