php订阅实现
PHP 订阅系统实现
数据库设计
创建订阅相关的数据表结构是基础。通常需要用户表、订阅计划表和用户订阅关系表。
用户表(users)存储用户基本信息:
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(100) UNIQUE,
password VARCHAR(255)
);
订阅计划表(plans)定义不同订阅套餐:
CREATE TABLE plans (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50),
price DECIMAL(10,2),
duration_days INT
);
用户订阅表(subscriptions)记录订阅关系:
CREATE TABLE subscriptions (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT,
plan_id INT,
start_date DATETIME,
end_date DATETIME,
status ENUM('active', 'expired', 'canceled'),
FOREIGN KEY (user_id) REFERENCES users(id),
FOREIGN KEY (plan_id) REFERENCES plans(id)
);
订阅流程处理
用户选择订阅计划后生成订阅记录,需要计算有效期并更新状态。
// 用户选择订阅计划后
$planId = $_POST['plan_id'];
$userId = $_SESSION['user_id'];
// 获取计划信息
$plan = $db->query("SELECT * FROM plans WHERE id = $planId")->fetch();
// 计算起止时间
$startDate = date('Y-m-d H:i:s');
$endDate = date('Y-m-d H:i:s', strtotime("+{$plan['duration_days']} days"));
// 创建订阅记录
$db->prepare("INSERT INTO subscriptions (user_id, plan_id, start_date, end_date, status)
VALUES (?, ?, ?, ?, 'active')")
->execute([$userId, $planId, $startDate, $endDate]);
订阅状态检查
定期检查订阅状态,自动处理过期订阅。

// 每日执行的过期检查
$now = date('Y-m-d H:i:s');
$expiredSubs = $db->query("SELECT id FROM subscriptions
WHERE end_date <= '$now' AND status = 'active'");
while ($sub = $expiredSubs->fetch()) {
$db->exec("UPDATE subscriptions SET status = 'expired' WHERE id = {$sub['id']}");
}
支付集成
集成支付网关如Stripe或PayPal完成实际支付流程。
Stripe集成示例:
\Stripe\Stripe::setApiKey('sk_test_xxx');
$paymentIntent = \Stripe\PaymentIntent::create([
'amount' => $plan['price'] * 100,
'currency' => 'usd',
'metadata' => [
'user_id' => $userId,
'plan_id' => $planId
]
]);
// 返回客户端密钥给前端
echo json_encode(['clientSecret' => $paymentIntent->client_secret]);
订阅管理界面
为用户和管理员提供订阅管理功能,包括查看当前订阅、取消订阅等。

获取用户当前订阅信息:
$userId = $_SESSION['user_id'];
$subscription = $db->query("SELECT s.*, p.name as plan_name
FROM subscriptions s
JOIN plans p ON s.plan_id = p.id
WHERE s.user_id = $userId AND s.status = 'active'
LIMIT 1")->fetch();
取消订阅操作:
$subId = $_POST['subscription_id'];
$db->exec("UPDATE subscriptions SET status = 'canceled' WHERE id = $subId");
邮件通知
订阅关键节点发送邮件通知用户。
订阅成功通知示例:
$to = $userEmail;
$subject = '订阅确认';
$message = "您已成功订阅{$planName},有效期至{$endDate}";
$headers = 'From: noreply@example.com';
mail($to, $subject, $message, $headers);
安全注意事项
- 对所有数据库查询使用预处理语句防止SQL注入
- 支付环节使用HTTPS加密传输
- 敏感操作如取消订阅需要二次确认
- 定期备份订阅相关数据
性能优化建议
- 为频繁查询的字段如status和end_date建立索引
- 对大量订阅记录进行分页处理
- 考虑使用队列处理邮件发送等耗时操作
- 缓存活跃订阅信息减少数据库查询
以上实现方案可根据实际业务需求进行调整,例如增加试用期功能、多层级订阅或家庭共享订阅等扩展功能。






