2

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

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

  • 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

有一个表单,其发布操作是第三方网站的 url... 作为

<?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>

响应.php

第三方在发布请求中再次向我的响应页面提供响应,在该页面我直接测试 POST 变量的输出,在这里我尝试使用我的会话变量

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

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

4

6 回答 6

3

不看更多代码很难知道(start_process.php 如何挂钩第三方代码,第三方如何返回 response.php)。这里有几个猜测:

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

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

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

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

于 2013-03-29T00:20:53.317 回答
2

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

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

你可以发送

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

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

于 2013-04-01T19:05:34.443 回答
1

首先,您需要在使用它之前启动一个会话。在将任何值分配给您的代码中的会话有效类型之前: session_start(); 不要忘记销毁/取消设置会话。希望它会起作用

于 2013-03-26T08:44:40.273 回答
1

使用具有某些指定过期时间的 cookie!它会运作良好。用一些代码更新了您的问题,以便编码人员可以调试它!

于 2013-03-26T08:49:33.173 回答
1

简短的回答是:找到饼干!

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

第三部分呢。response.php 是从同一个浏览器还是从另一个 Web 应用程序请求的,所以它有相同的 cookie 吗?在我看来,没有。

于 2013-03-29T09:32:37.417 回答
1

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

如果第三方应用程序将自身调用到响应的 URL 并且不是重定向到客户端,则会话是不同的。

例子:

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

检查会话 ID 是否由客户端 cookie 维护并在服务器中验证非常重要。启动进程的客户端和第三方是具有自己会话的应用程序的不同“客户端”。


根据您的问题显示您可能正在做的图表示例。

可能您不能直接从客户端调用第三方。在客户端调用您主机上的一个页面,该页面调用第三方并捕获响应(例如使用 curl)

图表示例:

于 2013-04-01T16:16:23.670 回答