อ่านออเดอร์รายตัว

GET/api/v1/orders/{order_id}
สิทธิ์ที่ต้องใช้:orders:read

อ่านสถานะและผลของออเดอร์หนึ่งรายการ · นี่คือแหล่งข้อมูลหลักที่ใช้ตามผลออเดอร์ ให้เช็คที่นี่เป็นหลัก ไม่ใช่รอ callback อย่างเดียว เพราะ callback เป็นตัวช่วยแจ้งเตือน แต่ถ้ามันส่งไม่ถึงคุณ ข้อมูลจริงก็ยังอ่านได้จากที่นี่เสมอ · คำตอบทั้งหมดอยู่ที่สามฟิลด์: status = ออเดอร์ไปถึงขั้นไหนแล้ว · charged = เงินในกระเป๋าถูกหักไปหรือยัง · delivery = ตัวสินค้า ซึ่งจะมีค่าเมื่อ status เป็น completed · รูปของ delivery ขึ้นกับ type ของออเดอร์นั้น — cdkey/account1 ได้คีย์ ส่วน account2 ได้ข้อมูลล็อกอินของบัญชี

delivery มีสองรูป และ type ของออเดอร์ตัวเดียวกันเป็นตัวตัดสิน

รูปของ delivery ถูกตัดสินด้วยฟิลด์ type ของออเดอร์ตัวเดียวกันนั้น ไม่ใช่ด้วยเอนด์พอยต์ที่เรียกและไม่ใช่ด้วยสถานะ — สองรูปนี้ไม่มีฟิลด์ร่วมกันเลยสักตัว: cdkey กับ account1 ได้ { keys: [{ serial }] } ส่วน account2 ได้ login · password · email · email_password · extra · ให้พาร์เซอร์ฝั่งคุณแยกสาขาด้วย type เท่านั้น ห้ามแยกจากเนื้อข้อมูล — แยกผิดทางจะอ่านได้ undefined ทั้งก้อน ซึ่งหน้าตาเหมือนของยังไม่มาเป๊ะ ทั้งที่จ่ายเงินไปแล้วและของมาแล้ว · กติกาเดียวกันนี้ใช้กับก้อนที่ webhook ส่งมาด้วย เพราะมันคือก้อนเดียวกันนี้เอง

การปฏิเสธที่ด่านยืนยันตัวตนเกิดกับเอนด์พอยต์นี้ด้วย

ห้ารหัสของด่านยืนยันตัวตน — invalid_key (401) · key_revoked (401) · insufficient_scope (403) · quota_exceeded (429) · too_many_inflight (429) — เกิดได้กับทุกเอนด์พอยต์ รวมทั้งเอนด์พอยต์นี้ เพราะถูกโยนตั้งแต่ก่อนคำขอจะเดินไปถึงตรรกะของหน้านี้เลยสักบรรทัด (scope ที่ต้องมีคือค่าที่ประกาศไว้หัวหน้านี้) · แท็บคำตอบด้านบนจึงไล่เฉพาะสิ่งที่เอนด์พอยต์นี้เองตอบ ไม่ได้แปลว่าห้ารหัสนั้นเกิดที่นี่ไม่ได้ · รายละเอียดครบทุกตัวอยู่ที่ หน้าเอนด์พอยต์ตัวตนที่ /developers/access/me ที่เดียว ทั้ง HTTP status ของแต่ละตัว · ตัวไหนกินโควตารายวันบ้าง · header อะไรกลับมาบ้าง · และทำไม 429 สองตัวต้องรับมือคนละแบบ — จงใจไม่คัดลอกมาไว้ทุกหน้า เพราะสำเนาที่สองคือที่ที่ลืมแก้ตามในวันที่กติกาเปลี่ยน

ข้อมูลที่ต้องส่ง

Path

ชื่อชนิดวิธีใช้
order_idบังคับสตริง
ค่า order_id ที่ได้ตอนสั่งซื้อ · ขึ้นต้นด้วย ord_ ตามด้วยเลขฐานสิบหก 24 ตัว · บันทึกไว้ฝั่งคุณตั้งแต่ตอนสั่ง เพราะเป็นทางเดียวที่จะกลับมาดูออเดอร์นั้นได้โดยตรง

Header

ชื่อชนิดวิธีใช้
Authorizationบังคับstring
คีย์ของคุณในรูป Bearer <คีย์> — ต้องส่งมาทุกคำขอ

ข้อมูลที่ได้รับ

ชื่อชนิดวิธีใช้
order_idสตริง หรือ null
รหัสออเดอร์ ขึ้นต้นด้วย ord_ ตามด้วยเลขฐานสิบหก 24 ตัว
รายละเอียดและข้อควรระวัง
  • ทุกฟิลด์ในตารางนี้เป็น null ได้ แม้แต่ฟิลด์ที่ใช้ระบุตัวออเดอร์เอง ตัวอ่าน JSON ฝั่งคุณจึงต้องรับ null ได้ทุกช่อง
  • ค่าที่เราอ่านกลับมาไม่ได้จะส่งเป็น null ไม่ใช่ค่าที่เดาขึ้นมาหรือเลขศูนย์
  • ถ้าคุณประกาศ schema แบบเข้มว่าฟิลด์ไหนห้ามเป็น null โค้ดฝั่งคุณจะพังใส่ออเดอร์ที่ข้อมูลมีปัญหาพอดี ซึ่งเป็นออเดอร์ที่คุณจำเป็นต้องอ่านให้ได้มากที่สุด
  • ออเดอร์ที่ order_id หรือ status เป็น null ให้ส่งต่อให้คนดู อย่าเอาไปแยกสาขาต่อเอง
statusสตริง หรือ null
สถานะของออเดอร์ตอนนี้
รายละเอียดและข้อควรระวัง
  • queued = รับเรื่องแล้ว รอเราไปซื้อให้ (มีเฉพาะ account2)
  • processing = กำลังดำเนินการ ยังไม่มีของบันทึกลงออเดอร์
  • completed = จบแล้ว delivery เป็นอ็อบเจกต์
  • failed = ไม่สำเร็จ อ่านสาเหตุจาก error.code
  • refunded = ถูกคืนเงินภายหลัง และ delivery จะกลับไปเป็น null แม้เคยส่งมอบไปแล้วก็ตาม
  • ⚠️ processing ค้างถาวรได้
  • ออเดอร์ cdkey/account1 หยุดนิ่งอยู่ที่ค่านี้แบบไม่ขยับเองอีกเลยได้ ทั้งที่คุณจ่ายเงินแล้วและของอาจถึงมือเราเรียบร้อยแล้ว
  • ให้อ่านซ้ำเป็นระยะ ถ้าไม่ขยับเป็นเวลานานให้ติดต่อเราพร้อม order_id (ทางออกเดียวกับออเดอร์ที่ completed ทั้งที่ delivery.keys ว่าง) และ ห้ามสั่งใหม่เด็ดขาด
  • **ห้าค่านี้คือค่าที่มีอยู่วันนี้ ไม่ใช่ชุดปิด
  • เราเพิ่มสถานะใหม่ได้ตลอดเวลาโดยไม่แจ้งล่วงหน้า** เหมือนกับค่าใหม่ของ data.code
  • ฝั่งคุณต้องมีสาขา default รองรับค่าที่ไม่รู้จักไว้เสมอ และอย่าประกาศฟิลด์นี้เป็นชุดปิดใน type/schema เพราะวันที่มีสถานะที่หกออกมา โค้ดแบบนั้นจะพังใส่ออเดอร์ที่จ่ายเงินไปแล้ว
  • ค่าที่ไม่รู้จัก ห้ามตีความว่าสำเร็จ และห้ามตีความว่าล้มเหลว ให้ถือว่าออเดอร์ยังไม่จบ อ่านซ้ำ ถ้าไม่มีอะไรเปลี่ยนให้ส่งต่อให้คนดูพร้อม order_id
  • ห้ามสั่งออเดอร์นั้นใหม่ เพราะการสั่งใหม่คือการจ่ายเงินสองรอบ
typeสตริง หรือ null
ประเภทที่สั่งไว้ — เป็นตัวบอกว่า delivery จะมารูปไหน ไม่ใช่เอนด์พอยต์ที่เรียกและไม่ใช่สถานะ
product_idสตริง หรือ null
รหัสสินค้าที่สั่ง
priceตัวเลข หรือ null
ราคาที่ตกลงกันไว้ หน่วยบาท เท่ากับ expected_price ที่ส่งมาตอนสั่ง
chargedอ็อบเจกต์ หรือ null
{ amount, currency } คือยอดที่หักจากกระเป๋าจริง และเป็นฟิลด์ เดียว ที่ตอบว่าออเดอร์นี้จ่ายไปแล้วหรือยัง
รายละเอียดและข้อควรระวัง
  • เป็น null ตราบใดที่ออเดอร์ยังไม่มีบันทึกการหักเงิน และเป็นอ็อบเจกต์เมื่อมีแล้ว
  • การคืนเงินไม่ล้างและไม่เขียนทับค่านี้ ตัวที่บอกว่าออเดอร์ถูกคืนเงินแล้วคือ status ที่เป็น refunded (คุณจึงยังเห็นได้ว่าเคยจ่ายไปเท่าไหร่)
  • charged.currency คือ สกุลเงินของกระเป๋าคุณ ส่วน price เป็นบาทเสมอ กระเป๋าที่ไม่ใช่บาทจึงเห็นสองค่านี้ต่างกันเป็นธรรมดา
  • อย่ากระทบยอดด้วยการเทียบสองฟิลด์นี้ตรง ๆ
  • ค่านี้จะปรากฏก็ต่อเมื่อบันทึกได้ครบทั้งจำนวนและสกุล มีมาครึ่งเดียวถือว่ายังไม่มี
deliveryอ็อบเจกต์ หรือ null
ตัวสินค้าที่ส่งมอบ มีค่าเฉพาะตอน status เป็น completed และมาใน หนึ่งในสองรูปที่ไม่มีฟิลด์ร่วมกันเลยสักตัว โดยดูจาก type ของออเดอร์ตัวเดียวกันนี้
รายละเอียดและข้อควรระวัง
  • รูปคีย์ (cdkey / account1) คือ { keys: [{ serial }] } โดย keys เป็นอาร์เรย์ที่วันนี้มีได้มากสุดหนึ่งรายการต่อออเดอร์ ส่วน serial เป็นสตริงที่ผู้จัดจำหน่ายออกให้
  • แล้วแต่สินค้าว่าจะเป็นคีย์หรือ ลิงก์ไถ่ถอน ให้เก็บและแสดงตามที่ได้มา อย่าพยายามแกะรูปแบบของมัน
  • รูปบัญชี (account2) คือ login
  • password
  • email
  • email_password
  • extra โดยสี่ตัวแรกคือข้อมูลล็อกอินของบัญชีและของกล่องอีเมลที่ผูกกับบัญชีนั้น ค่าที่อ่านไม่ได้จะเป็น null ไม่ใช่หายไปจากก้อน
  • extra เล่ารายละเอียดของตัวบัญชีเองและมีชุดฟิลด์ไม่เท่ากันในแต่ละ platform ให้อ่านเฉพาะคีย์ที่คุณรู้จักแล้วข้ามที่เหลือ
errorอ็อบเจกต์ หรือ null
สาเหตุที่ไม่สำเร็จ มีค่าเฉพาะตอน status เป็น failed โดยมี { code, message } อยู่ข้างใน
รายละเอียดและข้อควรระวัง
  • code ต้องอ่านคู่กับ charged เสมอ เพราะรหัสตัวเดียวกันมาถึงคุณได้จากหลายจังหวะ บางจังหวะเงินยังไม่ออก บางจังหวะออกไปแล้วและคืนกลับมา
  • รหัสเป็นชุดเดียวกับที่เอนด์พอยต์สั่งซื้อตอบสด ๆ (ดูตารางในหน้า /developers/orders/create) แต่มาถึงคุณคนละจังหวะกัน
created_atสตริง ISO 8601 (UTC) หรือ null
เวลาที่ออเดอร์ถูกสร้าง
updated_atสตริง ISO 8601 (UTC) หรือ null
เวลาที่ออเดอร์ถูกแก้ครั้งล่าสุด

สถานะที่อาจได้รับ

สถานะรหัสความหมาย
200
queued — ยังไม่ถึงคิว รออ่านซ้ำ
เรายังไม่ได้เริ่มซื้อออเดอร์นี้ · charged กับ delivery เป็น null ทั้งคู่ ซึ่งถูกต้องแล้วสำหรับสถานะนี้ · สิ่งที่ต้องทำคือรออีกสักพักแล้วอ่านซ้ำ (หรือรอ callback ถ้าตั้งไว้)
200
failed — ไม่สำเร็จ และออเดอร์ไม่มีบันทึกการหักเงิน
อ่านสาเหตุจาก error.code
รายละเอียดและข้อควรระวัง
  • ออเดอร์นี้มี charged เป็น null แปลว่าไม่มีบันทึกการหักเงินอยู่บนออเดอร์เลย
  • สั่งใหม่ได้ด้วย request_id ค่าใหม่หลังจากแก้ต้นเหตุตามที่ error.code บอก
200
failed — ไม่สำเร็จ แต่ charged มีค่าอยู่
ออเดอร์นี้กับออเดอร์ข้างบนมีสถานะเดียวกันเป๊ะ แต่เงินเดินไปไม่เท่ากัน ออเดอร์ข้างบนไม่มีบันทึกการหักเงิน ส่วนออเดอร์นี้มี
รายละเอียดและข้อควรระวัง
  • นี่คือเหตุผลที่การกระทบยอดต้องดูจาก charged เท่านั้น ไม่ใช่จาก status และไม่ใช่จาก error.code
200
refunded — คืนเงินแล้ว และ charged ยังคงค่าเดิมไว้
การคืนเงินไม่ล้างและไม่เขียนทับ charged ค่านั้นยังบอกว่าเคยหักไปเท่าไหร่ ส่วนตัวที่บอกว่าคืนแล้วคือ status ที่เป็น refunded
รายละเอียดและข้อควรระวัง
  • ออเดอร์ที่เคยส่งมอบไปแล้วจะไม่มี delivery ติดมาอีกหลังถูกคืนเงิน
200
completed — ได้ของแล้ว (แบบคีย์)
type เป็น cdkey หรือ account1 ของที่ส่งมอบจึงอยู่ที่ delivery.keys[].serial ซึ่งเป็นค่าที่คุณเอาไปส่งต่อให้ผู้ซื้อได้เลย
200
completed — แต่ delivery.keys ว่าง (ผิดปกติ)
keys ที่ว่างคู่กับ completed แปลว่าคีย์ยังไม่ถูกบันทึกลงออเดอร์ · ให้อ่านออเดอร์ซ้ำอีกครั้ง และ ห้ามสั่งใหม่ ถ้ายังว่างอยู่ให้ติดต่อเราพร้อม order_id
200
completed — ได้ของแล้ว (แบบบัญชี)
type เป็น account2 ของที่ส่งมอบคือสี่ฟิลด์ข้อมูลล็อกอิน ซึ่งเป็นสิ่งที่คุณส่งต่อให้ผู้ซื้อ
รายละเอียดและข้อควรระวัง
  • extra เล่ารายละเอียดของตัวบัญชีเอง ชุดฟิลด์ต่างกันไปตาม platform และเป็นอ็อบเจกต์ว่างได้ อย่าบังคับว่าต้องมีคีย์ใดคีย์หนึ่งเสมอ
  • extra ในตัวอย่างถูกย่อให้อ่านง่าย ของจริงมีครบทั้งชุดที่นิยามไว้ให้ platform นั้น ซึ่งของ Steam อยู่ราวสองโหลคีย์
  • platform ที่เรายังไม่ได้นิยามชุดฟิลด์ไว้จะได้ extra ที่มีแค่ item_id
  • ให้ถือว่าเป็นก้อนอิสระ อ่านเฉพาะคีย์ที่รู้จักแล้วข้ามที่เหลือ
  • extra.alternate_email จะโผล่มาเมื่อบัญชีนั้นมีกล่องอีเมลที่สองคนละกล่องจริง ๆ
200
completed — แต่รายละเอียดบัญชีอ่านไม่ได้ (ผิดปกติ)
ออเดอร์ที่ completed ทั้งที่รายละเอียดยังไม่ครบ จะยังคงรูปเดิมนี้ไว้ คือมีคีย์ครบทุกช่องแต่ค่าเป็น null ไม่มีทางที่ delivery ทั้งก้อนจะกลายเป็น null
รายละเอียดและข้อควรระวัง
  • เจอแบบนี้ให้อ่านออเดอร์ซ้ำ ถ้าไม่เปลี่ยนให้ติดต่อเราพร้อม order_id
  • ห้ามสั่งใหม่
400bad_request
ไม่ได้ใส่ order_id มาใน URL
ช่อง order_id ใน URL ว่างเปล่า หรือมีแต่ช่องว่าง — เติมค่าให้ถูกแล้วยิงใหม่
404order_not_found
ไม่พบออเดอร์นี้
เกิดได้สามกรณี คือ order_id รูปแบบผิด
รายละเอียดและข้อควรระวัง
  • ไม่มีออเดอร์นั้นอยู่จริง
  • หรือออเดอร์นั้นเป็นของ reseller คนอื่น
  • ทั้งสามกรณีตอบก้อนเดียวกันเป๊ะทุกฟิลด์ ซึ่งตั้งใจให้เป็นแบบนั้น เพราะการไล่เดา order_id ของคนอื่นต้องไม่ทำให้รู้ได้ว่ารหัสไหนมีอยู่จริง
อัปเดตล่าสุด 2026-09-07