2016-11-23 31 views
0

我正在用登录页面创建一个网页游戏。如果用户想要转换成游戏的“专业版”,这将把用户带到PayPal。PHP - 在paypal重定向后失去会话

我遇到的问题是会话似乎是从PayPal返回到我的payment_successful.php页面中断。会话变量都是空的。

我开始给所有适当的页面session_start()行。会话ID(从Chrome中的控制台获取)与会话启动时的相同,并返回到payment_successful.php。所以这个“看起来”是不变的。

经过大量的不同想法的修补后,我尝试手动添加在会话ID。

无论是登录页面和页面Payment_successful:

session_id('my_id'); 
session_start(); 

这就像一个魅力,并返回我所有的会话变量的完美。然而,我猜测这是一个非常糟糕的主意,有一个固定的会话ID(抱歉,我忘了提及我是所有这一切的新手)。

所以我改变了登录页面来创建自己的会话ID,希望它只是简单地把新的值来代替固定值:

登录页面

add_seshid(); 
session_start(); 
// session_set_cookie_params (lifetime,'/','.mydomain.com',false); 

function add_seshid() { 
    $sesh_salt1 = "*s!$e"; 
    $sesh_salt2 = "$6#£"; 
    $sesh_date = date("mYhds"); 
    $sesh_pass = "lambchops".$sesh_date; 
    $sesh_token = hash('ripemd128',"$sesh_salt1$sesh_pass$sesh_salt2"); 
    session_id($sesh_token); 
} 

Payment_successful页:

session_id($sesh_token); 
session_start(); 

虽然它输出一个会话ID(如986a25f1d1fdabc62837def39b485c6),并且跨越它对面的会议,它也不会返回任何会话变量。 我使用自己的域名修饰session_set_cookie_params行,以查看域名更改是否存在问题,但这没有任何区别。此外,所有的密码,盐等,已被更改为本文的目的,以防有人发痒评论!

希望有人能指出我正确的方向。

非常感谢,
丹。

回答

1

假设有http://sitea/landing.php这是您的网站页面。这应该与

session_start(); 

开始,当你访问此页 - 如果您启用浏览器的开发者工具栏 - 你应该看到您的PHPSESSID

enter image description here

现在让我们假设某处有一个链接paypal

echo '<a href="http://paypal.com">Go to paypal</a><br>'; 

当您完成购买并从paypal重定向到您的成功页面后 - 您是否看到相同的PHPSESSID他的浏览器?
您的成功网页也应该开始

session_start(); 

在这之后您的会话瓦尔应通过$_SESSION['varname']

编辑1可用:

你尝试测试2个简单的虚拟机?
分离出2个虚拟机。
其中一个代表您的网站(我们称之为SiteA),另一个代表您的PayPal(我们称之为SiteB)。
在站点A创建下面的测试代码

cat -n FormData.html 
1 <!DOCTYPE html> 
2 <html> 
3 <body> 
4 
5 <form action="session_start.php" method="post"> 
6 First name:<br> 
7 <input type="text" name="firstname" value="Mickey"> 
8 <br> 
9 Last name:<br> 
10 <input type="text" name="lastname" value="Mouse"> 
11 <br><br> 
12 <input type="submit" value="Submit"> 
13 </form> 
14 
15 <p>If you click the "Submit" button, the form-data will be sent to a page called "action_page.php".</p> 
16 
17 </body> 
18 </html> 

cat -n session_start.php 
1 <?php 
2 session_start(); 
3 echo "Hello World!<br>"; 
4 echo "Received First Name as " . $_POST['firstname'] . "<br>"; 
5 echo "Received Last Name as " . $_POST['lastname'] . "<br>"; 
6 $_SESSION['firstname']=$_POST['firstname']; 
7 $_SESSION['lastname']=$_POST['lastname']; 
8 echo '<a href="display_session_data.php">Display session data</a><br>'; 
9 echo '<a href="http://192.168.0.43/paypal.php">Go to paypal</a><br>'; 
10 ?> 
11 

cat -n display_session_data.php 
1 <?php 
2 session_start(); 
3 echo "First Name is $_SESSION[firstname] <br>"; 
4 echo "Last Name is $_SESSION[lastname] <br>"; 
5 ?> 

在站点B上创建一个页面

cat -n paypal.php 
1 <?php 
2 echo '<a href="http://192.168.0.42/display_session_data.php">Go back to game site</a>'; 
3 ?> 

看看这对你的作品。这应该。
然后,如果这个工程 - 用您的贝宝链接替换SiteB链接。
测试。
基本上可以尝试在迭代中执行小的可验证步骤,并确保它们按预期工作。通过这种方式,一旦发生了某些事情,您就会确切地知道您发生了什么变化以及在哪里查找问题

+0

嗨,是的,它从开始到结束都是相同的PHPSESSID,除了Paypal页面之间有自己的ID。我已经将session_id移到了session_start的下面,但是与空的返回没有区别。我的Paypal链接是:\t header('location:https://www.sandbox.paypal.com/cgi-bin/webscr'.$querystring); \t exit(); –

+0

您是否尝试过针对不是贝宝的东西测试您的代码?让我们来说简单的表单,它将几个输入字段提交到您的PHP页面。 PHP启动会话并设置从$ _POST读取的会话变量。然后你点击链接到网站,将导致你到其他网站(不同的ip/fqdn)。在这个其他网站 - 把一个链接回到原来的网站不同的PHP文件,这也将开始会议,并简单地显示会话变量。我之前和PayPal沙箱一起工作过,我从来没有这样的行为,你描述过。 –