本文目录导读:

我来为您详细介绍PHP钱包集成的完整方案,钱包集成通常涉及数字货币或支付系统,我将分步说明。
钱包集成基础架构
核心组件
// 钱包服务类
class WalletService {
private $apiKey;
private $apiSecret;
private $baseUrl;
public function __construct($config) {
$this->apiKey = $config['api_key'];
$this->apiSecret = $config['api_secret'];
$this->baseUrl = $config['base_url'];
}
}
主流钱包集成方案
A. 区块链钱包 (Bitcoin/Ethereum)
// 使用 web3.php 库
composer require web3/web3
// Ethereum 钱包集成
use Web3\Web3;
use Web3\Providers\HttpProvider;
use Web3\Methods\Eth;
class EthereumWallet {
private $web3;
public function __construct($rpcUrl) {
$this->web3 = new Web3(new HttpProvider($rpcUrl));
}
// 创建钱包
public function createWallet() {
$personal = $this->web3->personal;
$password = bin2hex(random_bytes(16));
$personal->newAccount($password, function($err, $account) {
if ($err !== null) {
throw new Exception($err->getMessage());
}
return [
'address' => $account,
'password' => $password
];
});
}
// 查询余额
public function getBalance($address) {
$eth = $this->web3->eth;
$balance = 0;
$eth->getBalance($address, function($err, $balance) use (&$result) {
if ($err !== null) {
throw new Exception($err->getMessage());
}
$result = $balance;
});
return $this->weiToEth($result);
}
private function weiToEth($wei) {
return bcdiv($wei, '1000000000000000000', 18);
}
}
B. 第三方支付钱包 (如 Stripe/支付宝)
// Stripe 钱包集成
require_once 'vendor/autoload.php';
\Stripe\Stripe::setApiKey('your_stripe_secret_key');
class StripeWallet {
// 创建支付意图
public function createPayment($amount, $currency = 'usd') {
try {
$paymentIntent = \Stripe\PaymentIntent::create([
'amount' => $amount * 100, // 转换为分
'currency' => $currency,
'payment_method_types' => ['card'],
]);
return [
'client_secret' => $paymentIntent->client_secret,
'id' => $paymentIntent->id
];
} catch (\Exception $e) {
throw new Exception('Payment failed: ' . $e->getMessage());
}
}
// 处理退款
public function refundPayment($paymentId, $amount = null) {
try {
$refund = \Stripe\Refund::create([
'payment_intent' => $paymentId,
'amount' => $amount ? $amount * 100 : null
]);
return $refund->status;
} catch (\Exception $e) {
throw new Exception('Refund failed: ' . $e->getMessage());
}
}
}
数据库设计
-- 用户钱包表
CREATE TABLE user_wallets (
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
wallet_type VARCHAR(50) NOT NULL,
address VARCHAR(255) NOT NULL,
balance DECIMAL(20,8) DEFAULT 0.00000000,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY unique_user_wallet (user_id, wallet_type)
);
-- 交易记录表
CREATE TABLE transactions (
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
wallet_id INT NOT NULL,
tx_hash VARCHAR(255),
type ENUM('deposit', 'withdraw', 'transfer', 'payment') NOT NULL,
amount DECIMAL(20,8) NOT NULL,
fee DECIMAL(20,8) DEFAULT 0.00000000,
status ENUM('pending', 'completed', 'failed') DEFAULT 'pending',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
钱包核心功能实现
class WalletManager {
private $db;
private $walletService;
public function __construct($db, $walletService) {
$this->db = $db;
$this->walletService = $walletService;
}
// 存款
public function deposit($userId, $walletType, $amount, $txHash) {
$this->db->beginTransaction();
try {
// 更新钱包余额
$sql = "UPDATE user_wallets
SET balance = balance + ?
WHERE user_id = ? AND wallet_type = ?";
$this->db->query($sql, [$amount, $userId, $walletType]);
// 记录交易
$sql = "INSERT INTO transactions
(user_id, wallet_id, tx_hash, type, amount, status)
VALUES (?, (SELECT id FROM user_wallets
WHERE user_id = ? AND wallet_type = ?),
?, 'deposit', ?, 'completed')";
$this->db->query($sql, [$userId, $userId, $walletType, $txHash, $amount]);
$this->db->commit();
return true;
} catch (\Exception $e) {
$this->db->rollback();
throw $e;
}
}
// 转账
public function transfer($fromUserId, $toAddress, $walletType, $amount) {
// 验证余额
$balance = $this->getBalance($fromUserId, $walletType);
if ($balance < $amount) {
throw new Exception('Insufficient balance');
}
// 执行外部转账
$txHash = $this->walletService->sendTransaction(
$fromUserId,
$toAddress,
$amount
);
// 更新本地数据库
$this->updateLocalBalance($fromUserId, $walletType, -$amount, $txHash);
return $txHash;
}
// 查询余额
public function getBalance($userId, $walletType) {
$sql = "SELECT balance FROM user_wallets
WHERE user_id = ? AND wallet_type = ?";
$result = $this->db->query($sql, [$userId, $walletType]);
return $result['balance'] ?? 0;
}
}
API 接口实现
// 钱包控制器
class WalletController {
private $walletManager;
// 创建钱包
public function createWallet(Request $request) {
$userId = $request->user_id;
$walletType = $request->wallet_type;
try {
// 检查是否已有钱包
$existingWallet = $this->walletManager->getWallet($userId, $walletType);
if ($existingWallet) {
return response()->json(['error' => 'Wallet already exists'], 400);
}
// 创建新钱包
$walletAddress = $this->walletManager->createNewWallet($walletType);
// 保存到数据库
$this->walletManager->saveWallet($userId, $walletType, $walletAddress);
return response()->json([
'success' => true,
'address' => $walletAddress
]);
} catch (\Exception $e) {
return response()->json(['error' => $e->getMessage()], 500);
}
}
// 提现
public function withdraw(Request $request) {
$userId = $request->user_id;
$amount = $request->amount;
$destinationAddress = $request->address;
$walletType = $request->wallet_type;
try {
$txHash = $this->walletManager->transfer(
$userId,
$destinationAddress,
$walletType,
$amount
);
return response()->json([
'success' => true,
'tx_hash' => $txHash
]);
} catch (\Exception $e) {
return response()->json(['error' => $e->getMessage()], 400);
}
}
}
安全最佳实践
class WalletSecurity {
// 加密私钥
public static function encryptPrivateKey($privateKey, $password) {
$iv = openssl_random_pseudo_bytes(16);
$encrypted = openssl_encrypt(
$privateKey,
'aes-256-cbc',
hash('sha256', $password),
0,
$iv
);
return base64_encode($iv . '::' . $encrypted);
}
// 验证交易签名
public static function verifyTransaction($txHash, $signature, $publicKey) {
return openssl_verify(
$txHash,
base64_decode($signature),
$publicKey,
OPENSSL_ALGO_SHA256
);
}
// 防重放攻击
public static function generateNonce() {
return bin2hex(random_bytes(32));
}
}
完整集成示例
// 配置示例
$config = [
'wallet_type' => 'ethereum',
'infura_url' => 'https://mainnet.infura.io/v3/YOUR_PROJECT_ID',
'api_key' => 'your_api_key',
'database' => [
'host' => 'localhost',
'dbname' => 'wallet_db',
'username' => 'root',
'password' => 'password'
]
];
// 初始化钱包服务
$walletService = new EthereumWallet($config['infura_url']);
$db = new Database($config['database']);
$walletManager = new WalletManager($db, $walletService);
// 使用示例
try {
// 创建新用户钱包
$walletAddress = $walletManager->createWalletForUser(1, 'ethereum');
echo "Wallet created: " . $walletAddress;
// 检查余额
$balance = $walletManager->getBalance(1, 'ethereum');
echo "Balance: " . $balance . " ETH";
// 执行转账
$txHash = $walletManager->transfer(
1,
'0xReceiverAddress...',
'ethereum',
0.1
);
echo "Transaction: " . $txHash;
} catch (\Exception $e) {
echo "Error: " . $e->getMessage();
}
注意事项
- 安全性:保护好API密钥和私钥
- 错误处理:完善的异常处理机制
- 事务管理:确保数据一致性
- 监控告警:异常交易监控
- 合规性:遵守当地法规
根据您的具体需求(支持哪种币种、交易量大小、安全等级等),可以选择不同的集成方案,建议从小规模开始,逐步优化。