我有一个用户从PayPal购买文件后被定向到的PHP文件。它开始一个会话:
<html>
//Thank you message
</html>
<?php
session_start();
$_SESSION["token"] = uniqid();
file_put_contents("token.txt", $_SESSION["token"]);
include("purchased.php");
?>
该PHP文件应重定向到此PHP文件以开始下载该文件:
<?php
if(!isset($_SESSION["token"])){$allowed = false;}
else{
$allowed = true;
$token1 = $_SESSION["token"];
$token2 = file_get_contents("token.txt");
if($token1 == $token2)
{
$file="song.mp3";
if (file_exists($file)) {
header('Content-Description: File Transfer');
header('Content-Type: audio/mpeg');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
readfile($file);
exit;
}
}
}
session_unset();
?>
但是,如果我将URL复制并粘贴到第一个文件,我的下载会自动启动(第二个文件在第一个文件之后很快就会运行),因为我无法找到编写第一个PHP文件的最佳方法。我知道我做错了什么。帮助
答案 0 :(得分:2)
不幸的是,对于客户端事件,您需要在内容中包含文件路径。但是你可以做的一件事就是使用AJAX,如果你发送了获取文件路径的请求,请说:
getContent("path.php", function (res) {
// res will have the file path, say, http://file.php.
window.location.href = res;
});
注意:
getContent
- AJAX的伪代码获取类似于jQuery&#39;$.get()
实现的请求。
这为您提供了更好的隐藏方式。不过,不多,但有点好。在下载之前,您必须使用Sessions或Cookies进行服务器端验证,这使其成为正确的方法!
使用简单的用户管理,当用户登录时,每个页面中都会有session_start()
,并且会话将被设置。在下载页面中,您可以执行以下操作:
<?php
session_start();
if (!isset($_SESSION[user])) {
die("Not Authorised!");
}
// Rest of the download code.
?>
对于简单的用户注册,您可以按照我的教程Making an Affiliate Registration with Hierarchy进行操作。
答案 1 :(得分:-1)
您应该使用会话来做到这一点。创建会话,当用户购买曲目时,向会话添加令牌。然后file.php检查是否存在有效令牌,如果有,则为文件提供服务。
所以它的工作方式与此类似:
用户购买文件后(您可能会得到一些您正在使用的付款方式的结果,如果付款成功与否),您将在用户重定向到的PHP文件中生成一个令牌,还会显示“谢谢”消息。 首先,您必须在所述文件中启动会话:
session_start();
您可以生成一个简单的令牌,例如:
$token = uniqid();
令牌看起来有点像这样:4b3403665fea6
。
之后,您必须将令牌保存在服务器上(例如使用MySQL),然后将其设置为会话:
$_SESSION["token"] = $token;
然后在file.php
中,您必须像以前一样在顶部开始会话:
session_start();
然后检查会话中是否有令牌。如果没有,请设置一些临时变量,我们将使用它来检查是否允许下载,为false。如果是,则从会话中获取令牌:
if(!isset($_SESSION["token"])) {
$allowed = false;
} else {
$allowed = true;
$token = $_SESSION["token"];
}
之后,您只需将$token
中的字符串与之前在服务器上保存的令牌进行比较。如果服务器上有与该字符串匹配的令牌,请将$allowed
设置为true。然后,如果$allowed
为真,则只执行其余代码。