本文目录导读:

- 方法一:使用
web3.php库(最接近 Web3.js 体验) - 方法二:直接通过 HTTP 调用节点 JSON-RPC 接口
- 方法三:使用云端服务(简化 API)
- 方法四:使用区块链 SDK(如 Tatum SDK)
- 关键安全建议
- 典型架构模式
- 总结推荐
在 PHP 项目中集成 Web3 功能(如与以太坊、Polygon 等区块链交互)通常涉及以下几个核心需求:发送交易、查询链上数据、验证签名、与智能合约交互等。
由于 PHP 本身并不是区块链原生的开发语言(相比 JavaScript/Node.js),因此实现 Web3 集成主要依赖第三方库、HTTP-RPC 调用或外部服务,以下是几种主流且实用的实现方式:
使用 web3.php 库(最接近 Web3.js 体验)
这是目前 PHP 生态中最流行的 Web3 库,支持以太坊 JSON-RPC、合约交互、ABI 编码/解码等。
安装:
composer require web3p/web3.php
基本使用示例(查询以太坊余额):
<?php
require 'vendor/autoload.php';
use Web3\Web3;
use Web3\Providers\HttpProvider;
use Web3\RequestManagers\HttpRequestManager;
// 连接节点(Infura / Alchemy / 本地节点)
$web3 = new Web3(new HttpProvider(new HttpRequestManager('https://mainnet.infura.io/v3/YOUR_INFURA_KEY', 10)));
// 查询账户余额
$account = '0x...你的地址...';
$web3->eth->getBalance($account, function ($err, $balance) {
if ($err !== null) {
echo 'Error: ' . $err->getMessage();
return;
}
// 余额单位是 Wei,转换为 ETH
echo 'Balance: ' . $balance->toString() . ' Wei' . PHP_EOL;
// 使用库内置工具转换
$eth = \Web3\Utils::fromWei($balance, 'ether');
echo 'Balance: ' . $eth . ' ETH' . PHP_EOL;
});
发送交易:
use Web3\Transaction;
// 创建原始交易
$transaction = new Transaction([
'nonce' => '0x1',
'from' => '0xYourAddress',
'to' => '0xRecipient',
'gas' => '0x76c0',
'gasPrice' => '0x9184e72a000',
'value' => '0x9184e72a',
'data' => '0x',
'chainId' => 1 // 主网
]);
// 需要私钥签名(务必安全保管私钥)
$signedTransaction = $transaction->sign('your-private-key-hex');
$web3->eth->sendRawTransaction('0x' . $signedTransaction, function ($err, $txHash) {
if ($err) {
echo 'Error sending tx: ' . $err->getMessage();
} else {
echo 'Tx hash: ' . $txHash . PHP_EOL;
}
});
与智能合约交互(调用 read/write 方法):
use Web3\Contract;
$contract = new Contract($web3->provider, '合约ABI (JSON)');
$contract->at('0x合约地址')->call('balanceOf', $account, function ($err, $result) {
// 处理结果
});
注意:
web3.php是异步驱动的(基于 Guzzle + ReactPHP),所有回调函数都是异步执行,复杂业务逻辑中需要管理好并发和错误处理。- 推荐结合 ReactPHP event loop 来管理和等待异步结果。
直接通过 HTTP 调用节点 JSON-RPC 接口
如果不想引入复杂库,或者只需要少量接口,可以直接用 cURL 调用节点 API。
<?php
function rpcCall($method, $params) {
$curl = curl_init();
$payload = json_encode([
'jsonrpc' => '2.0',
'method' => $method,
'params' => $params,
'id' => 1
]);
curl_setopt_array($curl, [
CURLOPT_URL => 'https://mainnet.infura.io/v3/YOUR_KEY',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => $payload
]);
$result = curl_exec($curl);
curl_close($curl);
return json_decode($result, true);
}
// 查询最新区块号
$blockNumber = rpcCall('eth_blockNumber', []);
echo 'Current Block: ' . hexdec($blockNumber['result']) . PHP_EOL;
// 查询余额
$balance = rpcCall('eth_getBalance', ['0x地址', 'latest']);
echo 'Balance (Wei): ' . hexdec($balance['result']);
这种方式适合:
- 对性能要求不高的查询操作
- 不想引入 Composer 依赖的场景
- 需要自定义异常处理和连接池
使用云端服务(简化 API)
如果不想管理节点、签名逻辑或 Gas 估算,可以使用 CloudFlare Web3、Moralis、Alchemy 等提供的 “托管 API” + HTTP 接口。
示例:通过 Moralis 查询代币元数据
composer require moralisweb3/moralis-php-sdk
use Moralis\Moralis;
$moralis = new Moralis([
'apiKey' => 'YOUR_MORALIS_API_KEY'
]);
// 获取代币余额
$result = $moralis->token->getTokenBalances([
'chain' => 'eth',
'address' => '0x用户地址'
]);
print_r($result);
这种方式的优点:
- 不需要管理节点私钥(API 只读或通过安全后端签名)
- 自带缓存、自动重试、高级过滤
- 适合前端 / 后端快速集成
使用区块链 SDK(如 Tatum SDK)
Tatum 提供了 PHP SDK,支持 40+ 条链的简单集成。
composer require tatum/sdk
use Tatum\Sdk;
$sdk = new Sdk('YOUR_API_KEY');
$sdk->mainnet()->nft()->deployNft(
'0x钱包地址',
'My NFT',
'MNFT',
'https://my-metadata-url.com/{id}'
);
适合需要快速部署 NFT、发送批量交易、多链操作的项目。
关键安全建议
-
私钥绝对不能出现在 PHP 代码中
- 使用环境变量
.env或专用密钥管理服务(如 AWS KMS、HashiCorp Vault)。 - 交易签名最好在隔离的签名机或使用硬件钱包(如 Ledger、Trezor)通过 EIP-3030 等标准在后端签名。
- 使用环境变量
-
Gas 估算与失败处理
- 使用
eth_estimateGas估算 Gas 限制(RLP 编码时避免 Gas 不足导致交易失败)。 - 添加交易收据轮询逻辑,确认交易是否成功(
eth_getTransactionReceipt)。
- 使用
-
网络超时与重试
- RPC 节点可能出现限流,需要实现超时 + 指数退避重试策略。
- 考虑使用多个备用节点(如主 Infura + 备用 Alchemy)。
-
交易并发与 nonce 管理
如果多个 PHP 进程同时发送交易,需使用数据库/Redis 原子自增 nonce,避免 nonce 冲突。
典型架构模式
User 请求 --> PHP 后端 --> 1. 构建交易 (使用 web3.php)
2. 将交易数据发送到签名服务 (独立进程)
3. 签名服务验证权限后使用私钥签名
4. PHP 后端发送签名的 RAW TX 到节点
5. 返回 TX Hash 给用户
6. 后台异步轮询收据确认交易
总结推荐
| 场景 | 推荐方案 |
|---|---|
| 查询余额/ERC20 代币 | 直接 JSON-RPC + cURL |
| 复杂合约交互 (DeFi/Staking) | web3.php |
| 快速开发 / 多链 / NFT | Tatum / Moralis SDK |
| 企业内部高安全交易 | JSON-RPC + 外部签名机 |
| 简单读写 + 不想管理节点 | Infura Cloud API + 直接 HTTP 调用 |
最终建议:如果项目刚起步,优先选择 Moralis 或 Alchemy 的托管 API 配合简单 cURL 调用,避免异步回调的复杂性;随着业务深入,再迁移到 web3.php 实现更底层的签名和合约调用。