Product API Single wallet vs Transfer wallet
Single wallet กับ Transfer wallet
เปรียบเทียบเชิงเทคนิคของโมเดลกระเป๋าเงินสองแบบที่ใช้เชื่อมยอดคงเหลือของผู้เล่นฝั่งผู้ประกอบการกับ casino game API: ใครเป็นผู้ถือเงิน การเรียกใดบ้างที่ข้ามเครือข่ายระหว่างการเดิมพัน กู้คืนเมื่อเกิดข้อผิดพลาดอย่างไร และฝั่งคุณต้องพัฒนาอะไรบ้าง
ดูภาพรวม
| หัวข้อ | Single wallet | Transfer 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 ของคุณเอง แล้วตอบกลับด้วยยอดคงเหลือใหม่ เงินไม่เคยออกจากฐานข้อมูลของคุณ
ลำดับการเรียก
- เปิดเกม: backend ของคุณขอ URL เกมจาก SSG พร้อม player ID และ session token
- เดิมพัน: ในแต่ละรอบ SSG เรียก debit พร้อม txId ที่ไม่ซ้ำ คุณตรวจสอบยอดเงิน บันทึกแถวใน ledger และส่งยอดคงเหลือใหม่กลับ
- รางวัล: SSG เรียก credit พร้อมเงินรางวัล (อาจเป็นศูนย์) สำหรับรอบเดียวกัน
- ข้อผิดพลาด: หากการเรียก 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 ขาออกเท่านั้น
ลำดับการเรียก
- โอนเข้า: ระบบหลังบ้านของคุณเรียก transferIn พร้อม txId ที่ไม่ซ้ำและจำนวนเงิน ผลลัพธ์คือ PENDING หรือ SUCCESS
- เล่นเกม: เปิดเกม การเดิมพันและเงินรางวัลทั้งหมดจะเปลี่ยนแปลงเฉพาะยอดเงินฝั่งผู้ให้บริการเกม โดยไม่มี callback มาที่คุณ
- โอนออก: เมื่อผู้เล่นออกจากเกม ให้เรียก transferOut สำหรับยอดคงเหลือทั้งหมด แล้วบันทึกคืนเข้า ledger ของคุณเมื่อได้ SUCCESS
- ผลลัพธ์ไม่แน่ชัด: หากการเรียกโอนเงินเกิด timeout ให้ query getTransferStatus ด้วย txId เดิมก่อนทำอย่างอื่น
เมธอด API (ตัวอย่าง)
| เมธอด | วัตถุประสงค์ | ฟิลด์หลัก | Idempotent |
|---|---|---|---|
transferIn | โอนเงินจากกระเป๋าเงินของคุณเข้ายอดเงินในเกมของผู้เล่น | playerId, txId, amount, currency | ตาม txId |
transferOut | โอนเงินจากยอดเงินในเกมกลับเข้ากระเป๋าเงินของคุณ | playerId, txId, amount | all | ตาม txId |
getBalance | อ่านยอดเงินในเกมของผู้เล่น | playerId | ใช่ (อ่านอย่างเดียว) |
getTransferStatus | คืนค่า PENDING, SUCCESS หรือ FAILED สำหรับ txId | txId | ใช่ (อ่านอย่างเดียว) |
กฎที่ระบบหลังบ้านของคุณต้องปฏิบัติตาม
- หนึ่ง 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 wallet | Transfer 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