Integration Guide

คู่มือเชื่อมต่อระบบ USDTONEPAY สำหรับนักพัฒนา — อ่านจบเชื่อมต่อได้เลย

สำคัญ: ระบบเครดิต
ทุกการใช้งานต้องมีเครดิตเพียงพอ เติมเครดิตได้ที่ Dashboard → Credits

เครดิต > 0ใช้งานได้ปกติ
เครดิต ≤ 0 + มีรายการฝากบันทึกรายการแต่ ไม่ callback
เครดิต ≤ 0 + ดูรายการฝากถูกบล็อก
เครดิต ≤ 0 + สั่งถอนถูกบล็อก

ภาพรวมการทำงาน

ลูกค้าของคุณ
ระบบของคุณ
USDTONEPAY
Blockchain (TRC20 / ERC20 / BEP20)
↓ เมื่อพบรายการฝาก ↓
Blockchain (TRC20 / ERC20 / BEP20)
USDTONEPAY ตรวจพบ
Callback ไปหาคุณ
แจ้งลูกค้า
สรุปง่ายๆ: เติมเครดิต → สมัคร wallet → ลูกค้าจะฝาก คุณสั่ง scan → มีเงินเข้า เราแจ้งคุณ (หักเครดิต) → สั่งถอนผ่าน API (หักเครดิต)

ขั้นตอนการเชื่อมต่อ

1

รับ API Key + เข้า Dashboard

ติดต่อผู้ดูแลระบบ คุณจะได้รับ:

Dashboard Loginusername + passwordเข้า Dashboard ดูข้อมูล + เติมเครดิต
API Keyak_xxxxxxxx...ใส่ใน header ทุกครั้งที่เรียก API
Webhook Secretwhsec_xxxxxxxx...ใช้ verify callback
เก็บ key เหล่านี้ให้ดี! อย่าเอาไปฝังใน frontend หรือ commit ลง git ให้เก็บใน environment variable เท่านั้น
1.5

เติมเครดิต (ทำก่อนใช้งาน)

เข้า Dashboard → หน้า Credits → กรอกจำนวน → โอน USDT → เครดิตเพิ่มอัตโนมัติ

ทำไมต้องเติม? ทุกรายการฝากและถอนจะหักเครดิตเป็นค่าบริการ ถ้าเครดิตหมด ระบบจะหยุด callback และบล็อกการถอน
2

ลงทะเบียน Wallet (ทำครั้งเดียวต่อ wallet)

สมัครกระเป๋า USDT ที่คุณต้องการให้ระบบตรวจ พร้อมบอก URL ที่จะรับ callback — รองรับ 3 เครือข่าย: TRC20, ERC20, BEP20

รูปแบบ Address:
TRC20: T + 33 chars (เช่น TN3W4H6rK2ce4vX9YnFQHwKENnHjoxb3m9)
ERC20 / BEP20: 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 กลับมา — เก็บไว้ใช้ในขั้นตอนถัดไป
3

สั่ง Scan เมื่อลูกค้าจะฝากเงิน

เมื่อลูกค้าของคุณสร้างรายการฝากในระบบของคุณ ให้ยิง 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);
ระบบจะ: ตรวจ blockchain ทุก 5 วินาที → พอเจอรายการใหม่ → callback ไปหาคุณ → หยุดอัตโนมัติ
ถ้าไม่เจอรายการภายใน 5 นาที → หยุดอัตโนมัติ (สั่ง scan ใหม่ได้)
4

รับ Callback เมื่อมีรายการฝาก

เมื่อระบบตรวจพบรายการฝากใหม่ จะ 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 ยิงเข้ามา
5

Verify Signature + ประมวลผล

สร้าง 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]);

ตัวอย่าง Flow ฝากเงิน

สมมติคุณเป็นเว็บ Exchange ลูกค้าต้องการฝาก USDT

1ลูกค้ากดปุ่ม "ฝากเงิน" บนเว็บของคุณ
2ระบบของคุณแสดง wallet address ให้ลูกค้าโอน USDT เข้า
3ระบบของคุณยิง POST /api/v1/scan บอก USDTONEPAY ว่า "เริ่มตรวจ wallet นี้ให้หน่อย"
4ลูกค้าโอน USDT จาก exchange อื่น / กระเป๋าส่วนตัว → wallet ของคุณ
5USDTONEPAY ตรวจพบรายการ (~5 วินาที) → callback ไปที่ URL ของคุณ
6ระบบของคุณได้รับ callback → verify signature → เติมยอดให้ลูกค้า
7แจ้งลูกค้า "ฝากสำเร็จ 100.50 USDT"

ตัวอย่าง Flow ถอนเงิน

ลูกค้าของคุณต้องการถอน 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 ด้วย)
3USDTONEPAY หัก balance + fee ทันที → สถานะ: pending
4ระบบยืนยันรายการ → โอน USDT จาก funding wallet ของร้านค้า ขึ้น blockchain
5โอนสำเร็จ → callback ไปที่ URL ของคุณ (event: withdrawal_confirmed)
6ระบบของคุณแจ้งลูกค้า "ถอนสำเร็จ" พร้อม tx hash
ถ้าถูก reject หรือโอนล้มเหลว: ระบบคืน balance + fee ให้อัตโนมัติ ไม่เสียเงิน

สรุป API ที่ใช้

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 สำหรับถอนเงิน + เครดิต

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 ดูประวัติเครดิตทั้งหมด ตามต้องการ

Checklist ก่อน Go Live

ได้รับ 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 ให้

ถ้า callback ล้มเหลวจะเป็นยังไง?

ระบบ retry 3 ครั้ง (timeout 10 วินาที) ถ้ายังไม่สำเร็จ สถานะ = failed

scan หมดเวลาแล้วแต่ลูกค้ายังไม่โอน?

สั่ง POST /api/v1/scan ใหม่ได้เลย เริ่ม scan อีก 5 นาที

ถอนแล้วถูก reject/fail?

ระบบคืนเครดิตให้อัตโนมัติทั้งยอดถอนและค่า fee

idempotency_key คืออะไร?

ป้องกันสั่งถอนซ้ำ ถ้าส่ง key เดิม ระบบจะ return รายการเดิม ไม่สร้างใหม่

Rate limit เท่าไหร่?

GET: 100/นาที, POST: 20/นาที ต่อ API Key

มีปัญหาหรือต้องการ support?

ติดต่อผู้ดูแลระบบที่ให้ API Key กับคุณ

เครือข่ายที่รองรับ

NetworkBlockchainสถานะAddress FormatGas 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
ค่า gas แต่ละเครือข่ายต่างกัน: TRC20 มีค่า gas ต่ำที่สุด, BEP20 ปานกลาง, ERC20 สูงที่สุด (ผันผวนตาม network congestion) — กรุณาเติม native token ให้เพียงพอใน funding wallet