У меня есть приложение, использующее 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?