你想在网站、SaaS 或 Telegram Bot 里接受 USDT,但不想搞区块链节点、管理钱包、自己造收银台。
这篇教程帮你从零到一跑通一个 USDT 支付流程 --- 5 分钟 ,用 IronixPay,一个 TRON USDT 支付网关。
最终效果:用户点击「支付」→ 看到收银台(地址 + 二维码 + 倒计时)→ 转账 USDT → 你的服务器收到 Webhook 到账通知。
你需要什么
没了。不需要区块链节点,不需要钱包,不需要智能合约。
第 1 步:拿到 API Key
- 登录 IronixPay 控制台
- 侧边栏 → 密钥管理
- 点击 创建密钥 → 复制(以
sk_test_开头)
💡 开发阶段用
sk_test_密钥 --- 走 TRON Nile 测试网(免费测试 USDT)。上线后换成sk_live_即可。
第 2 步:后端创建 Checkout Session
你的后端调用 API 创建一个支付会话,IronixPay 会生成唯一的收款地址和收银台链接。
javascript
// server.js
const express = require('express');
const app = express();
app.use(express.json());
const IRONIXPAY_SECRET = process.env.IRONIXPAY_SECRET_KEY; // sk_test_...
app.post('/create-checkout', async (req, res) => {
const response = await fetch(
'https://sandbox.ironixpay.com/v1/checkout/sessions',
{
method: 'POST',
headers: {
Authorization: `Bearer ${IRONIXPAY_SECRET}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
amount: 10000000, // 10.00 USDT(微单位:1 USDT = 1,000,000)
currency: 'USDT',
network: 'TRON',
success_url: 'https://yoursite.com/success',
cancel_url: 'https://yoursite.com/cancel',
client_reference_id: req.body.orderId,
}),
}
);
const session = await response.json();
res.json({ id: session.id, url: session.url });
});
app.listen(3000, () => console.log('Server running on :3000'));
响应里有两个关键字段:
url--- 托管的收银台页面(带二维码和收款地址)id--- 会话 ID(形如cs_abc123...),用于后续追踪
⚠️ 永远不要在前端代码里暴露
sk_test_或sk_live_密钥。始终从后端创建会话。
第 3 步:引导用户去收银台
最简单的方式 --- 直接跳转:
javascript
document.getElementById('pay-btn').addEventListener('click', async () => {
const res = await fetch('/create-checkout', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ orderId: 'order_001' }),
});
const { url } = await res.json();
window.location.href = url; // → 跳转到 IronixPay 收银台
});
html
<button id="pay-btn">支付 10 USDT</button>
用户会看到一个收银台页面 --- 金额、TRON 收款地址、二维码和 30 分钟倒计时。
💡 想把收银台嵌入你自己的页面?用
@ironix-pay/sdk--- 参考 嵌入模式指南。
第 4 步:接收 Webhook 到账通知
用户付款后,IronixPay 检测到链上交易,向你的服务器推送 session.completed Webhook:
javascript
const crypto = require('crypto');
const WEBHOOK_SECRET = process.env.IRONIXPAY_WEBHOOK_SECRET; // whsec_...
app.post('/webhook', express.raw({ type: 'application/json' }), (req, res) => {
const signature = req.headers['x-signature'];
const timestamp = req.headers['x-timestamp'];
const payload = req.body.toString();
// 1. 验证签名
const message = `${timestamp}.${payload}`;
const expected = crypto
.createHmac('sha256', WEBHOOK_SECRET)
.update(message)
.digest('hex');
if (!crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected))) {
return res.status(401).send('签名无效');
}
// 2. 检查时间戳(5 分钟窗口,防重放攻击)
const now = Math.floor(Date.now() / 1000);
if (Math.abs(now - parseInt(timestamp)) > 300) {
return res.status(401).send('时间戳过期');
}
// 3. 处理事件
const event = JSON.parse(payload);
if (event.event_type === 'session.completed') {
const { session_id, amount_received } = event.data;
console.log(`✅ 收到付款!会话: ${session_id},金额: ${amount_received / 1_000_000} USDT`);
// TODO: 在你的数据库中标记订单为已支付
}
res.status(200).send('OK');
});
💡 在控制台 开发者 → 回调管理 中填写你的端点 URL,复制签名密钥(
whsec_...)。
完整可运行示例
以下是完整的 server.js --- 直接复制即可运行:
javascript
require('dotenv').config();
const express = require('express');
const crypto = require('crypto');
const app = express();
const SECRET_KEY = process.env.IRONIXPAY_SECRET_KEY;
const WEBHOOK_SECRET = process.env.IRONIXPAY_WEBHOOK_SECRET;
const API_BASE = 'https://sandbox.ironixpay.com';
app.use('/public', express.static('public'));
app.use(express.json());
app.post('/create-checkout', async (req, res) => {
const response = await fetch(`${API_BASE}/v1/checkout/sessions`, {
method: 'POST',
headers: {
Authorization: `Bearer ${SECRET_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
amount: req.body.amount || 10000000,
currency: 'USDT',
network: 'TRON',
success_url: `http://localhost:3000/public/success.html`,
cancel_url: `http://localhost:3000/public/cancel.html`,
client_reference_id: req.body.orderId,
}),
});
const session = await response.json();
res.json({ id: session.id, url: session.url });
});
app.post('/webhook', express.raw({ type: 'application/json' }), (req, res) => {
const sig = req.headers['x-signature'];
const ts = req.headers['x-timestamp'];
const body = req.body.toString();
const expected = crypto.createHmac('sha256', WEBHOOK_SECRET)
.update(`${ts}.${body}`).digest('hex');
if (!crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected))) {
return res.status(401).send('签名无效');
}
const event = JSON.parse(body);
console.log(`[Webhook] ${event.event_type}:`, JSON.stringify(event.data, null, 2));
if (event.event_type === 'session.completed') {
console.log(`💰 订单已支付: ${event.data.amount_received / 1e6} USDT`);
}
res.sendStatus(200);
});
app.listen(3000, () => console.log('🚀 http://localhost:3000'));
bash
# .env
IRONIXPAY_SECRET_KEY=sk_test_你的密钥
IRONIXPAY_WEBHOOK_SECRET=whsec_你的签名密钥
bash
npm install express dotenv
node server.js
Telegram Bot?一样的 API
javascript
bot.onText(/\/pay/, async (msg) => {
const res = await fetch(`${API_BASE}/v1/checkout/sessions`, {
method: 'POST',
headers: {
Authorization: `Bearer ${SECRET_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
amount: 5000000,
currency: 'USDT',
network: 'TRON',
success_url: 'https://t.me/your_bot',
cancel_url: 'https://t.me/your_bot',
}),
});
const session = await res.json();
bot.sendMessage(msg.chat.id, '💳 支付 5 USDT 完成订单:', {
reply_markup: {
inline_keyboard: [[{ text: '🔗 立即支付', url: session.url }]],
},
});
});
背后发生了什么
markdown
你的应用创建会话 → IronixPay 生成唯一 TRON 收款地址
↓
用户转账 USDT → 链上交易被检测到
↓
IronixPay 确认到账 → Webhook 推送到你的服务器
↓
USDT 自动归集到你的归集钱包 💰
你不需要碰私钥,不需要跑区块链节点。IronixPay 帮你搞定 HD 钱包派生、交易监听和资金归集。
了解更多
- 📖 API 参考文档 --- 所有接口都有文档
- 🧪 测试指南 --- 沙盒环境使用说明
- 🎨 嵌入模式 (SDK) --- 把收银台嵌入你的页面
- 🕹️ 在线体验 --- 亲自试试收银台效果
由 IronixPay 出品 --- 面向开发者的 USDT 支付网关。