คู่มือเชื่อมต่อระบบ USDTONEPAY สำหรับนักพัฒนา — อ่านจบเชื่อมต่อได้เลย
| เครดิต > 0 | ใช้งานได้ปกติ |
| เครดิต ≤ 0 + มีรายการฝาก | บันทึกรายการแต่ ไม่ callback |
| เครดิต ≤ 0 + ดูรายการฝาก | ถูกบล็อก |
| เครดิต ≤ 0 + สั่งถอน | ถูกบล็อก |
ติดต่อผู้ดูแลระบบ คุณจะได้รับ:
| Dashboard Login | username + password | เข้า Dashboard ดูข้อมูล + เติมเครดิต |
| API Key | ak_xxxxxxxx... | ใส่ใน header ทุกครั้งที่เรียก API |
| Webhook Secret | whsec_xxxxxxxx... | ใช้ verify callback |
เข้า Dashboard → หน้า Credits → กรอกจำนวน → โอน USDT → เครดิตเพิ่มอัตโนมัติ
สมัครกระเป๋า USDT ที่คุณต้องการให้ระบบตรวจ พร้อมบอก URL ที่จะรับ callback — รองรับ 3 เครือข่าย: TRC20, ERC20, BEP20
T + 33 chars (เช่น TN3W4H6rK2ce4vX9YnFQHwKENnHjoxb3m9)0x + 40 hex chars (เช่น 0x742d35Cc6634C0532925a3b844Bc9e7595f2bD18)
# TRC20 (TRON)
curl -X POST https://your-domain.com/api/v1/wallets/register \
-H "Content-Type: application/json" \
-H "X-API-Key: ak_your_api_key" \
-d '{
"wallet_address": "TYourWalletAddress",
"network": "TRC20",
"callback_url": "https://your-site.com/webhook/deposit"
}'
# ERC20 (Ethereum) / BEP20 (BSC) — เปลี่ยน network และ address format
curl -X POST https://your-domain.com/api/v1/wallets/register \
-H "Content-Type: application/json" \
-H "X-API-Key: ak_your_api_key" \
-d '{
"wallet_address": "0x742d35Cc6634C0532925a3b844Bc9e7595f2bD18",
"network": "ERC20",
"callback_url": "https://your-site.com/webhook/deposit"
}'
const res = await fetch('https://your-domain.com/api/v1/wallets/register', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-API-Key': process.env.USDTONEPAY_API_KEY,
},
body: JSON.stringify({
wallet_address: 'TYourWalletAddress',
network: 'TRC20',
callback_url: 'https://your-site.com/webhook/deposit',
}),
});
const data = await res.json();
console.log(data.data.id); // wallet_id — เก็บไว้ใช้ตอนสั่ง scan
import requests
res = requests.post('https://your-domain.com/api/v1/wallets/register',
headers={'X-API-Key': API_KEY},
json={
'wallet_address': 'TYourWalletAddress',
'network': 'TRC20',
'callback_url': 'https://your-site.com/webhook/deposit',
})
wallet_id = res.json()['data']['id'] # เก็บไว้ใช้ตอนสั่ง scan
$ch = curl_init('https://your-domain.com/api/v1/wallets/register');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'X-API-Key: ' . $apiKey,
],
CURLOPT_POSTFIELDS => json_encode([
'wallet_address' => 'TYourWalletAddress',
'network' => 'TRC20',
'callback_url' => 'https://your-site.com/webhook/deposit',
]),
]);
$result = json_decode(curl_exec($ch), true);
$walletId = $result['data']['id']; // เก็บไว้ใช้ตอนสั่ง scan
wallet_id กลับมา — เก็บไว้ใช้ในขั้นตอนถัดไป
เมื่อลูกค้าของคุณสร้างรายการฝากในระบบของคุณ ให้ยิง API มาบอกเราว่า "เริ่มตรวจ wallet นี้ให้หน่อย"
curl -X POST https://your-domain.com/api/v1/scan \
-H "Content-Type: application/json" \
-H "X-API-Key: ak_your_api_key" \
-d '{"wallet_id": 1}'
await fetch('https://your-domain.com/api/v1/scan', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-API-Key': process.env.USDTONEPAY_API_KEY,
},
body: JSON.stringify({ wallet_id: 1 }),
});
requests.post('https://your-domain.com/api/v1/scan',
headers={'X-API-Key': API_KEY},
json={'wallet_id': 1})
$ch = curl_init('https://your-domain.com/api/v1/scan');
curl_setopt_array($ch, [
CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json', 'X-API-Key: '.$apiKey],
CURLOPT_POSTFIELDS => json_encode(['wallet_id' => 1]),
]);
curl_exec($ch);
เมื่อระบบตรวจพบรายการฝากใหม่ จะ POST มาที่ callback_url ที่คุณตั้งไว้ พร้อม signature สำหรับ verify
Callback ที่คุณจะได้รับ:
// Headers:
Content-Type: application/json
X-Signature: a1b2c3d4e5... ← HMAC-SHA256 ใช้ verify
X-Signature-Algorithm: HMAC-SHA256
// Body:
{
"event": "deposit_detected",
"gateway": "USDTONEPAY",
"timestamp": "2026-03-18T15:24:06.000Z",
"data": {
"wallet_id": 1,
"wallet_address": "TYourWallet...",
"network": "TRC20",
"tx_hash": "0411ea39ddf2...", ← ใช้ dedup ป้องกันประมวลผลซ้ำ
"from_address": "TSender...",
"to_address": "TYourWallet...",
"token_symbol": "USDT",
"amount": "100.50", ← จำนวน USDT
"block_timestamp": "...",
"detected_at": "..."
}
}
X-Signature ทุกครั้ง! ป้องกันคนอื่นปลอม callback ยิงเข้ามา
สร้าง endpoint สำหรับรับ callback พร้อม verify signature ก่อนประมวลผล
const crypto = require('crypto');
const WEBHOOK_SECRET = process.env.USDTONEPAY_WEBHOOK_SECRET;
app.post('/webhook/deposit', (req, res) => {
// 1. Verify signature
const signature = req.headers['x-signature'];
const expected = crypto
.createHmac('sha256', WEBHOOK_SECRET)
.update(JSON.stringify(req.body))
.digest('hex');
if (signature !== expected) {
return res.status(401).send('Invalid signature');
}
// 2. Dedup ด้วย tx_hash (สำคัญ!)
const { tx_hash, amount, wallet_address } = req.body.data;
if (alreadyProcessed(tx_hash)) {
return res.json({ received: true }); // ตอบ 200 แต่ไม่ทำซ้ำ
}
// 3. ประมวลผล — เช่น เติมเงินให้ลูกค้า
console.log(`Deposit: ${amount} USDT to ${wallet_address}`);
processDeposit(tx_hash, amount, wallet_address);
// 4. ตอบ 200 ทันที (ไม่ต้องรอ process เสร็จ)
res.json({ received: true });
});
import hmac, hashlib, json
from flask import Flask, request, jsonify
WEBHOOK_SECRET = os.environ['USDTONEPAY_WEBHOOK_SECRET']
@app.route('/webhook/deposit', methods=['POST'])
def handle_deposit():
# 1. Verify signature
signature = request.headers.get('X-Signature', '')
body = request.get_data(as_text=True)
expected = hmac.new(
WEBHOOK_SECRET.encode(),
body.encode(),
hashlib.sha256
).hexdigest()
if not hmac.compare_digest(signature, expected):
return jsonify(error='Invalid signature'), 401
# 2. Dedup + process
data = request.json['data']
if not already_processed(data['tx_hash']):
process_deposit(data['tx_hash'], data['amount'])
return jsonify(received=True)
<?php
$secret = getenv('USDTONEPAY_WEBHOOK_SECRET');
$body = file_get_contents('php://input');
$signature = $_SERVER['HTTP_X_SIGNATURE'] ?? '';
// 1. Verify signature
$expected = hash_hmac('sha256', $body, $secret);
if (!hash_equals($expected, $signature)) {
http_response_code(401);
die('Invalid signature');
}
// 2. Dedup + process
$payload = json_decode($body, true);
$data = $payload['data'];
if (!alreadyProcessed($data['tx_hash'])) {
processDeposit($data['tx_hash'], $data['amount']);
}
header('Content-Type: application/json');
echo json_encode(['received' => true]);
สมมติคุณเป็นเว็บ Exchange ลูกค้าต้องการฝาก USDT
| 1 | ลูกค้ากดปุ่ม "ฝากเงิน" บนเว็บของคุณ |
| 2 | ระบบของคุณแสดง wallet address ให้ลูกค้าโอน USDT เข้า |
| 3 | ระบบของคุณยิง POST /api/v1/scan บอก USDTONEPAY ว่า "เริ่มตรวจ wallet นี้ให้หน่อย" |
| 4 | ลูกค้าโอน USDT จาก exchange อื่น / กระเป๋าส่วนตัว → wallet ของคุณ |
| 5 | USDTONEPAY ตรวจพบรายการ (~5 วินาที) → callback ไปที่ URL ของคุณ |
| 6 | ระบบของคุณได้รับ callback → verify signature → เติมยอดให้ลูกค้า |
| 7 | แจ้งลูกค้า "ฝากสำเร็จ 100.50 USDT" |
ลูกค้าของคุณต้องการถอน USDT
| 0 | เตรียมการ: เติม USDT + native token (TRX/ETH/BNB ตามเครือข่าย) เข้า funding wallet ของร้าน (ได้จากผู้ดูแล) — ดูยอดคงเหลือได้จาก GET /api/v1/withdrawals/funding-wallets |
| 1 | ลูกค้ากดปุ่ม "ถอนเงิน" บนเว็บของคุณ กรอกจำนวน + ที่อยู่ปลายทาง |
| 2 | ระบบของคุณยิง POST /api/v1/withdrawals ส่ง to_address + amount (ถ้ามีหลาย funding wallet ให้ส่ง funding_wallet_id ด้วย) |
| 3 | USDTONEPAY หัก balance + fee ทันที → สถานะ: pending |
| 4 | ระบบยืนยันรายการ → โอน USDT จาก funding wallet ของร้านค้า ขึ้น blockchain |
| 5 | โอนสำเร็จ → callback ไปที่ URL ของคุณ (event: withdrawal_confirmed) |
| 6 | ระบบของคุณแจ้งลูกค้า "ถอนสำเร็จ" พร้อม tx hash |
| API | ใช้ตอนไหน | ทำบ่อยแค่ไหน |
|---|---|---|
POST /api/v1/wallets/register |
สมัคร wallet | ทำครั้งเดียวต่อ wallet |
POST /api/v1/scan |
สั่งเริ่มตรวจ | ทุกครั้งที่ลูกค้าจะฝาก |
GET /api/v1/scan/status |
เช็คสถานะ scan | ตามต้องการ |
GET /api/v1/wallets |
ดู wallet ทั้งหมด | ตามต้องการ |
GET /api/v1/deposits |
ดูรายการฝากย้อนหลัง | ตามต้องการ |
| API | ใช้ตอนไหน | ทำบ่อยแค่ไหน |
|---|---|---|
POST /api/v1/withdrawals |
สั่งถอน USDT (หักเครดิต) | ทุกครั้งที่ลูกค้าถอน |
GET /api/v1/withdrawals/funding-wallets |
ดู funding wallet + ยอด USDT/TRX | ก่อนสั่งถอน (ถ้ามีหลาย wallet) |
GET /api/v1/withdrawals |
ดูประวัติถอน + สถานะ | ตามต้องการ |
GET /api/v1/credits |
ดูยอดเครดิต + สรุป fee | ตามต้องการ |
GET /api/v1/credits/history |
ดูประวัติเครดิตทั้งหมด | ตามต้องการ |
| ☐ | ได้รับ API Key + Webhook Secret + Dashboard login จากผู้ดูแล |
| ☐ | เติมเครดิตก่อนเริ่มใช้งาน (Dashboard → Credits) |
| ☐ | ลงทะเบียน wallet สำเร็จ ได้ wallet_id |
| ☐ | สร้าง callback endpoint พร้อม verify signature |
| ☐ | ทำ dedup ด้วย tx_hash ป้องกันประมวลผลซ้ำ |
| ☐ | callback endpoint ตอบ 200 ภายใน 10 วินาที |
| ☐ | ทดสอบ scan + callback ด้วยเงินจริงจำนวนน้อย |
| ☐ | เก็บ API Key ใน environment variable (ไม่ hardcode) |
| ☐ | ใช้ HTTPS สำหรับ callback URL |
| ☐ | ตั้งระบบเตือนเมื่อเครดิตเหลือน้อย |
ฝาก: ระบบบันทึกรายการแต่ ไม่ callback ให้คุณ | ถอน: สั่งไม่ได้ | ดูรายการฝาก: ถูกบล็อก
เติมเครดิตแล้วสั่ง scan ใหม่ ระบบจะเจอรายการเดิมและ callback ให้
ระบบ retry 3 ครั้ง (timeout 10 วินาที) ถ้ายังไม่สำเร็จ สถานะ = failed
สั่ง POST /api/v1/scan ใหม่ได้เลย เริ่ม scan อีก 5 นาที
ระบบคืนเครดิตให้อัตโนมัติทั้งยอดถอนและค่า fee
ป้องกันสั่งถอนซ้ำ ถ้าส่ง key เดิม ระบบจะ return รายการเดิม ไม่สร้างใหม่
GET: 100/นาที, POST: 20/นาที ต่อ API Key
ติดต่อผู้ดูแลระบบที่ให้ API Key กับคุณ
| Network | Blockchain | สถานะ | Address Format | Gas Token | หมายเหตุ |
|---|---|---|---|---|---|
| TRC20 | TRON | ✓ รองรับ | T + 33 chars | TRX | ค่า gas ต่ำ (~1-2 TRX) |
| ERC20 | Ethereum | ✓ รองรับ | 0x + 40 hex | ETH | ค่า gas สูง (ขึ้นกับ network congestion) — requires API key setup |
| BEP20 | BNB Smart Chain | ✓ รองรับ | 0x + 40 hex | BNB | ค่า gas ปานกลาง (~0.0005 BNB) — requires API key setup |