Tham chiếu API đơn hàng
Tóm tắt
Trang này liệt kê trạng thái, endpoint, tham số và mã lỗi của module đơn hàng. Để đi theo quy trình đầy đủ, xem Hướng dẫn đặt & thanh toán đơn Taobao/1688. Cách nhận cập nhật đơn qua webhook có trang tham chiếu riêng.
Phạm vi: Đã hỗ trợ nhiều thị trường. Thanh toán được thống nhất bằng VNĐ, USD hoặc RMB (CNY) — ví mua hàng nạp bằng một trong ba đồng tiền này; số dư và giá trị đơn trong API quy về đơn vị chung (
*_cny).
Elim là nền tảng công nghệ lo khâu thực thi đơn và thanh toán — không bán lẻ, không nhận khách trực tiếp. Hệ thống của bạn thanh toán cho Elim qua ví mua hàng, Elim thanh toán lại với người bán trên nền tảng. Vì vậy mỗi đơn có hai trạng thái độc lập — trạng thái nền tảng (status) và trạng thái thanh toán với Elim (payment_status) — cộng một chỉ báo kết quả thanh toán phía nền tảng (platform_payment_status).
Mọi endpoint yêu cầu xác thực JWT (Authorization: Bearer <token>) hoặc API Key (x-api-key). Xem Hướng dẫn xác thực.
Trạng thái nền tảng (status)
Tiến trình xử lý đơn phía Taobao / 1688.
| Giá trị | Mô tả |
|---|---|
creating | Đơn vừa khởi tạo, chờ nền tảng xác nhận |
pending_payment | Nền tảng đã tạo đơn, chờ thanh toán |
paid | Đơn đã thanh toán phía nền tảng |
shipped | Hàng đã xuất kho, đang vận chuyển |
completed | Đơn hoàn tất, đã xác nhận nhận hàng |
cancelled | Đơn đã bị hủy |
unknown | Không đọc được trạng thái từ nền tảng |
creating → pending_payment → paid → shipped → completed
↘ cancelled
Trạng thái thanh toán Elim (payment_status)
Tiến trình thanh toán giữa người dùng và Elim. Độc lập với status.
| Giá trị | Mô tả | Tiền trong ví |
|---|---|---|
unpaid | Mặc định khi tạo đơn — chưa gửi yêu cầu thanh toán | Chưa tác động |
requested | Người dùng đã gửi yêu cầu thanh toán | Đã giữ (frozen_balance) |
approved | Elim đã duyệt yêu cầu, đang thanh toán nền tảng | Vẫn đang giữ |
paid | Thanh toán hoàn tất | Đã trừ khỏi balance |
rejected | Elim từ chối yêu cầu (rejection_reason có lý do) | Đã giải phóng lại |
refunded | Đơn đã thanh toán được hoàn tiền về ví | Đã cộng lại vào balance |
unpaid → requested → approved → paid → refunded
↑ ↓
└──── rejected
Từ requested, người dùng có thể tự rút yêu cầu để quay lại unpaid (xem cancel-payment-request). Sau khi approved thì chỉ đảo ngược được bằng hoàn tiền.
Kết quả thanh toán nền tảng (platform_payment_status)
Chỉ có giá trị sau khi Elim thực hiện thanh toán với nền tảng.
| Giá trị | Mô tả |
|---|---|
pending | Đang gửi lệnh thanh toán tới nền tảng |
success | Nền tảng ghi nhận đã thanh toán |
failed | Nền tảng báo lỗi — Elim sẽ xử lý thủ công |
unknown | Chưa xác định được kết quả |
Luôn hiển thị cả
statusvàpayment_statustrong giao diện.platform_payment_statuschủ yếu để chẩn đoán khi có sự cố.
Endpoint đơn hàng
Prefix /v1/orders. Rate limit tính theo giây.
| Endpoint | Method | Mô tả | Rate limit |
|---|---|---|---|
/v1/orders/preview | POST | Xem trước đơn: tổng tiền ước tính, kiểm tra còn hàng — không tạo đơn, không trừ tiền | 20 / 60s |
/v1/orders | POST | Tạo đơn thật trên nền tảng | 10 / 60s |
/v1/orders | GET | Danh sách đơn của người dùng hiện tại (phân trang) | 30 / 60s |
/v1/orders/stats | GET | Thống kê tổng hợp đơn theo khoảng thời gian / trạng thái | 30 / 60s |
/v1/orders/:id | GET | Chi tiết đơn — tự đồng bộ trạng thái mới nhất từ nền tảng mỗi lần gọi | 30 / 60s |
/v1/orders/:id/cancel | POST | Hủy đơn khi còn ở trạng thái hủy được | 10 / 60s |
/v1/orders/:id/logistic-detail?package_id=<int> | GET | Tracking vận chuyển nội địa Trung Quốc (chỉ Taobao) | 20 / 60s |
Preview và tạo đơn — 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": "Ghi chú cho người bán",
"promotion_id": "PROMO123"
}
| Trường | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
platform | string | Có | taobao hoặc alibaba (1688) |
receiver_address | Address | Có | Địa chỉ nhận hàng hợp lệ tại Trung Quốc |
warehouse_address | Address | Không | Địa chỉ kho gửi hàng |
line_items | LineItem[] | Có | Danh sách mặt hàng (xem bên dưới) |
preview_token | string | Không | Token từ preview; dùng một lần, hết hạn sau 10 phút. Gửi kèm khi tạo đơn để khóa đúng mức giá đã xem |
idempotency_key | string | Nên có | Khóa chống tạo trùng cho mỗi lần checkout. Request lặp với cùng khóa trả về cùng một đơn |
client_order_id | string | Không | Mã đơn từ hệ thống của bạn (tự sinh nếu bỏ trống) |
promotion_id | string | Không | Mã khuyến mãi |
remark | string | Không | Ghi chú cho người bán |
line_items[]
Mỗi phần tử định danh mặt hàng bằng cặp product_ref + sku_ref, lấy trực tiếp từ tìm kiếm / chi tiết sản phẩm.
| Trường | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
product_ref | string | Có | ID hoặc link sản phẩm từ response tìm sản phẩm |
sku_ref | string | Có | ID SKU tương ứng — Taobao: skus[].id · 1688: skus[].spec_id |
quantity | number | Có | Số lượng |
price | number | Không | Đơn giá CNY — nên có để preview ra số chính xác |
Cặp
mp_id+mp_skuid(ID marketplace) vẫn được chấp nhận cho tương thích ngược.
receiver_address
| Trường | Bắt buộc | Mô tả |
|---|---|---|
name | Có | Tên người nhận |
phone | Có | Số điện thoại bàn |
mobile | Có | Số di động |
address | Có | Địa chỉ chi tiết (tiếng Trung) |
province / city / area | Nên có | Tỉnh / Thành phố / Quận-huyện |
town | Không | Phường / xã |
Response preview
{
"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": []
}
| Trường | Mô tả |
|---|---|
total_product_amount | Tổng tiền hàng (CNY) |
total_post_fee | Tổng phí vận chuyển nội địa Trung Quốc |
total_amount | Tổng phải trả cho nền tảng = hàng + ship |
unavailable_items[] | Mặt hàng không đặt được (hết hàng / sai SKU / ngừng bán). Không tạo đơn nếu mảng này khác rỗng |
Response tạo đơn
{
"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 }
]
}
]
}
}
| Trường | Mô tả |
|---|---|
data.id | ID đơn nội bộ dạng ORD + 10 chữ số — dùng cho mọi thao tác sau này |
status | pending_payment khi thành công; unknown khi không xác định được — dừng flow thanh toán, kiểm tra lại bằng chi tiết đơn |
data.order_list[] | Chi tiết shop + dòng hàng từ nền tảng — dùng dựng biên nhận |
Đơn mới luôn ở payment_status = unpaid.
Danh sách đơn — tham số lọc
GET /v1/orders
| Tham số | Kiểu | Mô tả |
|---|---|---|
page | number | Trang hiện tại (mặc định 1) |
size | number | Số đơn mỗi trang (mặc định 20) |
platform | string | taobao / alibaba — bỏ trống = cả hai |
status | string | Lọc theo trạng thái nền tảng |
payment_status | string | Lọc theo trạng thái thanh toán Elim |
client_order_id | string | Lọc theo mã đơn phía bạn |
created_from / created_to | ISO date | Khoảng ngày tạo |
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/productstrong danh sách là ảnh chụp lúc tạo đơn. Muốn dữ liệu mới nhất, gọiGET /v1/orders/:id.
Chi tiết đơn — khác biệt theo nền tảng
GET /v1/orders/:id — tự đồng bộ trạng thái từ nền tảng trước khi trả về.
| Nền tảng | Danh sách hàng | Vận chuyển |
|---|---|---|
| 1688 | products[] | logistics.logistics_info[] nhúng sẵn trong response |
| Taobao | line_items[] | Gọi riêng GET /v1/orders/:id/logistic-detail?package_id=<int> |
Trường platform có sẵn trong response danh sách — lưu lại để chọn cách hiển thị trước khi gọi chi tiết.
package_id là số nguyên lấy từ response chi tiết đơn Taobao, không phải ID ORD....
Hủy đơn — điều kiện
POST /v1/orders/:id/cancel — chỉ khi status là creating hoặc pending_payment.
Nếu đơn chưa có mã đơn nền tảng:
{ "success": true, "message": "Internal order cancelled, no external order to cancel" }.
Endpoint ví mua hàng
Prefix /v1/purchasing.
| Endpoint | Method | Mô tả |
|---|---|---|
/v1/purchasing/wallet | GET | Số dư ví |
/v1/purchasing/wallet/transactions | GET | Lịch sử giao dịch (phân trang) |
/v1/purchasing/exchange-rates | GET | Tỷ giá đang áp dụng |
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"
}
| Trường | Mô tả |
|---|---|
balance | Tổng số dư CNY |
frozen_balance | Đang bị giữ cho các đơn requested / approved |
available_balance | balance − frozen_balance — số thực dùng được. So số này với giá trị đơn |
total_deposited / total_spent | Số liệu tích lũy |
GET /v1/purchasing/wallet/transactions
Tham số: page, size, type, date_from, date_to. Response: { total, page, size, items }.
type | Ý nghĩa |
|---|---|
deposit | Nạp tiền vào ví |
order_freeze | Giữ tiền khi gửi yêu cầu thanh toán |
order_unfreeze | Giải phóng tiền khi rút yêu cầu hoặc bị từ chối |
order_deduction | Trừ tiền khi thanh toán đơn hoàn tất |
order_refund | Hoàn tiền đơn về ví |
admin_adjustment | Elim điều chỉnh số dư thủ công |
GET /v1/purchasing/exchange-rates
Mảng tỷ giá đang hoạt động cho từng cặp tiền tệ (VND→CNY, USD→CNY): source_currency, target_currency, rate (tỷ giá thị trường), markup_percent, effective_rate (tỷ giá Elim áp dụng sau markup).
Endpoint thanh toán đơn hàng
Prefix /v1/purchasing/orders/:id. :id nhận dạng ORD....
| Endpoint | Method | Từ trạng thái | Sang trạng thái | Mô tả |
|---|---|---|---|---|
/request-payment | POST | unpaid | requested | Xác nhận đơn và gửi yêu cầu thanh toán — giữ tiền trong ví |
/cancel-payment-request | POST | requested | unpaid | Rút yêu cầu — giải phóng tiền đã giữ |
/confirm | POST | unpaid | paid | Thanh toán trực tiếp (nơi được bật) — trừ tiền ngay, không qua bước duyệt |
/payment | GET | — | — | Chi tiết bản ghi thanh toán của đơn |
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
}
Lỗi ví không đủ — 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
}
Dùng wallet_balance_after để cập nhật số dư hiển thị mà không phải gọi lại GET /v1/purchasing/wallet.
Các chuyển trạng thái do Elim thực hiện
Người dùng không gọi các thao tác này. Chúng được liệt kê để giải thích payment_status sẽ đổi thế nào và khi nào bạn nhận payment.updated.
| Thao tác của Elim | Từ | Sang | Tác động ví |
|---|---|---|---|
| Duyệt yêu cầu | requested | approved | Tiền vẫn giữ |
| Từ chối yêu cầu | requested | rejected | Giải phóng tiền đã giữ; rejection_reason có lý do |
| Thanh toán nền tảng thành công | approved | paid | Trừ tiền đã giữ; platform_payment_status = success |
| Thanh toán nền tảng lỗi | approved | unpaid | platform_payment_status = failed; Elim liên hệ xử lý |
| Hoàn tiền | paid | refunded | Cộng lại vào balance; sinh giao dịch order_refund |
Nhận cập nhật đơn qua webhook
Đăng ký webhook để Elim gọi vào hệ thống của bạn mỗi khi status hoặc payment_status của đơn đổi — thay cho việc hỏi trạng thái liên tục. Hai sự kiện liên quan module đơn hàng:
| Sự kiện | Khi nào gửi |
|---|---|
order.updated | status đơn đổi: đồng bộ từ nền tảng, đồng bộ định kỳ, hoặc hủy đơn |
payment.updated | payment_status đổi: gửi yêu cầu, rút yêu cầu, duyệt, từ chối, nền tảng thanh toán xong/lỗi, hoặc hoàn tiền |
Payload mang một ảnh chụp đơn: data.order.id, status, payment_status, platform_payment_status, total_amount_cny, updated_at. Xử lý xong thì trả HTTP 2xx.
Endpoint đăng ký, cấu trúc payload đầy đủ, header, xác minh chữ ký HMAC và chính sách thử lại: xem Tham chiếu Webhook.
Mã lỗi
| HTTP | Tình huống | Xử lý phía bạn |
|---|---|---|
400 | insufficient_balance | Nạp thêm deficit CNY rồi gửi lại yêu cầu |
400 | Cannot request payment: current status is "..." | Đơn không còn ở unpaid |
400 | Sai định dạng ID nền tảng | Kiểm tra product_ref / sku_ref |
401 | JWT hết hạn | Lấy token mới |
403 | Truy cập đơn không thuộc tài khoản | Chỉ thao tác trên đơn của chính mình |
404 | Đơn / bản ghi thanh toán không tồn tại | Kiểm tra lại ID ORD... |
422 | LINE_ITEM_SKU_NOT_RESOLVABLE / LINE_ITEM_PRODUCT_NOT_RESOLVABLE (Taobao) | sku_ref / product_ref sai — lấy lại từ chi tiết sản phẩm |
429 | Vượt rate limit | Chờ ~60 giây, giãn nhịp gọi |
502 | Nền tảng Taobao/1688 không phản hồi | Thử lại; không tạo đơn trùng |
Response lỗi theo dạng { statusCode, message, error }. message đôi khi là tiếng Việt và có thể hiển thị trực tiếp.
Quy ước ID
- ID đơn nội bộ:
ORD+ 10 chữ số, ví dụORD0000000123. Dùng cho mọi endpoint. - Mã đơn nền tảng (
order_id): do Taobao/1688 cấp, chỉ có sau khi tạo đơn thành công. package_id: số nguyên, dùng cho tracking vận chuyển Taobao.
Liên kết liên quan
- Hướng dẫn đặt & thanh toán đơn Taobao/1688 — quy trình từng bước
- Tham chiếu Webhook — nhận cập nhật
order.updated/payment.updated - Xác thực API requests
- API Reference đầy đủ