2014-10-10 134 views
0

您好,我在我的網站上有一個表單,我希望在用戶填寫表單並在PayPal頁面上進行付款後,他將被重定向到我的「謝謝」頁面。但在一種情況下,只有擁有如何讓paypal交易後的用戶只能看到「謝謝」頁面?

的用戶完成此過程纔會看到我的感謝頁面,而不是用戶複製「謝謝」鏈接並將其發送給某人,鏈接不應該運行完成了付款程序。

我已經歸檔這樣的事情我的網站內,但尚未與貝寶我不知道該怎麼做: 我在我的proces.php

$emotion = $_POST['emotion']; 

if($emotion == 'Basic Pack') { 
session_start(); 
$_SESSION['form_finished'] = true; 
header('Location: /buynow/mypage.php'); 

} 

驗證理線而這種代碼在網站上後,有這其中來自付費朋友現在購買按鈕被置於「mypage.php」

<?php 
session_start(); 
if(!$_SESSION['form_finished']) { 
    header("HTTP/1.0 404 Not Found"); 
    exit; 
} 
?> 

只讓已提交表單的用戶看到的頁面,但貝寶還沒有在中間我不知道如何使它工作就像我想要的,

任何幫助將大大Welcomed.Thanks

+0

你可以在會話變量上使用'isset()'。 – 2014-10-10 19:10:26

+0

您是否使用PayPal網站付款標準? – 2014-10-10 19:21:54

+0

是@Alejandro Arbiza – 2014-10-10 20:16:59

回答

1

貝寶WPS允許您設置一個自動返回頁面,到付款結束後,客戶將被重定向。 現在,由於自動返回包含GET請求,因此無法阻止用戶複製URL並將其發送給其他人。但是,您可以使用而不是來建立一種機制,以便爲每次付款交易棄用感謝消息。這當然不是理想的解決方案,但它是一種可能性:

首先,轉到您在網站中使用的付款表單,將付款請求發送到PayPal並添加名爲return的隱藏變量,並將該變量設置爲你希望用戶的URL重定向到:

<input type="hidden" name="return" value="<?php echo $returnUrl; ?>" /> 

既然你一定會希望有每筆交易一個單一的返回URL,這樣你就可以知道是否每個頁面看到沒有,URL可能看起來像:

$returnUrl = "https://www.yoursite.com/thankyou.php?x=123"; 

其中123是「該」特定交易的一些識別號碼。爲了跟蹤所有未完成的感謝,您可以擁有一個數據庫表,將交易標識與客戶相關聯;這樣你將能夠顯示個性化的信息。

現在,當貝寶向客戶發送到你的網站,你可以檢查$_GET['x']和構建謝謝頁:從數據庫讀取的「謝謝你」條目

$x = $_GET['x']; 
$thankRow = getThankRowFromDatabase($x); 

if ($thankRow === false) 
{ 
    // redirect to some other page, don't show thank you 
} 

$customer = getCustomerFromDatabase($thankRow['customerId']); 

$message = "Thank you {$customer['name']}."; 

// Display messages 

權後,你可以刪除該行或將其標記爲已讀。這就是訣竅:如果有人試圖再次看到該頁面,相應的「謝謝你」行將被標記爲已查看(或可能已刪除),因此您只需重定向到家中或網站中的其他頁面。

這樣,「謝謝」頁面只能查看一次;我認爲這最終是有道理的。

編輯:其他細節。

的第一件事情是創建一個數據表來跟蹤交易,有兩個領域的一些簡單:

tmp_tx_tracker(orderId, customerId) 

既然你肯定建立某種命令,此刻的你打造付款表格,在將其發送到PayPal之前,您應該有一個訂單ID,以便您可以使用它來識別交易。 customerId領域應該是微不足道的。

我假設你已經有一張客戶表,我假設表的主鍵是客戶的ID,我稱之爲'customerId'。所以,這一切:

function getThankRowFromDatabase($id) 
{ 
    $row = false; 

    $qst = "SELECT orderId, customerId FROM tmp_tx_tracker WHERE orderId = '{$id}' "; 

    // run the query as you normally do and put the row in $row 

    if ($row !== false) 
    { 
     // Now we have the information in the variable $row, we can 
     // delete the entry from the db so the message won't be available in the future. 
     $qst = "DELETE FROM tmp_tx_tracker WHERE orderId = = '{$id}' "; 
     // Execute the query as you usually do. 
    } 

    return $row; 
} 

在這種情況下,我沒有保持一個標誌標記列讀,但我會看完後刪除該行。

我想你也有一些方法來從數據庫中獲取的客戶:那是你應該更換getCustomerFromDatabase(),但在這裏完成的例子:

function getCustomerFromDatabase($id) 
{ 
    $qst = "SELECT name FROM customers WHERE customerId = '{$id}' "; 

    // run the query as you normally do and fetch the $row 

    return $row; 
} 

請記住,在那一刻,你建的形式發送給貝寶與支付請求,您應該已經創建了臨時行:

... 
$qst = "INSERT INTO tmp_tx_tracker (orderId, customerId) VALUES ('{$orderId}', '{$customerId}') "; 
... 

正如你所看到的,在這裏我沒有使用標誌,但我讀後刪除的行因此請注意原始代碼中的變化反映了這一點。

+0

我喜歡你的想法@Alejandro我現在正在測試它,謝謝 – 2014-10-10 21:15:04

+0

我' m在這部分代碼上出現錯誤「$ thankRow = getThankRowFromDatabase($ x);」 ? – 2014-10-10 21:24:59

+0

哦,你應該把它當作僞代碼,這些函數並不存在;它們只是描述一般過程的一種方式。 'getThankRowFromDatabase()'是應該返回一行的理論函數。我不知道你如何訪問數據庫,所以我試圖使用一個非常具有描述性的名稱,以便從中明確目的。細節的實施取決於您的環境。如果您提供了更多信息來顯示您如何訪問數據庫,那麼我可以在答案中提供更多「現實」的代碼。 – 2014-10-10 21:54:20

相關問題