แลกเพชรเป็นเครดิต
ใช้งานได้POST
/api/v1/diamond/redeemแลกสินค้าในร้าน 1 รายการ
เครดิตที่แลกจะบันทึกเป็นรายการชนิด DIAMOND_REDEEM ในประวัติธุรกรรม และติดเทิร์นตาม shop_wagering_x ของ agent
idempotent = true แปลว่าเป็นการ replay — อย่านับเป็นการแลกครั้งใหม่ ให้ใช้ diamond_balance/balance ที่ตอบกลับอัปเดตหน้าจอเฉย ๆ
Headers
| ฟิลด์ | ชนิด | จำเป็น | คำอธิบาย |
|---|---|---|---|
| Authorization | string | ใช่ | ใช้ — แนบ Bearer <access_token> ของสมาชิก |
| X-Api-Key | string | ใช่ | API key ของ agent (ak_…) จากหน้า bo |
| X-Timestamp | string | ใช่ | เวลา sign เป็น unix milliseconds (คลาดเคลื่อนได้ ±300 วินาที) |
| X-Nonce | string | ใช่ | ค่าไม่ซ้ำต่อ request (UUIDv4) กัน replay |
| X-Signature | string | ใช่ | hex(HMAC-SHA256(secret, canonical)) — ดูหน้า Authentication |
| X-Player-IP | string | — | IP จริงของผู้เล่น (IPv4/IPv6) — แนะนำให้ส่ง (ใช้ใน login history) |
| X-Player-UA | string | — | User-Agent ของผู้เล่น (optional — ลง login history) |
| X-Request-Id | string | — | correlation id ของฝั่งคุณ — ระบบ echo กลับใน request_uuid (แนะนำให้ส่ง) |
| x-lang | string | — | th (default) หรือ en — ภาษาของ message |
Request bodyapplication/json
| ฟิลด์ | ชนิด | จำเป็น | คำอธิบาย |
|---|---|---|---|
| item_id | string | ใช่ | id ของสินค้าที่จะแลก มาจาก items ใน /diamond/shop (UUID) |
| idempotency_key | string | — | คีย์กันกดซ้ำของฝั่งคุณ สูงสุด 64 ตัวอักษร — ส่งค่าเดิมเมื่อ retry เพื่อไม่ให้แลกซ้ำ ถ้าไม่ส่งระบบจะสร้าง uuid ให้ (การ retry จึงต้องส่งคีย์เองถึงจะกันซ้ำได้) |
ตัวอย่าง request
{
"item_id": "3f1c9a2e-7b41-4d6c-9a8e-2f5b1c0d7e10",
"idempotency_key": "redeem-2026-07-12-9f8a1c"
}Response
ฟิลด์ใน data
| ฟิลด์ | ชนิด | จำเป็น | คำอธิบาย |
|---|---|---|---|
| idempotent | boolean | — | true = คำขอนี้เป็นการ replay ด้วย idempotency_key เดิม (ไม่ได้หักเพชร/เครดิตซ้ำ) คืนยอดปัจจุบัน · false = แลกจริงในครั้งนี้ |
| diamond_balance | number | — | ยอดเพชรคงเหลือหลังหักค่าสินค้า (จำนวนเต็ม) |
| balance | string | — | ยอดเงินในกระเป๋าหลังเครดิตรางวัลเข้า (THB, string) |
| credit_amount | string | — | เครดิตที่ได้รับจากการแลกครั้งนี้ (THB, string) |
| item_id | string | — | id ของสินค้าที่แลก (echo กลับมาให้ผูกกับ toast/ประวัติ) |
ตัวอย่าง response
{
"success": true,
"code": 0,
"message": "Redeemed successfully",
"data": {
"idempotent": false,
"diamond_balance": 220,
"balance": "170.00",
"credit_amount": "50",
"item_id": "3f1c9a2e-7b41-4d6c-9a8e-2f5b1c0d7e10"
},
"request_uuid": "c4a8f2d6-1b39-4e75-90cd-5e7a3f8b1d64"
}Error codes ที่พบได้
| code | ชื่อ | HTTP | ข้อความ |
|---|---|---|---|
| 6222 | DIAMOND_INSUFFICIENT | 400 | เพชรไม่พอสำหรับการแลกเพชรไม่พอสำหรับสินค้านี้ (diamond_balance < cost_diamonds) — สะสมเพิ่มก่อน |
| 6223 | DIAMOND_ITEM_UNAVAILABLE | 400 | ไอเทมในร้านเพชรปิดอยู่หรือไม่พบสินค้าไม่พร้อมขาย — ไม่มี id นี้หรือถูกปิดใช้ (โหลด /diamond/shop ใหม่) |
| 6221 | DIAMOND_NOT_ENABLED | 400 | โปรแกรมเพชรยังไม่เปิดใช้งานหรือไม่มีสิทธิ์ระบบเพชรหรือร้านค้าปิดอยู่ (enabled/shop_enabled = false) หรือบัญชีไม่เข้าเงื่อนไข (ไม่ใช่กระเป๋าโหมด TRANSFER) |
| 9002 | SERVICE_UNAVAILABLE | 503 | บริการไม่พร้อมใช้งานระบบออกเครดิตของ agent ไม่พร้อมชั่วคราว — เพชรไม่ถูกหัก ลองใหม่ภายหลัง (สาเหตุที่แท้จริงถูกซ่อนจากสมาชิก) |
| 4001 | VALIDATION_ERROR | 400 | ข้อมูลไม่ถูกต้องitem_id ไม่ใช่ UUID หรือ idempotency_key ยาวเกิน 64 ตัวอักษร |
| 1001 | UNAUTHORIZED | 401 | ไม่ได้รับอนุญาต |
| 1007 | TOKEN_INVALID | 401 | โทเค็นไม่ถูกต้อง |