从第三方网站返回后,会话不正确

时间:2013-03-23 14:30:08

标签: php session

如果所有处理都在我自己的网站上进行,那么一切正常。会话变量成功存储和检索。

现在我得到了第三部分集成,它通过POST数据处理。我在每个php文件的第一行调用session_start()

  • start_process.php - 按如下方式设置一些会话变量,并调用重定向到response.php的第三方

     $_SESSION["id"] = $id       // Echoing these shows the correct values 
     $_SESSION["name"]= $name    // Echoing these shows the correct values 
    
  • response.php - 此页面收到第三方的回复并尝试从会话变量中获取数据

     $id = $_SESSION["id"]           // This comes out to be blank
     $name = $_SESSION["name"]       // This comes out to be blank
    

在我的处理页面上,即response.php,我试图恢复会话值,我没有得到会话变量。

在SO上搜索,很少有帖子建议检查

的值
echo session_id();

在第一页和后一页回到我的网站时会有所不同。进一步搜索显示以下值必须为空白

echo ini_get('session.cookie_domain');

这确实是空白的。现在我卡住了,因为我看到这个值为空白,即使会话没有正确加载。

您能否建议下一步做什么?有没有调试?有什么提示可以解决这个问题吗?


更新

start_process.php

有一个表单,其帖子操作是第三方网站的网址...

<?php session_start(); 
$_SESSION["Check"] = "Abc";
echo session_id();
>
<form name="myform" action="http://<ThirdPartyUrl.com>/pathToSomePage.jsp" method="POST">
          <!-- some  hidden fields with value  and some other text fields -->
</form>

respone.php

第三方在post请求中再次给我的响应页面做出响应,我直接测试POST变量的输出,这里我试图使用我的会话变量

<?php session_start(); 
echo $_SESSION["Check"];
echo session_id(); // This is different from the one printed in the start_process.php page
?>

我认为第三方托管不在同一台服务器上,因为目前我在共享主机上,第三方肯定拥有自己的服务器。

6 个答案:

答案 0 :(得分:3)

很难知道没有看到更多的代码(start_process.php如何挂钩到第三方代码,第三方如何回到response.php)。以下是几个猜测:

理论1:第三方代码弄乱了您的会话(如果托管在同一台服务器上)

此第三方集成是否托管在同一台服务器上?如果是这样,我会怀疑第三方可能正在结束/重新创建或修改您的会话。

理论2:第三方使用单独的域重定向回您的网站

您是否有可能从 mydomain.com 开始,第三方重定向回 www.mydomain.com (或类似的东西)?即使这两个域看起来应该是相同的,但就PHP会话而言,它们完全不同,你最终会得到不同的会话。

答案 1 :(得分:2)

在处理购物车支付网关集成时,我遇到了类似的问题。如果最终通过浏览器联系响应脚本(即用户在第三方站点上完成后重定向到response.php),则会保留会话ID和cookie。如果通过来自第三方站点的服务器端请求联系您的响应脚本,则该请求将被视为全新会话。在这种情况下,许多集成允许您发送“passthrough”变量,该变量将与第三方站点生成的其余数据一起发送回您的响应脚本。您可以使用此变量将用户的会话连接到稍后收到的服务器端请求(例如,您可以创建一个与这两个值相关的数据库)。或者你可以“欺骗”系统。如果您每次都将响应脚本位置与请求一起传递,则可以在其中构建自己的passthrough变量。所以不是像

那样的东西

<responseURL>www.mysite.com/response.php</responseURL>

你可以发送

<responseURL>www.mysite.com/response.php?key=abcd1234</responseURL>

我建议直接将关键参数设置为会话ID,因此您必须构建一些可以在两者之间转换的简单参数(如上面提到的表格)。

答案 2 :(得分:1)

首先,您需要在使用之前启动会话。在将任何会话值类型的值分配到代码之前:session_start();不要忘记摧毁/取消会话战斗机。希望它能起作用

答案 3 :(得分:1)

使用具有指定过期时间的Cookie!它会运作良好。用一些代码更新你的问题,这样编码器就可以调试它了!

答案 4 :(得分:1)

简短回答是:找到cookie!

您可以在域或目录级别松散。请参阅session_set_cookie_params()规范。

第3部分怎么样? response.php是否从同一个浏览器或其他网络应用程序请求,所以有相同的cookie吗?在我看来,没有。

答案 5 :(得分:1)

要解决问题,需要分析流程步骤以确定每次执行的位置

如果第三方应用程序将itselft调用到响应的URL并且不是重定向到客户端,那么会话就不一样了。

示例:

  • 客户端导航到start_process.php并为客户端
  • 创建会话
  • start_process.php调用thirdParty
  • 第三方应用程序调用response.php并创建第三方会话

请务必检查会话ID是否由客户端cookie维护并在服务器中验证。启动流程的客户和第三方是应用程序的不同“客户”与他们自己的会话。


图表示例显示您可能正在根据您的问题进行操作。

http://i46.tinypic.com/10dsb52.jpg

可能您无法直接从客户端呼叫第三方。在客户端上调用主机上调用第三方并捕获响应的页面(例如使用curl)

图示例:

http://i49.tinypic.com/htuxr7.png