适用场景:虚拟商品、游戏、数字服务等独立站
支持币种:USDT、BTC、ETH 等主流加密货币
技术栈:WooCommerce + PHP + 区块链 API
WooCommerce 支付网关插件配置
为什么需要加密货币支付?
帮几个做虚拟商品的客户做支付对接,发现一个共同痛点:
传统支付渠道容易封号。
-
• PayPal:虚拟商品容易被投诉,账号说封就封
-
• Stripe:高风险行业直接拒之门外
-
• 信用卡:拒付率高,处理麻烦
而加密货币支付完美解决了这些问题:
| 对比项 | 传统支付 | 加密货币 | | --- | --- | --- | | 拒付风险 | 高(1-3%) | 无(链上交易不可逆) | | 封号风险 | 高(虚拟商品/高风险行业) | 无(去中心化) | | 手续费 | 2-5% | 0.5-1% | | 到账时间 | 1-7 天 | 10-60 分钟 | | 跨境限制 | 有(外汇管制) | 无 |
主流加密货币支付方案
方案一:第三方加密货币支付网关(推荐新手)
代表服务:
-
• CoinPayments
-
• BitPay
-
• Coinbase Commerce
-
• NOWPayments
优点:
-
• ✅ 接入简单,有现成 API
-
• ✅ 自动兑换法币(可选)
-
• ✅ 支持多种币种
-
• ✅ 有 WooCommerce 插件(部分免费)
缺点:
-
• ❌ 手续费较高(1-2%)
-
• ❌ 需要 KYC 认证
-
• ❌ 可能冻结资金
适合:刚起步、交易量小的商家
方案二:自建支付节点(推荐有技术能力的)
原理:
-
• 自己运行区块链节点(或使用 API 服务)
-
• 监听充值地址的入账交易
-
• 自动确认订单
优点:
-
• ✅ 手续费极低(只有链上 Gas 费)
-
• ✅ 资金自己控制,无冻结风险
-
• ✅ 无需 KYC
-
• ✅ 可定制功能
缺点:
-
• ❌ 技术门槛高
-
• ❌ 需要自己处理安全
-
• ❌ 需要监控节点稳定性
适合:有一定技术能力、交易量大的商家
方案三:混合方案(折中)
-
• 使用第三方 API 处理支付
-
• 资金直接到自己钱包(不经过平台)
-
• 只付少量 API 调用费
代表服务:
-
• Cryptomus
-
• Plisio
-
• CoinGate
这是我最推荐的方案,平衡了简单性和安全性。
技术实现:以 USDT-TRC20 为例
我帮客户开发过一个加密货币支付插件,支持 USDT-TRC20,记录一下核心实现。
插件结构
woo-crypto-gateway/
├── woo-crypto-gateway.php # 主插件
├── includes/
│ ├── class-crypto-api.php # 区块链 API 封装
│ ├── class-wallet.php # 钱包管理
│ └── class-callback.php # 回调处理
├── assets/
│ └── crypto-icons/ # 币种图标
└── templates/
└── payment-page.php # 支付页面
核心代码
1. 创建支付订单
public function process_payment($order_id) {
$order = wc_get_order($order_id);
$amount = $order->get_total();
// 调用 API 创建充值地址
$crypto_api = new Crypto_API($this->api_key);
$result = $crypto_api->create_deposit(array(
'currency' => 'USDT',
'network' => 'TRC20',
'order_id' => $order->get_order_number(),
'amount' => $amount,
'callback_url' => WC()->api_request_url('crypto_callback')
));
if ($result['success']) {
// 保存充值地址
$order->update_meta_data('_crypto_deposit_address', $result['address']);
$order->update_meta_data('_crypto_expected_amount', $result['amount']);
$order->update_status('pending', '等待加密货币支付');
$order->save();
// 重定向到支付页面
return array(
'result' => 'success',
'redirect' => add_query_arg('crypto_payment', $result['deposit_id'],
$order->get_checkout_payment_url(true))
);
}
}
2. 显示支付页面
// 支付页面模板
function crypto_payment_page() {
global $woocommerce;
$deposit_id = $_GET['crypto_payment'];
$orders = wc_get_orders(array(
'meta_key' => '_crypto_deposit_id',
'meta_value' => $deposit_id
));
if (empty($orders)) return;
$order = $orders[0];
$deposit_address = $order->get_meta('_crypto_deposit_address');
$expected_amount = $order->get_meta('_crypto_expected_amount');
?>
<div class="crypto-payment-page">
<h2>加密货币支付</h2>
<div class="payment-info">
<p>请向以下地址转账:</p>
<div class="qr-code">
<?php echo QRCode::render($deposit_address); ?>
</div>
<div class="address-box">
<label>充值地址:</label>
<input type="text" value="<?php echo $deposit_address; ?>" readonly>
<button onclick="copyAddress()">复制</button>
</div>
<div class="amount-box">
<label>转账金额:</label>
<strong><?php echo $expected_amount; ?> USDT</strong>
</div>
<div class="network-info">
<p>⚠️ 请确保使用 <strong>TRC20</strong> 网络转账</p>
<p>⚠️ 转账金额必须精确匹配,否则可能无法自动到账</p>
</div>
</div>
<div class="payment-status" id="payment-status">
<p>等待支付中...</p>
<div class="spinner"></div>
</div>
</div>
<script>
// 轮询支付状态
setInterval(function() {
fetch('/wc-api/check_crypto_payment?deposit_id=<?php echo $deposit_id; ?>')
.then(res => res.json())
.then(data => {
if (data.status === 'completed') {
window.location.href = '<?php echo $this->get_return_url($order); ?>';
}
});
}, 5000);
</script>
<?php
}
3. 监听支付回调
add_action('woocommerce_api_crypto_callback', 'handle_crypto_callback');
function handle_crypto_callback() {
// 验证 API 签名(防止伪造回调)
$signature = $_SERVER['HTTP_X_SIGNATURE'];
$data = file_get_contents('php://input');
if (!Crypto_API::verify_signature($data, $signature, $api_secret)) {
http_response_code(403);
exit('Invalid signature');
}
$callback_data = json_decode($data, true);
// 查找订单
$orders = wc_get_orders(array(
'meta_key' => '_crypto_deposit_address',
'meta_value' => $callback_data['address']
));
if (empty($orders)) {
http_response_code(404);
exit('Order not found');
}
$order = $orders[0];
// 验证金额
$expected_amount = floatval($order->get_meta('_crypto_expected_amount'));
$received_amount = floatval($callback_data['amount']);
if ($received_amount < $expected_amount * 0.95) {
// 金额不足(允许 5% 误差)
$order->add_order_note(sprintf(
'加密货币支付金额不足:期望 %s, 实际 %s',
$expected_amount,
$received_amount
));
http_response_code(200);
exit('Amount insufficient');
}
// 确认数检查(防止双花攻击)
if ($callback_data['confirmations'] < 3) {
http_response_code(200);
exit('Waiting for confirmations');
}
// 支付成功
$order->payment_complete($callback_data['txid']);
$order->add_order_note(sprintf(
'加密货币支付成功:%s USDT, 交易哈希:%s',
$received_amount,
$callback_data['txid']
));
http_response_code(200);
exit('OK');
}
安全注意事项
1. 地址验证
确保用户转账到正确的地址和网络:
function validate_address($address, $network) {
switch ($network) {
case 'TRC20':
// TRC20 地址以 T 开头,长度 34 位
return preg_match('/^T[A-Za-z1-9]{33}$/', $address);
case 'ERC20':
// ERC20 地址以 0x 开头,长度 42 位
return preg_match('/^0x[A-Fa-f0-9]{40}$/', $address);
case 'BTC':
// BTC 地址验证(支持 Legacy 和 SegWit)
return preg_match('/^[13][a-km-zA-HJ-NP-Z1-9]{25,34}$/', $address) ||
preg_match('/^bc1[a-z0-9]{39,59}$/', $address);
default:
return false;
}
}
2. 金额精确匹配
加密货币转账必须精确匹配金额(或设置合理误差范围),否则无法自动确认订单。
建议:
-
• 显示精确金额(如:100.00 USDT)
-
• 允许 5% 误差(处理手续费问题)
-
• 金额不足时提示用户补足
3. 确认数检查
不同币种需要的确认数不同:
| 币种 | 建议确认数 | 大约时间 | | --- | --- | --- | | BTC | 3 | 30 分钟 | | ETH | 12 | 3 分钟 | | USDT-TRC20 | 1 | 1 分钟 | | USDT-ERC20 | 12 | 3 分钟 |
4. 私钥安全
如果自建钱包:
-
• ❌ 永远不要把私钥存在代码里
-
• ✅ 使用环境变量或加密存储
-
• ✅ 使用冷钱包存储大部分资金
-
• ✅ 定期转移资金到安全地址
推荐服务商
对于新手(第三方网关)
| 服务商 | 手续费 | 支持币种 | 特点 | | --- | --- | --- | --- | | CoinPayments | 0.5% | 2000+ | 老牌,支持币种最多 | | NOWPayments | 0.5% | 100+ | 无需 KYC,API 友好 | | Cryptomus | 0.4% | 50+ | 手续费低,支持自动兑换 |
对于进阶(API 服务)
| 服务商 | 特点 | 适合 | | --- | --- | --- | | Block.io | 多币种钱包 API | 自建支付系统 | | Tatum | 区块链开发平台 | 需要定制功能 | | GetBlock | 节点 RPC 服务 | 自己运行节点 |
成本与收益
开发成本
-
• 定制开发:¥1000-2000(一次性)
-
• 或使用现成插件:$0-200/月
使用成本
| 方案 | 费用 | 说明 | | --- | --- | --- | | 第三方网关 | 0.5-1%/笔 | 按交易量收费 | | API 服务 | $0-50/月 | 固定费用 | | 自建节点 | Gas 费 | 只有链上手续费 |
收益对比
假设月交易额 $50,000:
| 支付渠道 | 手续费 | 月成本 | 年成本 | | --- | --- | --- | --- | | PayPal | 3.9% + 2,250 | 0.3 | 21,000 | | 加密货币(自建) | 0.5% | 3,000 | | 年节省 | - | - | $18,000-24,000 |
常见问题
Q1: 加密货币支付合法吗?
取决于你所在的国家/地区。中国大陆禁止加密货币交易,但很多国家是合法的。建议咨询当地律师。
Q2: 价格波动怎么办?
-
• 方案 1:使用稳定币(USDT、USDC)
-
• 方案 2:设置自动兑换(收到 BTC 立即换成 USDT)
-
• 方案 3:实时定价(按支付时汇率计算)
Q3: 客户不会用加密货币怎么办?
提供详细的支付教程,包括:
-
• 如何注册交易所账号
-
• 如何购买 USDT
-
• 如何提现到钱包
-
• 如何扫码支付
Q4: 税务怎么处理?
加密货币交易在很多国家需要报税。建议:
-
• 保留所有交易记录
-
• 使用会计软件跟踪
-
• 咨询专业会计师
总结
加密货币支付对于特定行业(虚拟商品、游戏、博彩、数字服务)来说,是一个值得考虑的支付方案。
优势:
-
• ✅ 无拒付风险
-
• ✅ 无封号风险
-
• ✅ 手续费低
-
• ✅ 跨境无限制
劣势:
-
• ❌ 用户门槛高
-
• ❌ 价格波动(非稳定币)
-
• ❌ 监管不确定性
建议:
-
• 新手:使用第三方网关(NOWPayments、Cryptomus)
-
• 进阶:使用 API 服务 + 自己的钱包
-
• 高级:自建节点 + 冷钱包存储
关于作者:专注 WooCommerce 支付网关开发,已交付 40+ 个支付渠道插件,包括多个加密货币支付方案。
示例代码已开源:GitHub 仓库包含 4 个完整支付网关插件,可免费下载使用。