php转账实现
PHP转账功能实现
实现转账功能需要处理数据库操作、事务管理以及安全性验证。以下是关键步骤和代码示例:
数据库表设计
创建accounts表存储用户账户信息:
CREATE TABLE accounts (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
balance DECIMAL(10,2) NOT NULL DEFAULT 0.00,
currency VARCHAR(3) DEFAULT 'USD'
);
CREATE TABLE transactions (
id INT AUTO_INCREMENT PRIMARY KEY,
from_account INT NOT NULL,
to_account INT NOT NULL,
amount DECIMAL(10,2) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
转账核心逻辑
使用PDO实现带事务处理的转账:
function transferMoney($pdo, $fromUserId, $toUserId, $amount) {
try {
$pdo->beginTransaction();
// 检查转出账户余额
$stmt = $pdo->prepare("SELECT balance FROM accounts WHERE user_id = ? FOR UPDATE");
$stmt->execute([$fromUserId]);
$fromBalance = $stmt->fetchColumn();
if ($fromBalance < $amount) {
throw new Exception("Insufficient balance");
}
// 扣减转出账户
$stmt = $pdo->prepare("UPDATE accounts SET balance = balance - ? WHERE user_id = ?");
$stmt->execute([$amount, $fromUserId]);
// 增加转入账户
$stmt = $pdo->prepare("UPDATE accounts SET balance = balance + ? WHERE user_id = ?");
$stmt->execute([$amount, $toUserId]);
// 记录交易
$stmt = $pdo->prepare("INSERT INTO transactions (from_account, to_account, amount) VALUES (?, ?, ?)");
$stmt->execute([$fromUserId, $toUserId, $amount]);
$pdo->commit();
return true;
} catch (Exception $e) {
$pdo->rollBack();
error_log("Transfer failed: " . $e->getMessage());
return false;
}
}
安全防护措施
验证输入参数:
if (!is_numeric($amount) || $amount <= 0) {
die("Invalid amount");
}
// 防止CSRF攻击
if (!verifyCsrfToken($_POST['csrf_token'])) {
die("Security violation");
}
使用HTTPS传输数据,对金额进行精度处理:

$amount = round(floatval($amount), 2);
完整调用示例
// 初始化PDO连接
$pdo = new PDO("mysql:host=localhost;dbname=bank", "user", "password");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 调用转账函数
$success = transferMoney($pdo, 123, 456, 100.00);
if ($success) {
echo "Transfer completed successfully";
} else {
echo "Transfer failed";
}
扩展功能建议
- 添加每日转账限额检查
- 实现短信/邮件通知
- 记录完整的交易日志
- 支持多币种转换
- 提供交易流水查询接口
关键点在于使用数据库事务确保数据一致性,以及对所有操作进行充分验证。生产环境还应考虑添加防重放攻击机制和更严格的身份验证。






