如果所有处理都在我自己的网站上进行,那么一切正常。会话变量成功存储和检索。
现在我得到了第三部分集成,它通过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');
这确实是空白的。现在我卡住了,因为我看到这个值为空白,即使会话没有正确加载。
您能否建议下一步做什么?有没有调试?有什么提示可以解决这个问题吗?
有一个表单,其帖子操作是第三方网站的网址...
<?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>
第三方在post请求中再次给我的响应页面做出响应,我直接测试POST变量的输出,这里我试图使用我的会话变量
<?php session_start();
echo $_SESSION["Check"];
echo session_id(); // This is different from the one printed in the start_process.php page
?>
我认为第三方托管不在同一台服务器上,因为目前我在共享主机上,第三方肯定拥有自己的服务器。
答案 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并且不是重定向到客户端,那么会话就不一样了。
示例:
请务必检查会话ID是否由客户端cookie维护并在服务器中验证。启动流程的客户和第三方是应用程序的不同“客户”与他们自己的会话。
图表示例显示您可能正在根据您的问题进行操作。
http://i46.tinypic.com/10dsb52.jpg
可能您无法直接从客户端呼叫第三方。在客户端上调用主机上调用第三方并捕获响应的页面(例如使用curl)
图示例: