เอกสารอ้างอิง API คำสั่งซื้อ
สรุป
หน้านี้รวบรวมสถานะ, endpoint, พารามิเตอร์ และรหัสข้อผิดพลาดของโมดูลคำสั่งซื้อ สำหรับขั้นตอนแบบครบวงจร ดู คู่มือการสั่งซื้อและชำระเงินคำสั่งซื้อ Taobao/1688 วิธีรับอัปเดตคำสั่งซื้อผ่าน webhook มี หน้าอ้างอิงแยกต่างหาก
ขอบเขต: รองรับหลายตลาดแล้ว การชำระเงินถูกรวมเป็น VND, USD หรือ RMB (CNY) — กระเป๋าเงินสำหรับสั่งซื้อเติมเงินด้วยหนึ่งในสามสกุลเงินนี้ ยอดคงเหลือและมูลค่าคำสั่งซื้อใน API ถูกปรับให้เป็นหน่วยกลาง (
*_cny)
Elim เป็น แพลตฟอร์มเทคโนโลยี ที่ดูแลการดำเนินการคำสั่งซื้อและการชำระเงิน — ไม่ได้ขายปลีกและไม่รับลูกค้าปลายทางโดยตรง ระบบของคุณชำระเงินให้ Elim ผ่าน กระเป๋าเงินสำหรับสั่งซื้อ แล้ว Elim จึงชำระเงินต่อให้ผู้ขายบนแพลตฟอร์ม ด้วยเหตุนี้ทุกคำสั่งซื้อจึงมี สองสถานะที่เป็นอิสระต่อกัน — สถานะแพลตฟอร์ม (status) และสถานะการชำระเงินกับ Elim (payment_status) — บวกกับตัวบ่งชี้ผลการชำระเงินฝั่งแพลตฟอร์มอีกหนึ่งตัว (platform_payment_status)
ทุก endpoint ต้องมีการยืนยันตัวตน JWT (Authorization: Bearer <token>) หรือ API Key (x-api-key) ดู การยืนยันตัวตนคำขอ API
สถานะแพลตฟอร์ม (status)
ความคืบหน้าในการประมวลผลคำสั่งซื้อฝั่ง Taobao / 1688
| ค่า | คำอธิบาย |
|---|---|
creating | เพิ่งสร้างคำสั่งซื้อ กำลังรอแพลตฟอร์มยืนยัน |
pending_payment | แพลตฟอร์มสร้างคำสั่งซื้อแล้ว รอการชำระเงิน |
paid | คำสั่งซื้อชำระเงินแล้วฝั่งแพลตฟอร์ม |
shipped | สินค้าออกจากคลังแล้ว อยู่ระหว่างขนส่ง |
completed | คำสั่งซื้อเสร็จสมบูรณ์ ยืนยันการรับสินค้าแล้ว |
cancelled | คำสั่งซื้อถูกยกเลิก |
unknown | อ่านสถานะจากแพลตฟอร์มไม่ได้ |
creating → pending_payment → paid → shipped → completed
↘ cancelled
สถานะการชำระเงิน Elim (payment_status)
ความคืบหน้าการชำระเงินระหว่างผู้ใช้กับ Elim เป็นอิสระ จาก status
| ค่า | คำอธิบาย | เงินในกระเป๋า |
|---|---|---|
unpaid | ค่าเริ่มต้นเมื่อสร้างคำสั่งซื้อ — ยังไม่ได้ส่งคำขอชำระเงิน | ยังไม่ถูกกระทบ |
requested | ผู้ใช้ส่งคำขอชำระเงินแล้ว | ถูกกันไว้ (frozen_balance) |
approved | Elim อนุมัติคำขอแล้ว กำลังชำระเงินกับแพลตฟอร์ม | ยังคงถูกกันไว้ |
paid | ชำระเงินเสร็จสมบูรณ์ | ถูกหัก ออกจาก balance |
rejected | Elim ปฏิเสธคำขอ (rejection_reason ระบุเหตุผล) | ถูกปลดคืน |
refunded | คำสั่งซื้อที่ชำระแล้วได้รับการคืนเงินเข้ากระเป๋า | ถูกคืนเข้า balance |
unpaid → requested → approved → paid → refunded
↑ ↓
└──── rejected
จาก requested ผู้ใช้สามารถถอนคำขอของตนเองเพื่อกลับสู่ unpaid ได้ (ดู cancel-payment-request) หลังจาก approved แล้ว ย้อนกลับได้ด้วยการคืนเงินเท่านั้น
ผลการชำระเงินแพลตฟอร์ม (platform_payment_status)
มีค่าเฉพาะหลังจาก Elim ดำเนินการชำระเงินกับแพลตฟอร์มแล้วเท่านั้น
| ค่า | คำอธิบาย |
|---|---|
pending | กำลังส่งคำสั่งชำระเงินไปยังแพลตฟอร์ม |
success | แพลตฟอร์มบันทึกการชำระเงินแล้ว |
failed | แพลตฟอร์มแจ้งข้อผิดพลาด — Elim จะจัดการด้วยตนเอง |
unknown | ยังระบุผลไม่ได้ |
แสดงทั้ง
statusและpayment_statusในอินเทอร์เฟซเสมอplatform_payment_statusใช้เพื่อวินิจฉัยเมื่อเกิดปัญหาเป็นหลัก
Endpoint คำสั่งซื้อ
Prefix /v1/orders Rate limit นับตามกรอบเวลาวินาที
| Endpoint | Method | คำอธิบาย | Rate limit |
|---|---|---|---|
/v1/orders/preview | POST | ดูตัวอย่างคำสั่งซื้อ: ยอดรวมโดยประมาณ, ตรวจสอบสต็อก — ไม่สร้างคำสั่งซื้อ ไม่หักเงิน | 20 / 60s |
/v1/orders | POST | สร้างคำสั่งซื้อจริงบนแพลตฟอร์ม | 10 / 60s |
/v1/orders | GET | รายการคำสั่งซื้อของผู้ใช้ปัจจุบัน (แบ่งหน้า) | 30 / 60s |
/v1/orders/stats | GET | สถิติสรุปคำสั่งซื้อตามช่วงเวลา / สถานะ | 30 / 60s |
/v1/orders/:id | GET | รายละเอียดคำสั่งซื้อ — ซิงค์สถานะล่าสุดจากแพลตฟอร์มอัตโนมัติทุกครั้งที่เรียก | 30 / 60s |
/v1/orders/:id/cancel | POST | ยกเลิกคำสั่งซื้อขณะยังอยู่ในสถานะที่ยกเลิกได้ | 10 / 60s |
/v1/orders/:id/logistic-detail?package_id=<int> | GET | ติดตามการขนส่งภายในประเทศจีน (Taobao เท่านั้น) | 20 / 60s |
ดูตัวอย่างและสร้างคำสั่งซื้อ — body
{
"platform": "alibaba",
"receiver_address": {
"name": "Nguyen Van A",
"phone": "02812345678",
"mobile": "13800138000",
"address": "广州市天河区体育西路123号",
"province": "广东省",
"city": "广州市",
"area": "天河区",
"town": "天河南街道"
},
"line_items": [
{ "product_ref": "734467086498", "sku_ref": "5578084256927", "quantity": 2, "price": 15.5 }
],
"preview_token": "c5f75ec1-9f8d-4bf6-9de2-048d50fef349",
"idempotency_key": "checkout-2026-08-25-001",
"remark": "หมายเหตุถึงผู้ขาย",
"promotion_id": "PROMO123"
}
| ฟิลด์ | ชนิด | จำเป็น | คำอธิบาย |
|---|---|---|---|
platform | string | ใช่ | taobao หรือ alibaba (1688) |
receiver_address | Address | ใช่ | ที่อยู่จัดส่งที่ถูกต้องในประเทศจีน |
warehouse_address | Address | ไม่ | ที่อยู่คลังต้นทางจัดส่ง |
line_items | LineItem[] | ใช่ | รายการสินค้า (ดูด้านล่าง) |
preview_token | string | ไม่ | token จากการดูตัวอย่าง ใช้ครั้งเดียว หมดอายุใน 10 นาที ส่งมาพร้อมตอนสร้างคำสั่งซื้อเพื่อล็อกราคาที่ดูไว้ |
idempotency_key | string | แนะนำ | คีย์กันสร้างซ้ำต่อการชำระเงินแต่ละครั้ง คำขอซ้ำด้วยคีย์เดิมจะคืนคำสั่งซื้อเดิม |
client_order_id | string | ไม่ | รหัสคำสั่งซื้อจากระบบของคุณ (สร้างอัตโนมัติหากเว้นว่าง) |
promotion_id | string | ไม่ | รหัสโปรโมชัน |
remark | string | ไม่ | หมายเหตุถึงผู้ขาย |
line_items[]
แต่ละรายการระบุสินค้าด้วยคู่ product_ref + sku_ref ซึ่งนำมาจาก การค้นหา / รายละเอียดสินค้า โดยตรง
| ฟิลด์ | ชนิด | จำเป็น | คำอธิบาย |
|---|---|---|---|
product_ref | string | ใช่ | ID หรือลิงก์สินค้าจาก response การค้นหาสินค้า |
sku_ref | string | ใช่ | ID SKU ที่ตรงกัน — Taobao: skus[].id · 1688: skus[].spec_id |
quantity | number | ใช่ | จำนวน |
price | number | ไม่ | ราคาต่อหน่วย CNY — แนะนำให้ระบุเพื่อให้การดูตัวอย่างคืนตัวเลขที่แม่นยำ |
คู่
mp_id+mp_skuid(marketplace ID) ยังคงรองรับเพื่อความเข้ากันได้ย้อนหลัง
receiver_address
| ฟิลด์ | จำเป็น | คำอธิบาย |
|---|---|---|
name | ใช่ | ชื่อผู้รับ |
phone | ใช่ | หมายเลขโทรศัพท์บ้าน |
mobile | ใช่ | หมายเลขมือถือ |
address | ใช่ | ที่อยู่โดยละเอียด (ภาษาจีน) |
province / city / area | แนะนำ | มณฑล / เมือง / เขต-อำเภอ |
town | ไม่ | ตำบล / แขวง |
Response การดูตัวอย่าง
{
"success": true,
"preview_token": "c5f75ec1-9f8d-4bf6-9de2-048d50fef349",
"currency": "CNY",
"total_product_amount": 31.0,
"total_post_fee": 8.0,
"total_amount": 39.0,
"shops": [
{
"seller_id": "b2b-2201234567",
"seller_name": "广州某某贸易有限公司",
"post_fee": 8.0,
"shop_amount": 31.0,
"items": [
{ "product_id": "734467086498", "sku_id": "5578084256927", "quantity": 2, "unit_price": 15.5, "total_price": 31.0 }
]
}
],
"unavailable_items": []
}
| ฟิลด์ | คำอธิบาย |
|---|---|
total_product_amount | ยอดรวมค่าสินค้า (CNY) |
total_post_fee | ยอดรวมค่าขนส่งภายในประเทศจีน |
total_amount | ยอดรวมที่ต้องจ่ายให้แพลตฟอร์ม = สินค้า + ค่าส่ง |
unavailable_items[] | สินค้าที่สั่งซื้อไม่ได้ (หมดสต็อก / SKU ผิด / เลิกขาย) อย่าสร้างคำสั่งซื้อหากอาร์เรย์นี้ไม่ว่าง |
Response การสร้างคำสั่งซื้อ
{
"status": "pending_payment",
"data": {
"id": "ORD0000000123",
"order_list": [
{
"success": true,
"amount": 39.0,
"post_fee": 8.0,
"lines": [
{ "sub_id": "E2101234567890", "product_id": "734467086498", "sku_id": "5578084256927", "quantity": 2, "amount": 31.0 }
]
}
]
}
}
| ฟิลด์ | คำอธิบาย |
|---|---|
data.id | ID คำสั่งซื้อภายในรูปแบบ ORD + ตัวเลข 10 หลัก — ใช้กับทุกการดำเนินการต่อจากนี้ |
status | pending_payment เมื่อสำเร็จ; unknown เมื่อระบุไม่ได้ — หยุดขั้นตอนการชำระเงิน แล้วตรวจสอบใหม่ด้วยรายละเอียดคำสั่งซื้อ |
data.order_list[] | รายละเอียดร้านค้า + รายการสินค้าจากแพลตฟอร์ม — ใช้สร้างใบเสร็จ |
คำสั่งซื้อใหม่จะอยู่ที่ payment_status = unpaid เสมอ
รายการคำสั่งซื้อ — พารามิเตอร์กรอง
GET /v1/orders
| พารามิเตอร์ | ชนิด | คำอธิบาย |
|---|---|---|
page | number | หน้าปัจจุบัน (ค่าเริ่มต้น 1) |
size | number | จำนวนคำสั่งซื้อต่อหน้า (ค่าเริ่มต้น 20) |
platform | string | taobao / alibaba — เว้นว่าง = ทั้งสอง |
status | string | กรองตามสถานะแพลตฟอร์ม |
payment_status | string | กรองตามสถานะการชำระเงิน Elim |
client_order_id | string | กรองตามรหัสคำสั่งซื้อฝั่งคุณ |
created_from / created_to | ISO date | ช่วงวันที่สร้าง |
Response: { total, page, size, items: OrderListItem[] }
{
"total": 1, "page": 1, "size": 20,
"items": [
{
"id": "ORD0000000123",
"platform": "alibaba",
"status": "paid",
"payment_status": "paid",
"total_amount_cny": 39.0,
"total_amount": 39.0,
"products": [
{ "id": "734467086498", "name": "某某商品", "price": 15.5, "quantity": 2, "img_urls": ["https://..."] }
],
"created_at": "2026-04-09T10:30:00.000Z"
}
]
}
line_items/productsในรายการเป็นสแนปช็อตตอนสร้างคำสั่งซื้อ หากต้องการข้อมูลล่าสุด ให้เรียกGET /v1/orders/:id
รายละเอียดคำสั่งซื้อ — ความแตกต่างตามแพลตฟอร์ม
GET /v1/orders/:id — ซิงค์สถานะจากแพลตฟอร์มอัตโนมัติก่อนตอบกลับ
| แพลตฟอร์ม | รายการสินค้า | การขนส่ง |
|---|---|---|
| 1688 | products[] | logistics.logistics_info[] ฝังอยู่ใน response |
| Taobao | line_items[] | เรียก GET /v1/orders/:id/logistic-detail?package_id=<int> แยกต่างหาก |
ฟิลด์ platform มีอยู่แล้วใน response รายการ — เก็บไว้เพื่อเลือกวิธีแสดงผลก่อนเรียกรายละเอียด
package_id เป็น จำนวนเต็ม ที่ได้จาก response รายละเอียดคำสั่งซื้อ Taobao ไม่ใช่ ID ORD...
ยกเลิกคำสั่งซื้อ — เงื่อนไข
POST /v1/orders/:id/cancel — เฉพาะเมื่อ status เป็น creating หรือ pending_payment
หากคำสั่งซื้อยังไม่มีรหัสคำสั่งซื้อของแพลตฟอร์ม:
{ "success": true, "message": "Internal order cancelled, no external order to cancel" }
Endpoint กระเป๋าเงินสำหรับสั่งซื้อ
Prefix /v1/purchasing
| Endpoint | Method | คำอธิบาย |
|---|---|---|
/v1/purchasing/wallet | GET | ยอดคงเหลือในกระเป๋า |
/v1/purchasing/wallet/transactions | GET | ประวัติธุรกรรม (แบ่งหน้า) |
/v1/purchasing/exchange-rates | GET | อัตราแลกเปลี่ยนที่ใช้อยู่ |
GET /v1/purchasing/wallet
{
"balance": 1670.30,
"frozen_balance": 286.50,
"available_balance": 1383.80,
"total_deposited": 5000.00,
"total_spent": 3329.70,
"updated_at": "2026-06-19T00:00:00.000Z"
}
| ฟิลด์ | คำอธิบาย |
|---|---|
balance | ยอดคงเหลือรวมเป็น CNY |
frozen_balance | ถูกกันไว้สำหรับคำสั่งซื้อที่ requested / approved |
available_balance | balance − frozen_balance — จำนวนที่ใช้ได้จริง เทียบค่านี้กับมูลค่าคำสั่งซื้อ |
total_deposited / total_spent | ตัวเลขสะสม |
GET /v1/purchasing/wallet/transactions
พารามิเตอร์: page, size, type, date_from, date_to Response: { total, page, size, items }
type | ความหมาย |
|---|---|
deposit | เติมเงินเข้ากระเป๋า |
order_freeze | กันเงินเมื่อส่งคำขอชำระเงิน |
order_unfreeze | ปลดเงินเมื่อถอนคำขอหรือถูกปฏิเสธ |
order_deduction | หักเงินเมื่อการชำระคำสั่งซื้อเสร็จสมบูรณ์ |
order_refund | คืนเงินคำสั่งซื้อเข้ากระเป๋า |
admin_adjustment | Elim ปรับยอดคงเหลือด้วยตนเอง |
GET /v1/purchasing/exchange-rates
อาร์เรย์อัตราแลกเปลี่ยนที่ใช้งานอยู่ต่อคู่สกุลเงิน (VND→CNY, USD→CNY): source_currency, target_currency, rate (อัตราตลาด), markup_percent, effective_rate (อัตราที่ Elim ใช้จริงหลังบวก markup)
Endpoint การชำระเงินคำสั่งซื้อ
Prefix /v1/purchasing/orders/:id :id รับรูปแบบ ORD...
| Endpoint | Method | จากสถานะ | สู่สถานะ | คำอธิบาย |
|---|---|---|---|---|
/request-payment | POST | unpaid | requested | ยืนยันคำสั่งซื้อและส่งคำขอชำระเงิน — กัน เงินในกระเป๋า |
/cancel-payment-request | POST | requested | unpaid | ถอนคำขอ — ปลด เงินที่กันไว้ |
/confirm | POST | unpaid | paid | ชำระเงินโดยตรง (ที่ที่เปิดใช้) — หัก เงินทันที ไม่ผ่านขั้นตอนอนุมัติ |
/payment | GET | — | — | รายละเอียดบันทึกการชำระเงินของคำสั่งซื้อ |
POST …/request-payment
{
"success": true,
"order_id": "ORD0000000123",
"frozen_amount": 286.50,
"goods_amount_cny": 281.50,
"shipping_fee_cny": 0,
"service_fee_cny": 5.00
}
ข้อผิดพลาดกระเป๋าเงินไม่พอ — 400:
{
"error": "insufficient_balance",
"current_balance": 120.00,
"available_balance": 90.00,
"required": 286.50,
"deficit": 196.50
}
POST …/confirm
{
"order_id": "ORD0000000123",
"goods_amount_cny": 281.50,
"shipping_fee_cny": 0,
"service_fee_cny": 5.00,
"total_amount_cny": 286.50,
"payment_status": "paid",
"wallet_balance_after": 1383.80
}
ใช้ wallet_balance_after เพื่ออัปเดตยอดคงเหลือที่แสดงโดยไม่ต้องเรียก GET /v1/purchasing/wallet อีกครั้ง
การเปลี่ยนสถานะที่ Elim ดำเนินการ
ผู้ใช้ ไม่ เรียกการดำเนินการเหล่านี้ รายการนี้มีไว้เพื่ออธิบายว่า payment_status จะเปลี่ยนอย่างไร และเมื่อใดที่คุณจะได้รับ payment.updated
| การดำเนินการของ Elim | จาก | สู่ | ผลต่อกระเป๋า |
|---|---|---|---|
| อนุมัติคำขอ | requested | approved | เงินยังถูกกันไว้ |
| ปฏิเสธคำขอ | requested | rejected | ปลดเงินที่กันไว้; rejection_reason ระบุเหตุผล |
| ชำระเงินแพลตฟอร์มสำเร็จ | approved | paid | หักเงินที่กันไว้; platform_payment_status = success |
| ชำระเงินแพลตฟอร์มล้มเหลว | approved | unpaid | platform_payment_status = failed; Elim จะติดต่อเพื่อจัดการ |
| คืนเงิน | paid | refunded | คืนเข้า balance; สร้างธุรกรรม order_refund |
รับอัปเดตคำสั่งซื้อผ่าน webhook
ลงทะเบียน webhook เพื่อให้ Elim เรียกเข้าระบบของคุณทุกครั้งที่ status หรือ payment_status ของคำสั่งซื้อเปลี่ยน — แทนการถามสถานะซ้ำ ๆ มีสองเหตุการณ์ที่เกี่ยวกับโมดูลคำสั่งซื้อ:
| เหตุการณ์ | ส่งเมื่อใด |
|---|---|
order.updated | status ของคำสั่งซื้อเปลี่ยน: ซิงค์จากแพลตฟอร์ม, ซิงค์ตามรอบ, หรือยกเลิกคำสั่งซื้อ |
payment.updated | payment_status เปลี่ยน: ส่งคำขอ, ถอนคำขอ, อนุมัติ, ปฏิเสธ, แพลตฟอร์มชำระเงินเสร็จ/ล้มเหลว, หรือคืนเงิน |
Payload บรรจุสแนปช็อตของคำสั่งซื้อ: data.order.id, status, payment_status, platform_payment_status, total_amount_cny, updated_at เมื่อประมวลผลเสร็จให้ตอบกลับ HTTP 2xx
endpoint การลงทะเบียน, โครงสร้าง payload ฉบับเต็ม, header, การตรวจสอบลายเซ็น HMAC และนโยบายลองใหม่: ดู เอกสารอ้างอิง Webhook
รหัสข้อผิดพลาด
| HTTP | สถานการณ์ | สิ่งที่ควรทำฝั่งคุณ |
|---|---|---|
400 | insufficient_balance | เติมเงิน CNY เพิ่มอีก deficit แล้วส่งคำขอใหม่ |
400 | Cannot request payment: current status is "..." | คำสั่งซื้อไม่ได้อยู่ที่ unpaid แล้ว |
400 | รูปแบบ ID แพลตฟอร์มไม่ถูกต้อง | ตรวจสอบ product_ref / sku_ref |
401 | JWT หมดอายุ | ขอ token ใหม่ |
403 | เข้าถึงคำสั่งซื้อที่ไม่ใช่ของบัญชี | ดำเนินการเฉพาะกับคำสั่งซื้อของตนเอง |
404 | ไม่พบคำสั่งซื้อ / บันทึกการชำระเงิน | ตรวจสอบ ID ORD... อีกครั้ง |
422 | LINE_ITEM_SKU_NOT_RESOLVABLE / LINE_ITEM_PRODUCT_NOT_RESOLVABLE (Taobao) | sku_ref / product_ref ผิด — ดึงใหม่จากรายละเอียดสินค้า |
429 | เกิน rate limit | รอประมาณ 60 วินาที แล้วปรับจังหวะการเรียก |
502 | แพลตฟอร์ม Taobao/1688 ไม่ตอบสนอง | ลองใหม่ อย่าสร้างคำสั่งซื้อซ้ำ |
Response ข้อผิดพลาดเป็นรูปแบบ { statusCode, message, error } message บางครั้งเป็นภาษาเวียดนามและแสดงต่อผู้ใช้ได้โดยตรง
ข้อกำหนดเรื่อง ID
- ID คำสั่งซื้อภายใน:
ORD+ ตัวเลข 10 หลัก เช่นORD0000000123ใช้กับทุก endpoint - รหัสคำสั่งซื้อแพลตฟอร์ม (
order_id): ออกโดย Taobao/1688 มีเฉพาะหลังสร้างคำสั่งซื้อสำเร็จ package_id: จำนวนเต็ม ใช้สำหรับติดตามการขนส่ง Taobao
ลิงก์ที่เกี่ยวข้อง
- คู่มือการสั่งซื้อและชำระเงินคำสั่งซื้อ Taobao/1688 — ขั้นตอนทีละขั้น
- เอกสารอ้างอิง Webhook — รับอัปเดต
order.updated/payment.updated - การยืนยันตัวตนคำขอ API
- เอกสารอ้างอิง API ฉบับเต็ม