您好我的网站上有一个表单,我希望在我的用户填写表单并在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;
}
?>
只允许已提交表单的用户查看该页面,但使用paypal但中间我不知道如何让它按照我想要的方式工作,
任何帮助都将受到极大欢迎。谢谢
答案 0 :(得分:1)
PayPal WPS允许您设置自动退货页面,客户在付款完成后重定向到该页面。 现在,由于自动返回包含GET请求,因此无法阻止用户复制URL并将其发送给其他人。但 >的用途是设置一种机制来弃用每笔付款交易的感谢信息。当然,这不是一个理想的解决方案,但它是一种可能性:
首先,转到您在网站上使用的付款表单,向PayPal发送付款请求,并添加一个名为return
的隐藏变量,并使用您希望用户重定向到的网址设置该变量: / p>
<input type="hidden" name="return" value="<?php echo $returnUrl; ?>" />
由于您肯定希望每个交易都有一个返回网址,因此您可以知道每个网页是否被查看,网址可能如下所示:
$returnUrl = "https://www.yoursite.com/thankyou.php?x=123";
其中123
是“那个”特定交易的标识号。要跟踪所有待处理的谢谢,您可以拥有一个数据库表,将交易标识与客户链接;通过这种方式,您将能够显示个性化消息。
现在,当PayPal将客户发回您的网站时,您可以检查$_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;
}
请记住,当您构建要使用付款请求发送到PayPal的表单时,您应该已经创建了临时行:
...
$qst = "INSERT INTO tmp_tx_tracker (orderId, customerId) VALUES ('{$orderId}', '{$customerId}') ";
...
正如您所看到的,这里我没有使用读取标志,但我在阅读后删除了该行,因此请注意反映此内容的原始代码中的更改。