2016-11-23 28 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沙箱一起工作過,我從來沒有這樣的行爲,你描述過。 –