ตรวจสอบคีย์ · ยอดเงิน · โควตา
/api/v1/mewallet:readยิงคำขอนี้เป็นอันแรกหลังได้รับคีย์ เพื่อยืนยันว่าคีย์ใช้งานได้จริง · นอกจากนั้นมันยังตอบสี่เรื่องที่หน้าอื่นถือว่าคุณรู้อยู่แล้ว: คีย์นี้ทำอะไรได้บ้าง (scopes) · กระเป๋าของคุณมีเงินเท่าไหร่และเป็นสกุลอะไร (wallet) · คุณได้ส่วนลดกี่เปอร์เซ็นต์ แยกตามประเภทสินค้า (discount) · วันนี้ยิงได้อีกกี่คำขอ (quota) · ⚠️ ระบบนี้ ไม่มีการสมัครเอง ไม่มีคีย์ทดสอบ และไม่มี sandbox คีย์ออกให้โดยแอดมินของร้านเท่านั้น ทุกคำขอตั้งแต่นี้ไปวิ่งบนระบบจริง และทุกคำสั่งซื้อใช้เงินจริง
รหัสปฏิเสธที่ด่านยืนยันตัวตน — เกิดได้กับทุกเอนด์พอยต์
ห้ารหัสนี้ถูกโยนก่อนคำขอจะไปถึงตรรกะของเอนด์พอยต์ไหนก็ตาม: invalid_key (401) ไม่มี header ยืนยันตัวตน รูปคีย์ผิด ไม่พบคีย์ หรือส่วนลับไม่ตรง · key_revoked (401) คีย์ใบนี้ถูกยกเลิกแล้ว · insufficient_scope (403) คีย์ใช้ได้แต่ไม่มี scope ที่เอนด์พอยต์นั้นต้องการ · quota_exceeded (429) ใช้โควตารายวันหมดแล้ว · too_many_inflight (429) มีคำขอของคีย์ใบนี้ค้างอยู่พร้อมกันเกินเพดาน · ไม่มีรหัสไหนในห้าตัวนี้กินโควตารายวันของคุณเลยสักใบ รวม 429 ทั้งสองตัวด้วย เพราะระบบปฏิเสธก่อนจะไปเพิ่มตัวนับ · กลุ่ม 401 กับ 403 **ไม่มี header X-RateLimit-* กลับมาเลยสักตัว เพราะยังไม่ได้แตะตัวนับจึงไม่มีค่าให้รายงาน ส่วน 429 ทั้งสองตัวมีครบพร้อม Retry-After และทั้งห้ารหัสมี Cache-Control: private, no-store เหมือนกันหมด · 429 สองแบบใช้สถานะเดียวกันแต่ต้องรับมือคนละอย่าง ให้แยกด้วย data.code ไม่ใช่ด้วยสถานะ HTTP** — quota_exceeded หมดจริงจนถึงรอบรีเซ็ต ส่วน too_many_inflight คลี่ตัวเองในไม่กี่วินาที โค้ดที่รับมือ 429 ทุกใบเหมือนกันหมดจะนอนรอเป็นชั่วโมงให้กับการชนกันที่หายเองในสองวินาที
ตัดสินใจจาก statusCode กับ data.code เท่านั้น
เวลาคำขอล้มเหลว ทุกเอนด์พอยต์ตอบด้วยโครงก้อนเดียวกันหมด ประกอบด้วย: error เป็น true เสมอและมีเฉพาะตอนล้มเหลว · url คือ URL เต็มของคำขอใบที่ล้มเหลว · statusCode คือสถานะ HTTP ตัวเดิมเขียนซ้ำไว้ในเนื้อคำตอบ · statusMessage เป็นสตริง Server Error ตรงตัวเสมอ แม้จะเป็น 400 หรือ 401 ก็ตาม เพราะเป็นค่ากลางของเฟรมเวิร์กที่ไม่มีเอนด์พอยต์ไหนตั้งเอง มันจึงไม่ได้สื่อความหมายอะไรเลย อย่าอ่านมัน · ข้อความบนบรรทัดสถานะของ HTTP เองก็เป็นค่ากลางตัวเดียวกัน คุณจะเห็น 401 Server Error ไม่ใช่ 401 Unauthorized — ตัวนั้นก็อย่าอ่านเหมือนกัน ให้ดูตัวเลขสถานะ · message เป็นประโยคสำหรับคนอ่าน ถ้อยคำเปลี่ยนได้ตลอด อย่าเอาไปแมตช์ · data.code คือรหัสที่ระบบกำหนดเองสำหรับให้โปรแกรมอ่าน มีชุดจำกัดและเป็นค่าที่เอกสารชุดนี้ผูกไว้ · รหัสใหม่ใน data.code ถูกเพิ่มเข้ามาได้เสมอ ให้มีทางเดินสำรองสำหรับค่าที่ยังไม่รู้จักไว้ด้วย อย่าแตกสาขาแบบไม่มีกรณีตั้งต้น · ออเดอร์เป็นข้อยกเว้นหนึ่งข้อ: ออเดอร์ที่ถูกสร้างสำเร็จแล้วแต่ทำไม่สำเร็จภายหลัง จะรายงานความล้มเหลวไว้ในฟิลด์ของตัวออเดอร์เอง (status กับ error) โดยที่สถานะ HTTP ยังเป็น 200
ยอดในกระเป๋ากับราคาสินค้าอยู่คนละหน่วยกันได้
ราคาที่ API ประกาศ — ของสินค้า ของรายการในตลาด และของออเดอร์ — เป็น เงินบาทเสมอ และไม่มีฟิลด์สกุลเงินกำกับ เพราะไม่มีทางเป็นสกุลอื่น · จำนวนเงินอีกสองที่มีสกุลของตัวเองกำกับมาด้วยเสมอ ให้อ่านสกุลจากฟิลด์ข้าง ๆ ห้ามสมมติว่าเป็นบาท: wallet.balance ของหน้านี้ถือสกุลที่ wallet.currency บอกไว้ และยอดที่หักจริงของออเดอร์ (ฟิลด์ charged) ถือสกุลของกระเป๋า ณ ตอนที่หัก · เอาราคาสินค้าไปลบยอดในกระเป๋าตรง ๆ เพื่อดูว่าเงินพอไหมจึงผิดหน่วยทันทีที่กระเป๋าไม่ใช่บาท
ข้อมูลที่ต้องส่ง
Header
| ชื่อ | ชนิด | วิธีใช้ |
|---|---|---|
| Authorizationบังคับ | string | คีย์ของคุณในรูป Bearer <คีย์> ต้องส่งมาทุกคำขอของทุกเอนด์พอยต์ และ คีย์ออกให้โดยแอดมินของร้านเท่านั้น สมัครเองไม่ได้ ไม่มีคีย์ทดสอบและไม่มี sandbox คำขอทุกใบจึงวิ่งบนระบบจริงและคำสั่งซื้อใช้เงินจริงในกระเป๋าจริงรายละเอียดและข้อควรระวัง
|
ข้อมูลที่ได้รับ
| ชื่อ | ชนิด | วิธีใช้ |
|---|---|---|
| uid | สตริง | รหัสบัญชีในระบบของร้านที่คีย์นี้ผูกอยู่ · เงินที่ใช้ซื้อของถูกหักจากกระเป๋าของบัญชีนี้ และออเดอร์ทุกใบที่สั่งด้วยคีย์นี้เป็นของบัญชีนี้ |
| scopes | อาร์เรย์ของสตริง | สิทธิ์ที่คีย์ใบนี้ถืออยู่ (scope) ซึ่งทั้งระบบมีอยู่สี่ตัว คือ catalog:read อ่านแคตตาล็อกและรายการไอดีมือสองรายละเอียดและข้อควรระวัง
|
| wallet.balance | ตัวเลข หรือ null | ยอดในกระเป๋า โดยที่ null แปลว่าอ่านยอดไม่ได้ ไม่ได้แปลว่าเป็นศูนย์รายละเอียดและข้อควรระวัง
|
| wallet.currency | สตริง | สกุลเงินของยอดนั้น · เป็น THB เมื่อบัญชีไม่ได้เก็บสกุลเงินไว้ |
| discount.tier_percent | ตัวเลข | ระดับส่วนลดของบัญชีคุณ หน่วยเปอร์เซ็นต์ รายละเอียดและข้อควรระวัง
|
| discount.effective_percent | อ็อบเจกต์ | ส่วนลดที่คุณได้จริง แยกตามประเภทสินค้า หน่วยเปอร์เซ็นต์ (คิดเพดานของประเภทนั้นให้แล้ว) โดยคีย์ของอ็อบเจกต์คือประเภทสินค้า เช่น { "cdkey": 10, "account2": 12 }รายละเอียดและข้อควรระวัง
|
| quota.limit | ตัวเลข | โควตาของวันนี้ของคีย์ใบนี้ คือ 2,000 คำขอต่อวันเป็นค่าตั้งต้น นับใหม่ตอนเที่ยงคืนตามเวลาไทย (UTC+7) และปรับรายคีย์ได้ รายละเอียดและข้อควรระวัง
|
| quota.remaining | ตัวเลข | จำนวนคำขอที่เหลือของวันนี้ นับรวมคำขอใบนี้ไปแล้ว รายละเอียดและข้อควรระวัง
|
| quota.resets_at | สตริง ISO 8601 (UTC) | เวลาที่ตัวนับจะรีเซ็ต — จุดเวลาเดียวกับ X-RateLimit-Reset แต่เขียนเป็นวันที่แทน Unix timestamp |
สถานะที่อาจได้รับ
| สถานะ | รหัส | ความหมาย |
|---|---|---|
| 200 | — | คีย์ใช้งานได้ — ได้ข้อมูลของคีย์กลับมา ฟิลด์ทุกตัวที่เอนด์พอยต์นี้คืนมาอยู่ในตัวอย่างครบแล้ว ไม่มีตัวไหนถูกละไว้เลย แม้บางตัวจะเป็น null ได้ก็ตาม และ wallet.balance ที่เป็น null แปลว่าอ่านยอดไม่ได้ ไม่ได้แปลว่าเป็นศูนย์รายละเอียดและข้อควรระวัง
|
| 401 | invalid_key | คีย์ใช้ไม่ได้ — ยิงซ้ำไม่ช่วย ให้กลับไปตรวจว่าส่ง header ครบและคีย์ถูกใบ เพราะยิงซ้ำไม่มีทางผ่าน รายละเอียดและข้อควรระวัง
|
| 401 | key_revoked | คีย์ถูกยกเลิกไปแล้ว — ต้องขอใบใหม่ ให้ติดต่อร้านเพื่อขอคีย์ใบใหม่ ยิงซ้ำอีกกี่ครั้งก็ไม่มีทางผ่าน รายละเอียดและข้อควรระวัง
|
| 403 | insufficient_scope | คีย์ใช้ได้ แต่ไม่มีสิทธิ์ (scope) สำหรับเอนด์พอยต์นี้ ตัวคีย์เองใช้งานได้ปกติ แค่ไม่มีสิทธิ์ที่เอนด์พอยต์นี้ต้องการ รายละเอียดและข้อควรระวัง
|
| 429 | quota_exceeded | โควตาของวันนี้หมดแล้ว — ต้องรอถึงรอบรีเซ็ต อ่าน Retry-After แล้วรอตามนั้นเป๊ะ ๆ อย่าตั้งเวลาถอยเอง เพราะยิงซ้ำก่อนรอบรีเซ็ตไม่มีทางผ่านรายละเอียดและข้อควรระวัง
|
| 429 | too_many_inflight | ยิงพร้อมกันหลายคำขอเกินไป — รอไม่กี่วินาทีแล้วลองใหม่ ตอนนี้คีย์ของคุณมีคำขอที่ยังไม่จบค้างอยู่พร้อมกันเกินเพดาน (ค่าตั้งต้นคือ 5 คำขอพร้อมกัน ปรับรายคีย์ได้) รายละเอียดและข้อควรระวัง
|