PayPal 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 是“那个”特定交易的一些标识号。为了跟踪所有未决的感谢,您可以有一个数据库表,将交易标识与客户联系起来;这样您就可以显示个性化的消息。
现在,当 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}') ";
...
如您所见,这里我没有使用 read 标志,而是在阅读后删除了该行,因此请注意原始代码中反映这一点的更改。