【问题标题】:How to let the "thank you" page be seen only from users after paypal transaction?如何让支付宝交易后只有用户才能看到“谢谢”页面?
【发布时间】:2014-12-06 00:41:47
【问题描述】:

您好,我的网站上有一个表格,我希望在我的用户填写表格并在贝宝页面上付款后,他将被重定向到我的“谢谢”页面。但在一种情况下,只有拥有

的用户

完成此过程将看到我的感谢页面,而不是用户复制“谢谢”链接并将其发送给某人,该链接不应该对完成付款程序的用户之外的任何男孩开放。

我已经在我的网站中存档了类似的内容,但是使用贝宝我不知道该怎么做: 在我的 proces.php 验证过程之后,我有了这个

$emotion = $_POST['emotion']; 

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

}

这个代码在pay pal的“立即购买”按钮被放置在“mypage.php”的网站上

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

只让已提交表单的用户看到该页面,但中间使用贝宝,我不知道如何让它像我想要的那样工作,

非常欢迎任何帮助。谢谢

【问题讨论】:

  • 您可以在会话变量上使用isset()
  • 您使用的是 PayPal 网站支付标准吗?
  • 是的@Alejandro Arbiza
  • @Fred -ii- 你是什么意思,你能解释一下,或者如果你能写一个例子,谢谢
  • 取决于您希望使用的会话变量,例如if(isset($_SESSION['session_name']) &amp;&amp; !empty($_SESSION['session_name'])){ // do something }

标签: php paypal


【解决方案1】:

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 标志,而是在阅读后删除了该行,因此请注意原始代码中反映这一点的更改。

【讨论】:

  • 我喜欢你的想法@Alejandro 我现在正在测试它,谢谢
  • 这部分代码“$thankRow = getThankRowFromDatabase($x);”出现错误?
  • 哦,你应该把它当作伪代码,那些函数并不真正存在;它们只是描述一般过程的一种方式。 getThankRowFromDatabase() 是一个理论上的函数,应该返回一行。我不知道您如何访问数据库,所以我尝试使用一个非常具有描述性的名称,以便从中明确目的。细节的实现取决于您的环境。如果您提供了更多信息来显示您如何访问数据库,我可以在答案中提供一些更“现实”的代码。
  • 对不起,我是 php 的菜鸟,我使用以下代码访问我的数据库: $link = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD);你知道这些值都是一次性写的,当我需要的时候我就用这个来调用它们
  • 好的,请注意 mysql_x 函数由于安全问题不鼓励使用,甚至自 PHP 5.5 起已弃用。请 google MySQLi 并花一些时间了解它,然后再继续使用此应用程序。
猜你喜欢
  • 1970-01-01
  • 2015-03-04
  • 2021-11-03
  • 2012-06-26
  • 2015-01-17
  • 1970-01-01
  • 2019-12-11
  • 2014-07-13
  • 1970-01-01
相关资源
最近更新 更多