SSG Gaming

Product API Single wallet vs Transfer wallet

Single wallet กับ Transfer wallet

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

ดูภาพรวม

หัวข้อSingle walletTransfer wallet
การดูแลยอดคงเหลือยอดคงเหลือมีอยู่ในฐานข้อมูลของคุณเพียงแห่งเดียว ผู้ให้บริการเกมไม่ถือเงินของผู้เล่นผู้ให้บริการเกมถือยอดคงเหลือสำหรับเกมแยกต่างหาก เงินเข้าและออกผ่านการเรียก transfer
การเรียกระหว่างเดิมพันทุกการเดิมพันและทุกรางวัลจะส่ง callback แบบ server-to-server มาที่คุณ (balance, debit, credit, rollback)ไม่มี เกมทำงานกับยอดคงเหลือฝั่งผู้ให้บริการเกม มีการเรียกเฉพาะตอนโอนเข้าและโอนออก
ความพร้อมใช้งานที่ต้องการendpoint ของ wallet ต้องตอบทุก callback โดยปกติภายในไม่กี่ร้อยมิลลิวินาที หากระบบล่ม การเล่นจะหยุดต้องใช้เฉพาะตอนโอนเงินเท่านั้น รอบเกมยังเล่นต่อได้แม้ระบบของคุณออฟไลน์ชั่วคราว
โมเดลความสอดคล้องของข้อมูลledger ของคุณคือแหล่งข้อมูลที่ถูกต้องเพียงหนึ่งเดียวแบบเรียลไทม์ ต้องทำ reconciliation เฉพาะรอบเกม ไม่ต้องทำกับยอดคงเหลือมี ledger สองชุดที่ตรงกันเฉพาะช่วงที่มีการโอนเท่านั้น จึงต้องทำ reconciliation ระดับรายการโอน
การกู้คืนเมื่อเกิดข้อผิดพลาดแก้ปัญหา timeout ด้วยการลองใหม่แบบ idempotent และการเรียก rollback โดยอ้างอิงจาก transaction IDการโอนมี 2 ขั้นตอน: pending จากนั้น success หรือ failed หากไม่ทราบผลลัพธ์ ให้ตรวจสอบด้วยการสอบถามสถานะ
ความยากในการเชื่อมต่อสูงกว่า คุณต้องพัฒนาและดูแลบริการ callback ที่มี latency ต่ำ พร้อม idempotency และ ledgerต่ำกว่า คุณเรียก REST endpoint เพียงสามถึงสี่ตัว ไม่ต้องดูแลความปลอดภัยหรือขยายระบบรองรับทราฟฟิกขาเข้า
ประสบการณ์ผู้เล่นยอดคงเหลือเดียว ไม่มีขั้นตอนโอน เหมาะกับโบนัส การเล่นข้ามผลิตภัณฑ์ และการแสดงยอดคงเหลือแบบเรียลไทม์ต้องโอนเงินเข้าก่อนเล่นและโอนออกหลังเล่น ทำให้มีความล่าช้าเล็กน้อย และอาจมียอดคงเหลือตกค้างหากผู้เล่นออกกลางคัน
กรณีที่เหมาะสมผู้ประกอบการที่มี wallet หรือแพลตฟอร์มของตนเอง และต้องการควบคุมเงินทุนและโปรโมชันอย่างเข้มงวดผู้ประกอบการที่ต้องการเปิดตัวอย่างรวดเร็ว หรือยังไม่มีบริการ wallet แบบเรียลไทม์

Single wallet (seamless)

ในโมเดล single wallet (seamless) ระบบของคุณคือ wallet เมื่อผู้เล่นวางเดิมพัน SSG API จะเรียก callback endpoint ของคุณ คุณเปลี่ยนยอดคงเหลือใน ledger ของคุณเอง แล้วตอบกลับด้วยยอดคงเหลือใหม่ เงินไม่เคยออกจากฐานข้อมูลของคุณ

ลำดับการเรียก

PlayerOperatorSSG APIloop1. open game2. launch(playerId, token)3. launchUrl4. spin5. debit(txId, roundId, amount)6. OK, balance7. credit(txId, roundId, win)8. OK, balance9. rollback(txId) [on timeout]
  1. เปิดเกม: backend ของคุณขอ URL เกมจาก SSG พร้อม player ID และ session token
  2. เดิมพัน: ในแต่ละรอบ SSG เรียก debit พร้อม txId ที่ไม่ซ้ำ คุณตรวจสอบยอดเงิน บันทึกแถวใน ledger และส่งยอดคงเหลือใหม่กลับ
  3. รางวัล: SSG เรียก credit พร้อมเงินรางวัล (อาจเป็นศูนย์) สำหรับรอบเดียวกัน
  4. ข้อผิดพลาด: หากการเรียก timeout SSG จะลองใหม่ด้วย txId เดิม และเมื่อเกินจำนวนครั้งที่กำหนดจะส่ง rollback

เมธอด callback (ตัวอย่าง)

เมธอดวัตถุประสงค์ฟิลด์หลักIdempotent
balanceส่งคืนยอดคงเหลือปัจจุบันของผู้เล่นplayerId, currencyใช่ (อ่านอย่างเดียว)
debitวางเดิมพัน: หักเงินตามจำนวนplayerId, txId, roundId, gameId, amount, currencyตาม txId
creditชำระรางวัล: เพิ่มเงินตามจำนวนplayerId, txId, roundId, amount, currencyตาม txId
rollbackยกเลิกรายการ debit หรือ credit ก่อนหน้าหลังเกิดข้อผิดพลาดtxId, refTxIdตาม txId

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

{
  "method": "debit",
  "playerId": "p_839201",
  "txId": "tx_20261007_000184",
  "roundId": "r_77f3a1",
  "gameId": "slots_fruit_01",
  "currency": "MYR",
  "amount": "2.50",
  "ts": 1791338577,
  "sign": "hex(HMAC-SHA256(secret, canonical))"
}

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

{
  "status": "OK",
  "txId": "tx_20261007_000184",
  "balance": "97.50",
  "currency": "MYR"
}
// errors: INSUFFICIENT_FUNDS, PLAYER_NOT_FOUND,
//         DUPLICATE_TX (return original result), INTERNAL_ERROR

กฎที่บริการ wallet ของคุณต้องปฏิบัติตาม

Idempotency
หาก debit หรือ credit ที่มี txId เดียวกันถูกส่งซ้ำ ต้องส่งผลลัพธ์เดิมกลับและห้ามเคลื่อนไหวเงินซ้ำ บังคับใช้ด้วย unique index บน txId
การบันทึก ledger แบบ atomic
ตรวจสอบยอดเงิน เพิ่มแถวใน ledger และอัปเดตยอดคงเหลือภายในธุรกรรมฐานข้อมูลเดียว เพื่อไม่ให้เดิมพันที่เกิดพร้อมกันสองรายการทำให้ยอดติดลบได้
Rollback มาก่อน debit
อาจมี rollback มาถึงสำหรับ txId ที่คุณไม่เคยเห็น เพราะ debit ต้นฉบับ timeout ให้เก็บ tombstone ไว้ เพื่อปฏิเสธ debit ที่มาช้าซึ่งใช้ txId เดียวกัน
เป้าหมาย latency
ตั้งเป้า p99 ต่ำกว่า 500 ms รวมเวลาเครือข่าย โดยให้เส้นทาง callback ใช้ indexed read เพียง 1 ครั้งและ write 1 ครั้ง และแยก query สำหรับรายงานออกจากเส้นทางนี้
รูปแบบจำนวนเงิน
จัดการจำนวนเงินเป็น decimal string หรือเลขจำนวนเต็มในหน่วยย่อยสุด ห้ามใช้ floating point และต้องตรวจสอบสกุลเงินให้ตรงกับบัญชีผู้เล่น
โบนัสและฟรีสปิน
ฟรีสปินคือ debit จำนวน 0 ตามด้วย credit ของเงินรางวัล ควรแยกยอดโบนัสออกจากยอดเงินสดใน ledger ของคุณ
ความปลอดภัย
ตรวจสอบลายเซ็น HMAC-SHA256 ของ canonical request, ปฏิเสธ timestamp ที่หมดอายุ, อนุญาตเฉพาะ IP ต้นทางของ SSG (allowlist) และกำหนดให้ใช้ TLS 1.2 ขึ้นไป
การกระทบยอด
เปรียบเทียบรายงานรอบเกมรายวันจาก SSG กับ ledger ของคุณตาม roundId ความต่างมักเกิดจาก callback หรือ rollback ที่ตกหล่น

Transfer wallet

ในโมเดล transfer wallet ผู้ให้บริการเกมจะเก็บยอดเงินในเกมของผู้เล่นแต่ละราย ระบบหลังบ้านของคุณโอนเงินเข้าก่อนเล่นและโอนออกหลังเล่นเสร็จ ระหว่างเล่นจะไม่มี callback มายังระบบของคุณ จึงต้องใช้เพียงการเรียก REST ขาออกเท่านั้น

ลำดับการเรียก

PlayerOperatorSSG APIplay1. transferIn(txId, amount)2. PENDING or SUCCESS3. launch(playerId)4. launchUrl5. spin (no callbacks to Operator)6. getBalance(playerId)7. balance8. transferOut(txId, all)9. SUCCESS, amount
  1. โอนเข้า: ระบบหลังบ้านของคุณเรียก transferIn พร้อม txId ที่ไม่ซ้ำและจำนวนเงิน ผลลัพธ์คือ PENDING หรือ SUCCESS
  2. เล่นเกม: เปิดเกม การเดิมพันและเงินรางวัลทั้งหมดจะเปลี่ยนแปลงเฉพาะยอดเงินฝั่งผู้ให้บริการเกม โดยไม่มี callback มาที่คุณ
  3. โอนออก: เมื่อผู้เล่นออกจากเกม ให้เรียก transferOut สำหรับยอดคงเหลือทั้งหมด แล้วบันทึกคืนเข้า ledger ของคุณเมื่อได้ SUCCESS
  4. ผลลัพธ์ไม่แน่ชัด: หากการเรียกโอนเงินเกิด timeout ให้ query getTransferStatus ด้วย txId เดิมก่อนทำอย่างอื่น

เมธอด API (ตัวอย่าง)

เมธอดวัตถุประสงค์ฟิลด์หลักIdempotent
transferInโอนเงินจากกระเป๋าเงินของคุณเข้ายอดเงินในเกมของผู้เล่นplayerId, txId, amount, currencyตาม txId
transferOutโอนเงินจากยอดเงินในเกมกลับเข้ากระเป๋าเงินของคุณplayerId, txId, amount | allตาม txId
getBalanceอ่านยอดเงินในเกมของผู้เล่นplayerIdใช่ (อ่านอย่างเดียว)
getTransferStatusคืนค่า PENDING, SUCCESS หรือ FAILED สำหรับ txIdtxIdใช่ (อ่านอย่างเดียว)

กฎที่ระบบหลังบ้านของคุณต้องปฏิบัติตาม

หนึ่ง txId ต่อหนึ่งรายการ
สร้าง txId ก่อนการเรียกครั้งแรกและใช้ซ้ำในทุกการ retry ห้ามสร้าง txId ใหม่จนกว่าจะทราบสถานะของรายการก่อนหน้า
หักยอดใน ledger ของคุณก่อน
สำหรับการโอนเข้า ให้กันยอดเงินใน ledger ของคุณก่อนเรียก SSG จากนั้นยืนยันหรือปล่อยยอดคืนเมื่อสถานะสิ้นสุด
เก็บกวาดยอดเงินตกค้าง
รันงานที่ค้นหาผู้เล่นซึ่งมียอดเงินในเกมแต่ไม่มี session ที่ใช้งานอยู่ แล้วโอนออก เพื่อรองรับผู้เล่นที่ปิดเบราว์เซอร์กลางคัน
เทิร์นโอเวอร์และรายงาน
เนื่องจากคุณไม่เห็นการเดิมพันแบบเรียลไทม์ ให้คำนวณเทิร์นโอเวอร์ เงื่อนไขการเดิมพันโบนัส และวงเงินความเสี่ยงจากรายงานรอบเกมที่ดึงจาก SSG ไม่ใช่จาก callback
การกระทบยอด
จับคู่ทุกรายการโอนเข้าและโอนออกกับบันทึกของ SSG ตาม txId และแจ้งเตือนเมื่อมี PENDING ที่เกินเวลา timeout ของคุณ
ความปลอดภัย
ลงลายเซ็นคำขอด้วย HMAC-SHA256 เรียกผ่าน TLS 1.2 ขึ้นไปเท่านั้น เก็บ API key ไว้ใน secret store และจำกัดว่าเซิร์ฟเวอร์ใดของคุณเรียก SSG ได้

สถานการณ์ข้อผิดพลาด

สถานการณ์Single walletTransfer wallet
เครือข่าย timeoutระหว่างการเดิมพัน SSG จะ retry ด้วย txId เดิม แล้วส่ง rollback เมื่อครบจำนวนครั้งที่กำหนด คุณต้องรองรับ idempotencyได้รับผลกระทบเฉพาะการโอนเงิน ให้ query getTransferStatus ด้วย txId เดิม แล้วจึงดำเนินการ
ระบบของคุณล่มผู้เล่นไม่สามารถเริ่มหรือเล่นรอบเกมต่อได้ รอบเกมที่ค้างอยู่จะถูก rollbackผู้เล่นยังเล่นต่อได้ด้วยยอดเงินในเกมที่มีอยู่ แต่การโอนใหม่จะถูกบล็อก
คำขอซ้ำคืนค่า response ที่บันทึกไว้สำหรับ txId นั้น และไม่เปลี่ยนแปลงสิ่งใดคืนผลลัพธ์ที่บันทึกไว้สำหรับ txId นั้น และไม่เปลี่ยนแปลงสิ่งใด
ผู้เล่นหลุดการเชื่อมต่อกลางรอบรอบเกมจบที่ฝั่งผู้ให้บริการเกม และส่ง credit ตามปกติรอบเกมจบลง และเงินจะอยู่ในยอดเงินในเกมจนกว่าจะมีการโอนออกหรืองานเก็บกวาดทำงาน
ยอดเงินไม่ตรงกันมักเกิดจาก callback หรือ rollback ที่ตกหล่น ตรวจพบได้โดยเปรียบเทียบรายงานรอบเกมตาม roundIdมักเกิดจากการโอนที่ตกค้างหรือค้างดำเนินการ ตรวจพบได้โดยเปรียบเทียบรายการโอนตาม txId

ควรเลือกแบบไหน

เลือก single wallet หาก

  • คุณมีบริการ wallet หรือ ledger แบบเรียลไทม์อยู่แล้ว
  • คุณต้องการยอดเงินเดียวใช้ร่วมกันทั้งกีฬา คาสิโน และโปรโมชัน
  • คุณต้องใช้ข้อมูลการเดิมพันแบบเรียลไทม์เพื่อบริหารความเสี่ยง เงื่อนไขการเดิมพันโบนัส หรือวงเงินการเล่นอย่างรับผิดชอบ
  • ทีมของคุณสามารถดูแลบริการ latency ต่ำที่มี high availability ได้

เลือก transfer wallet หาก

  • คุณต้องการเปิดตัวอย่างรวดเร็วโดยใช้งานพัฒนาน้อยที่สุด
  • คุณยังไม่มีบริการ wallet แบบเรียลไทม์
  • คุณต้องการใช้เฉพาะการเรียกขาออก โดยไม่ต้องรักษาความปลอดภัยให้ callback สาธารณะ
  • รับได้หากยอดเงินตกค้างช่วงสั้น ๆ และสามารถรันงานเก็บกวาดได้

ผู้ให้บริการหลายรายเริ่มจาก transfer wallet เพื่อเปิดตัว แล้วย้ายไป single wallet เมื่อบริการ wallet ของตนพร้อม สอบถามเราได้ว่าการสลับทำเป็นขั้นตอนอย่างไร

เช็กลิสต์การเชื่อมต่อ

  • unique index บน txId และ handler แบบ idempotent สำหรับทุกการเรียกที่เกี่ยวกับการเคลื่อนย้ายเงิน
  • การตรวจสอบลายเซ็น HMAC, ช่วง timestamp ที่ยอมรับได้ และ IP allowlist
  • การจัดการจำนวนเงินแบบ decimal-safe และการตรวจสอบสกุลเงิน
  • ทดสอบ timeout, retry และ rollback ใน sandbox รวมถึง retry ที่มาช้า
  • งานกระทบยอดรายวันตาม roundId (single) หรือ txId (transfer)
  • การมอนิเตอร์และแจ้งเตือน: callback latency, อัตราข้อผิดพลาด, รายการโอนที่ค้างอยู่, ยอดเงินตกค้าง

คุยกับวิศวกรด้านการเชื่อมต่อ

เราพาวิศวกรของคุณทำความรู้จัก sandbox และช่วยเลือกโมเดลที่เหมาะกับแพลตฟอร์มของคุณ รับประกันการเชื่อมต่อเสร็จภายในไม่เกินเจ็ดวัน

อีเมลถึงทีมขาย แชทผ่าน Telegram กลับไปที่ Product API

sales@ssggaming.com