2014-10-10 65 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

相关问题