Sign in
การชำระเงินและการถอน/กระเป๋าเงินคงที่

กระเป๋าเงินคงที่

ที่อยู่ฝากเงินถาวรที่ผูกกับคำสั่งซื้อหรือผู้ใช้ที่ระบุ เหมาะสำหรับการชำระเงินแบบเป็นรอบและระยะยาว

กระเป๋าเงินคงที่คือที่อยู่ถาวรสำหรับรับการชำระเงินด้วยคริปโตเคอร์เรนซี ผูกกับ order_id ที่ระบุ และไม่ซ้ำกันด้วยการรวม project_id + order_id + currency + network

ใช้กระเป๋าเงินคงที่สำหรับ:

  • การฝากเงินซ้ำจากผู้ใช้คนเดิม
  • ที่อยู่ชำระเงินระยะยาวที่แสดงบนโปรไฟล์ผู้ใช้
  • ฟลูฝากเงินปริมาณสูงที่คุณต้องการที่อยู่คงที่ต่อผู้ใช้

สร้างกระเป๋าเงินคงที่

POST/v1/static-wallet

พารามิเตอร์ของคำขอ

FieldTypeRequiredDescription
currencystringyesคริปโตเคอร์เรนซี (USDT, BTC, ETH ฯลฯ)
networkstringyesรหัสเครือข่าย
order_idstringyesorder/user ID ของคุณ (สูงสุด 255 ตัวอักษร)
labelstringnoป้ายกำกับกระเป๋า (สูงสุด 255 ตัวอักษร)
url_callbackstringyesURL สำหรับการแจ้งเตือน Webhook
invite_codestringnoโค้ดผู้แนะนำ

ตัวอย่างคำขอ

JSON
{
  "currency": "USDT",
  "network": "TRX-TRC20",
  "order_id": "USER-123",
  "label": "User deposit #123",
  "url_callback": "https://your-site.com/webhook/static"
}

ตัวอย่างการตอบกลับ

JSON
{
  "state": 0,
  "result": {
    "uuid": "019b2265-34d8-7001-a230-8f97de90d481",
    "address": "TXYZabc123...",
    "currency": "USDT",
    "network": "TRX-TRC20",
    "label": "User deposit #123",
    "order_id": "USER-123",
    "status": "active",
    "url": "https://go.2328.io/static/019b2265-34d8-7001-a230-8f97de90d481",
    "created_at": "2026-01-20T12:00:00Z",
    "qr": "data:image/png;base64,iVBORw0..."
  }
}

ข้อมูลกระเป๋า

ดึงข้อมูลกระเป๋าเงินคงที่ด้วย uuid หรือ address

POST/v1/static-wallet/info

พารามิเตอร์ของคำขอ

FieldTypeRequiredDescription
uuidstringyes*UUID ของกระเป๋าเงินคงที่
addressstringyes*ที่อยู่กระเป๋าบล็อกเชน

ต้องระบุ uuid หรือ address อย่างน้อยหนึ่งค่า

ตัวอย่างการตอบกลับ

JSON
{
  "state": 0,
  "result": {
    "uuid": "019b2265-34d8-7001-a230-8f97de90d481",
    "address": "TXYZabc123...",
    "currency": "USDT",
    "network": "TRX-TRC20",
    "status": "active",
    "total_received": "1250.50",
    "transactions_count": 3,
    "created_at": "2026-01-20T12:00:00Z",
    "qr": "data:image/png;base64,iVBORw0..."
  }
}
  • total_received — ผลรวมของยอดฝากทั้งหมดที่กระเป๋านี้ได้รับ ในหน่วย currency
  • transactions_count — จำนวนรายการฝากที่ได้รับมาแล้ว
  • qr — data URI ของ QR ที่เข้ารหัส base64 ของที่อยู่ฝากเงิน (มีอยู่เสมอสำหรับกระเป๋าเงินคงที่ เนื่องจากที่อยู่ถูกกำหนดตอนสร้าง)

รายการกระเป๋า

POST/v1/static-wallet/list

พารามิเตอร์ของคำขอ

FieldTypeRequiredDescription
statusstringnoกรองตามสถานะ (active, inactive)
currencystringnoกรองตามสกุลเงิน
networkstringnoกรองตามเครือข่าย
order_idstringnoกรองตาม order_id
pageintnoหมายเลขหน้า (ค่าเริ่มต้น: 1)
per_pageintnoจำนวนรายการต่อหน้า (ค่าเริ่มต้น: 20, สูงสุด: 100)

ตัวอย่างการตอบกลับ

JSON
{
  "state": 0,
  "result": {
    "items": [
      {
        "uuid": "019b2265-...",
        "address": "TXYZabc123...",
        "currency": "USDT",
        "network": "TRX-TRC20",
        "status": "active",
        "total_received": "1250.50",
        "transactions_count": 3
      }
    ],
    "paginate": {
      "count": 1,
      "current_page": 1,
      "per_page": 20,
      "total": 1,
      "total_pages": 1,
      "has_more": false
    }
  }
}

เปิด / ปิดใช้งานกระเป๋า

สลับว่ากระเป๋าเงินคงที่จะรับการชำระเงินใหม่หรือไม่

POST/v1/static-wallet/disable
POST/v1/static-wallet/enable

Request

ทั้งสอง endpoint รับพารามิเตอร์เดียว:

JSON
{
  "uuid": "019b2265-34d8-7001-a230-8f97de90d481"
}

ตัวอย่างการตอบกลับ

JSON
{
  "state": 0,
  "result": {
    "uuid": "019b2265-34d8-7001-a230-8f97de90d481",
    "status": "inactive",
    "message": "Static wallet disabled successfully"
  }
}

สำหรับ enable status จะเป็น "active" และ message จะเป็น "Static wallet enabled successfully"

ธุรกรรมของกระเป๋า

ดึงรายการรับฝากทั้งหมดที่กระเป๋าเงินคงที่ได้รับ

POST/v1/static-wallet/transactions

พารามิเตอร์ของคำขอ

FieldTypeRequiredDescription
uuidstringyesUUID ของกระเป๋าเงินคงที่
date_fromdatenoวันที่เริ่มต้น (YYYY-MM-DD)
date_todatenoวันที่สิ้นสุด (YYYY-MM-DD)
pageintnoหมายเลขหน้า (ค่าเริ่มต้น: 1)
per_pageintnoจำนวนรายการต่อหน้า (ค่าเริ่มต้น: 15, สูงสุด: 5000)

ตัวอย่างการตอบกลับ

JSON
{
  "state": 0,
  "result": {
    "items": [
      {
        "uuid": "abc123-def456-...",
        "order_id": "USER-123",
        "amount": "100.00",
        "currency": "USDT",
        "payment_status": "paid",
        "txid": "0xabc123def456...",
        "fee_amount": "3.00",
        "net_amount": "97.00",
        "created_at": "2026-01-20T15:30:00Z"
      }
    ],
    "paginate": {
      "count": 1,
      "hasPages": true,
      "perPage": 15,
      "page": 1
    }
  }
}
  • fee_amount — ค่าธรรมเนียมแพลตฟอร์มที่หักจากการฝากนี้ ในหน่วย currency
  • net_amount — จำนวนเงินที่เครดิตเข้ายอดคงเหลือผู้ค้าหลังหักค่าธรรมเนียม

Webhook ของกระเป๋าเงินคงที่

เมื่อมีการรับชำระเงินที่กระเป๋าเงินคงที่ ระบบจะส่ง Webhook ไปยัง url_callback

รูปแบบ Webhook สำหรับกระเป๋าเงินคงที่แตกต่างจาก Webhook ของการชำระเงินปกติ จุดสังเกตคือ Webhook ของกระเป๋าเงินคงที่จะมีฟิลด์ merchant_amount ซึ่งคุณควรใช้ในการเครดิตยอดเงิน

Payload ของ Webhook

JSON
{
  "uuid": "a28b293f-5c76-4053-8062-ae9ca4ab784b",
  "order_id": "USER-7666308594",
  "amount": "10.00000000",
  "currency": "USDT",
  "amount_usd": "10.00000000",
  "exchange_rate": "1.00000000",
  "payer_currency": "USDT",
  "payer_amount": "10.00000000",
  "network": "TRX-TRC20",
  "address": "TMU9Tgpchvgbywkbj5SdC8KJS73t5m3M7G",
  "payment_status": "paid",
  "txid": "8369ede26a0da05b1bae154b4bb4072eb2453db30ba86b21831902670929454f",
  "tx_explorer_url": "https://tronscan.org/#/transaction/8369ede26a0da05b1bae154b4bb4072eb2453db30ba86b21831902670929454f",
  "payment_amount": "10.00000000",
  "merchant_amount": "9.920000000000000000",
  "created_at": "2026-05-09T16:13:04+03:00",
  "sign": "dd958d1405febce670a9a196e9141784b9f2a5f39cd6d1832d6f3f68d0de1e10"
}

Webhook ของกระเป๋าเงินคงที่ ไม่มี url หรือ expires_at (เนื่องจากที่อยู่เป็นแบบถาวร ไม่ใช่เซสชัน) แต่ มี exchange_rate และ created_at

อ้างอิงฟิลด์

FieldTypeDescription
uuidstringUUID ของธุรกรรม (ใบแจ้งหนี้) สำหรับการฝากนี้
order_idstringorder_id ของกระเป๋าเงินคงที่ของคุณ
amountdecimal (8 dp)จำนวนคริปโตที่ได้รับ
currencystringคริปโตที่ได้รับ (ตรงกับ currency ของกระเป๋า)
amount_usddecimal (8 dp)มูลค่า USD ณ เวลาที่ได้รับ
exchange_ratedecimalอัตรา crypto / USD ที่ใช้
payer_currencystringเหมือนกับ currency สำหรับกระเป๋าเงินคงที่
payer_amountdecimal (8 dp)เหมือนกับ amount สำหรับกระเป๋าเงินคงที่
networkstringเครือข่ายบล็อกเชน
addressstringที่อยู่กระเป๋าเงินคงที่
payment_statusstring????? deposit ???????? ??????????? paid ?????????? AML ?????? aml_lock ???????????????????????
txidstringhash ของธุรกรรมบล็อกเชน
tx_explorer_urlstring | nullURL ของธุรกรรมในตัวสำรวจบล็อกเชน เป็น null เมื่อไม่มี txid หรือเป็นการโอน P2P ภายใน
payment_amountdecimal (8 dp)เหมือนกับ amount
merchant_amountdecimal (18 dp)จำนวนหลังหักค่าธรรมเนียม — ใช้ค่านี้ในการเครดิต
created_atstring (ISO 8601)เวลาที่ได้รับเงินฝาก
signstring (hex)ลายเซ็น HMAC-SHA256 ของ payload

แนวปฏิบัติที่ดี

  • order_id ที่ไม่ซ้ำ — ใช้ order_id ที่ไม่ซ้ำกันสำหรับผู้ใช้หรือคำสั่งซื้อแต่ละราย
  • Idempotency — ตรวจ txid ก่อนประมวลผลเพื่อหลีกเลี่ยงการเครดิตซ้ำ
  • ตรวจสอบลายเซ็น — ตรวจสอบลายเซ็น sign เสมอก่อนเครดิตเงิน
  • ใช้ merchant_amount — เครดิตให้ผู้ใช้ตาม merchant_amount ไม่ใช่ payment_amount

วงจรชีวิตและการทำซ้ำได้

กระเป๋าเงินแบบคงที่เป็นตัวตนสำหรับฝากที่สามารถนำกลับมาใช้ใหม่ได้ ไม่ใช่ใบแจ้งหนี้ มันไม่มีจำนวนเงินที่คาดไว้และไม่มีวันหมดอายุ ที่อยู่หนึ่งสามารถสร้างธุรกรรมการฝากได้จำนวนเท่าใดก็ได้ในช่วงชีวิตของมัน

การสร้างสามารถทำซ้ำได้สำหรับโครงการผู้ค้ารายเดียวกัน, order_id, currency, และ network: จะคืนกระเป๋าเงินที่มีอยู่ไว้ รักษาคู่ค่าดังกล่าวให้นิ่งและเก็บกระเป๋าเงินที่คืนมา uuid; อย่าใช้ order_id ใหม่ทุกครั้งที่ลูกค้าเดียวกันเปิดหน้าฝาก

การทำซ้ำได้ของการฝากต่างจากการทำซ้ำได้ของกระเป๋าเงิน:

  • order_id ระบุการจับคู่กระเป๋าเงิน/ลูกค้าที่นำกลับมาใช้ใหม่;
  • กระเป๋าเงิน uuid ระบุบันทึกกระเป๋าเงินถาวร;
  • เว็บฮุค uuid ระบุธุรกรรมการฝากที่ตรวจพบหนึ่งรายการ;
  • txid ระบุการโอนบนเชนและเป็นคีย์หลักสำหรับการตรวจสอบซ้ำสำหรับการให้เครดิต.

ใช้ข้อจำกัดความไม่ซ้ำกันของฐานข้อมูลสำหรับเอกลักษณ์ chain/network/txid ที่ถูกประมวลผลและอ้างสิทธิ์มันในธุรกรรมเดียวกับที่ให้เครดิตกับยอดคงเหลือภายในของลูกค้า.

เปิดใช้งานและปิดใช้งานความหมาย

การปิดใช้งานกระเป๋าเงินจะป้องกันไม่ให้แอปพลิเคชันประมวลผลเป็นเป้าหมายการฝากที่ใช้งานอยู่; มันจะไม่ลบที่อยู่หรือประวัติของมันและไม่สามารถหยุดการโอนบนบล็อกเชนที่ผู้ใช้ส่งไปแล้วได้.

อย่าบอกผู้ใช้ว่าเงินที่ส่งไปยังที่อยู๋ที่ไม่ได้ใช้งานจะถูกส่งคืนโดยอัตโนมัติ การโอนผ่านบล็อกเชนไม่สามารถย้อนกลับได้ ปิดใช้งานเฉพาะหลังจากลบที่อยู่จาก UI ของคุณแล้ว และรักษากระบวนการกู้คืนที่สามารถดำเนินการได้สำหรับการฝากล่าช้า

การเปิดใช้งานใหม่จะรักษาเอกลักษณ์ของกระเป๋าเงินและที่อยู่เดิมไว้ อย่าสร้างกระเป๋าเงินใหม่เพียงเพื่อเปลี่ยนฉลาก; ฉลากไม่ใช่ตัวระบุการชำระเงิน

กรณีพิเศษของกระเป๋าเงินคงที่

สถานการณ์การจัดการที่ถูกต้อง
คำขอสร้างซ้ำยอมรับกระเป๋าเงินที่มีอยู่ซึ่งถูกส่งคืนและตรวจสอบข้อมูลคู่ที่บันทึกไว้แทนการคาดหวังที่อยู๋ใหม่
การฝากหลายครั้งไปยังที่อยู๋เดียวสร้างแถวฝากเงินท้องถิ่นแยกสำหรับทุกธุรกรรม uuid/txid; อย่าทำเครื่องหมายกระเป๋าเงินเองว่า 'ชำระแล้ว'
Webhook ซ้ำส่งกลับ HTTP 200 หลังจากพบ txid ที่เคยบันทึกไว้แล้ว; อย่าให้เครดิตซ้ำอีก
ความล่าช้าการยืนยันหรือการสังเกตเครือข่ายซ้ำเก็บการประมวลผลให้เป็นแบบอุปนัยและกระทบยอดจาก /v1/static-wallet/transactions
การฝากต่ำกว่าขั้นต่ำสำหรับการแปลงอัตโนมัติคาดว่าจะได้รับเครดิตสกุลเงินต้นทางโดยไม่มีบล็อก convert ที่เสร็จสมบูรณ์
การแปลงอัตโนมัติสำเร็จเก็บค่าการชำระเงินต้นทางและผลลัพธ์ convert ของเป้าหมายแยกกัน
โทเค็นหรือเครือข่ายผิดอย่าสร้างเครดิตขึ้นมาเอง จดบันทึกหลักฐานและส่งต่อไปยังฝ่ายสนับสนุน/กู้คืนเนื่องจากความสามารถในการกู้คืนขึ้นอยู่กับเฉพาะเชน
เชนที่ใช้เมโม/แท็กแสดงและตรวจสอบความถูกต้องของทุกฟิลด์ปลายทางที่ระบบส่งคืน; แค่ที่อยู่เพียงอย่างเดียวอาจไม่เพียงพอเมื่อจำเป็นต้องใช้เมโม
ล็อก AMLอย่าให้เครดิตกับผู้ใช้ปลายทางจนกว่าสถานะที่เป็นทางการจะถูกปล่อยผ่านกระบวนการปฏิบัติตาม
วอลเล็ตถูกปิดใช้งานหลังจากแสดงที่อยู่ลบออกจาก UI ทันที แต่ให้ติดตามการแจ้งเตือนการดำเนินงานสำหรับการโอนล่าช้าต่อไป

โมเดลการกระทบยอด

รันงานตามรอบที่เลื่อนผ่าน /v1/static-wallet/transactions, ทำการ upsert เงินฝากตาม txid, และเปรียบเทียบ merchant_amount, สถานะ, และผลการแปลงทางเลือกกับบัญชีแยกประเภทภายในของคุณ การส่ง webhook ควรทำให้การปรับบัญชีเร็วขึ้น แต่การปรับบัญชีต้องทำให้ครบถ้วน