Elimapi Docs

Hướng dẫn API đơn hàng

Chức năng này hiện tại chỉ hỗ trợ thị trường Việt Nam. Chúng tôi sẽ bổ sung các thị trường khác trong thời gian tới. Vui lòng theo dõi thông tin cập nhật.

API đơn hàng cho phép bạn tạo và quản lý đơn mua hộ trên Taobao và 1688 (Alibaba). Mỗi đơn hàng duy trì hai trạng thái độc lập: trạng thái nền tảng (status) do Taobao/1688 trả về và trạng thái thanh toán Elim (payment_status) do hệ thống ví mua hàng quản lý.

Tất cả endpoint yêu cầu xác thực JWT qua header Authorization: Bearer <token> hoặc API Key (X-API-KEY)

Hướng dẫn authentication: Authentication

Trạng thái đơn hàng

Trước khi sử dụng API, hãy nắm rõ hai chiều trạng thái của một đơn hàng để tránh nhầm lẫn khi hiển thị cho người dùng cuối.

Trạng thái nền tảng (status)

Trạng thái phản ánh tiến trình xử lý đơn phía Taobao hoặc 1688.

Giá trịMô tảPlatform
creatingĐơn vừa được khởi tạo, đang chờ nền tảng xác nhận✅ Taobao ✅ 1688
pending_paymentNền tảng đã tạo đơn, chờ thanh toán✅ Taobao ✅ 1688
paidĐơn đã thanh toán phía nền tảng✅ Taobao ✅ 1688
shippedHàng đã xuất kho, đang vận chuyển✅ Taobao ✅ 1688
completedĐơn hoàn tất, người mua đã xác nhận nhận hàng✅ Taobao ✅ 1688
cancelledĐơn đã bị hủy✅ Taobao ✅ 1688
unknownKhông parse được trạng thái từ nền tảng✅ Taobao ✅ 1688

Trạng thái thanh toán Elim (payment_status)

Trạng thái phản ánh việc đơn hàng đã được thanh toán cho Elim hay chưa. Đây là trạng thái độc lập với status — một đơn có thể ở status=shipped nhưng vẫn payment_status=unpaid nếu có sự cố.

Giá trịMô tả
unpaidChưa thanh toán — mặc định khi tạo đơn
paidĐã trừ ví mua hàng thành công
refundedĐã hoàn tiền về ví sau khi đơn bị hủy
Luôn hiển thị cả hai trường `status` và `payment_status` trong giao diện. Đừng gộp chúng thành một trạng thái duy nhất — người dùng cần biết cả tiến trình đơn hàng lẫn tình trạng thanh toán.

Xem trước đơn hàng

Xem chi tiết: Preview đơn hàng

Trước khi tạo đơn thật, gọi endpoint preview để lấy tổng tiền ước tính và kiểm tra tình trạng hàng hóa. Bước này không tạo đơn, không trừ tiền — chỉ trả về thông tin để người dùng xác nhận trước khi checkout.

Rate limit: 20 request / 60 giây

POST /v1/orders/preview

Body:

{
  "platform": "alibaba",
  "receiver_address": {
    "name": "Nguyễn Văn A",
    "phone": "02812345678",
    "mobile": "13800138000",
    "address": "广州市天河区体育西路123号",
    "province": "广东省",
    "city": "广州市",
    "area": "天河区"
  },
  "line_items": [
    {
      "mp_id": "734467086498",
      "id": "5578084256927",
      "quantity": 2,
      "price": 15.5
    }
  ]
}
Thông tin địa chỉ nhận hàng cần phải là 1 địa chỉ hợp lệ ở Trung Quốc.

Giải thích các trường line_items

TrườngKiểuBắt buộcMô tả
mp_idstringID sản phẩm — mp_id (Taobao) / offerId (1688)
idstringID SKU — mp_skuid (Taobao) / spec_id (1688)
quantitynumberSố lượng mua
pricenumberKhôngĐơn giá CNY — bắt buộc khi muốn preview chính xác

Xử lý unavailable_items

Response trả về mảng unavailable_items chứa các sản phẩm không thể đặt (hết hàng, SKU sai, ngừng bán). Không cho phép tạo đơn nếu mảng này khác rỗng — hỏi người dùng xử lý các item lỗi trước.

{
  "unavailable_items": [{ "mp_id": "123456", "id": "sku_789", "reason": "out_of_stock" }]
}

Tham số tùy chọn

Tham sốMô tảPlatform
remarkGhi chú đính kèm đơn✅ Taobao ✅ 1688
promotion_idID chương trình khuyến mãi✅ Taobao ✅ 1688

Tạo đơn hàng

Xem chi tiết: Tạo đơn hàng

Tạo đơn thật trên nền tảng. Body giống hệt preview — nên dùng dữ liệu đã validate từ bước preview để tạo đơn, tránh sai lệch.

Rate limit: 10 request / 60 giây

POST /v1/orders

Sau khi tạo thành công, redirect người dùng sang trang chi tiết đơn (/orders/ORD...). Đừng giữ người dùng ở giỏ hàng vì đơn đã được gửi lên nền tảng.

Xử lý response

TrườngMô tả
data.idID nội bộ dạng ORD0000000001 — dùng cho mọi thao tác tiếp theo
statuspending_payment nếu thành công; unknown nếu có lỗi xảy ra
data.order_list[]Chi tiết shop + sản phẩm từ nền tảng — dùng để hiển thị biên nhận
Nếu response trả về `status: "unknown"`, hiển thị cảnh báo cho người dùng: "Đơn có thể chưa được tạo — vui lòng liên hệ hỗ trợ." Đừng tiếp tục flow thanh toán trong trường hợp này.

Quy ước ID: Elim ID luôn có dạng ORD + 10 chữ số (ví dụ: ORD0000000123). Đơn hàng tạo mới thành công mới có ID của nền tảng order_id.

Danh sách đơn hàng

Xem chi tiết: Danh sách đơn hàng

Lấy danh sách đơn của người dùng hiện tại (xác định qua JWT). Kết quả được phân trang.

Rate limit: 30 request / 60 giây

GET /v1/orders

Tham số lọc

Tham sốKiểuMô tả
pagenumberTrang hiện tại — mặc định 1
sizenumberSố item mỗi trang — mặc định 20
platformstringtaobao hoặc alibaba — bỏ trống = cả hai
statusOrderStatusLọc theo trạng thái nền tảng
created_fromISO dateLọc từ ngày
created_toISO dateLọc đến ngày

Response: { total, page, size, items: OrderListItem[] }

Trường `line_items` trong danh sách là snapshot đơn hàng khi khởi tạo. Muốn lấy thông tin đơn hàng mới nhất và chính xác — gọi `GET /v1/orders/:id`.

Chi tiết đơn hàng

Xem chi tiết: Chi tiết đơn hàng

Lấy thông tin đầy đủ và cập nhật nhất của một đơn.

Rate limit: 30 request / 60 giây

GET /v1/orders/:id

Truyền ID dạng ORD....

Khác biệt response giữa Taobao và 1688

Hai nền tảng trả về cấu trúc dữ liệu khác nhau — cần xử lý riêng:

Nền tảngSản phẩmLogistics
1688products[]logistics.logistics_info[] — nhúng sẵn trong response
Taobaoline_items[]Phải gọi riêng GET /v1/orders/:packageId/logistic-detail

Trường platform có sẵn trong response danh sách — cache lại từ list view để biết render component nào trước khi gọi detail.

Hủy đơn hàng

Xem chi tiết: Hủy đơn hàng

Hủy một đơn đang ở trạng thái có thể hủy được. Sau khi hệ thống hủy thành công, gọi lại GET /v1/orders/:id để lấy trạng thái mới nhất.

Rate limit: 10 request / 60 giây

POST /v1/orders/:id/cancel

Điều kiện: Chỉ hủy được khi statuscreating hoặc pending_payment. Disable nút hủy ở các trạng thái khác.

Nếu đơn chưa có platform order ID (nền tảng chưa xử lý kịp), hệ thống trả về `{ success: true, message: 'Internal order cancelled, no external order to cancel' }` — đơn đã được hủy ở Elim API nhưng không có thao tác nào trên Taobao/1688.

Theo dõi vận chuyển

Xem chi tiết: Logistic detail

Lấy thông tin tracking vận chuyển nội địa Trung Quốc. Chỉ áp dụng cho Taobao — đơn 1688 đã có logistics.logistics_info[] nhúng sẵn trong response chi tiết đơn.

Rate limit: 20 request / 60 giây

GET /v1/orders/:packageId/logistic-detail

packageIdsố nguyên, lấy từ response chi tiết đơn Taobao — không phải ID dạng ORD....

Thanh toán đơn hàng

Elim đóng vai trò đại lý mua hộ: người dùng thanh toán cho Elim qua ví mua hàng (đơn vị CNY), Elim thanh toán lại với nền tảng ngoài hệ thống. Quy trình đầy đủ:

Preview → Tạo đơn (payment_status=unpaid) → Xác nhận thanh toán ví → payment_status=paid

Xem số dư ví

GET /v1/purchasing/wallet

Response: { balance, frozen_balance, available }available = balance - frozen_balance.

Xác nhận thanh toán

POST /v1/purchasing/orders/:id/confirm

Hệ thống kiểm tra ví → trừ tiền → cập nhật payment_status = paid.

Response thành công (200):

{
  "order_id": "ORD0000000001",
  "goods_amount_cny": 299.0,
  "shipping_fee_cny": 15.0,
  "service_fee_cny": 15.7,
  "total_amount_cny": 329.7,
  "paid_at": "2026-04-13T10:00:00.000Z",
  "balance_after": 1670.3
}

Dùng balance_after để cập nhật số dư ví mới nhất mà không cần gọi thêm GET /v1/purchasing/wallet.

Xử lý lỗi không đủ số dư

Khi ví không đủ tiền, hệ thống trả 400 với body:

{
  "error": "insufficient_balance",
  "deficit": 50.3,
  "current_balance": 279.4,
  "required": 329.7
}

Hiển thị modal thông báo thiếu bao nhiêu CNY và hướng dẫn nạp thêm. Quy trình nạp tiền thực hiện ngoài hệ thống (chuyển khoản) — admin xác nhận và cộng ví thủ công.

Phí dịch vụ

Phí dịch vụ tính theo công thức: max(tổng_đơn × fee_percent, min_fee). Phần trăm và mức tối thiểu do admin cấu hình.

Lịch sử giao dịch ví

GET /v1/purchasing/wallet/transactions
Tham sốMô tả
pageTrang
sizeSố item mỗi trang
typedeposit / order_deduction / order_refund / admin_adjustment
date_fromLọc từ ngày (ISO date)
date_toLọc đến ngày (ISO date)

Tỷ giá

GET /v1/purchasing/exchange-rates

Trả về tỷ giá hiện hành VND → CNY và USD → CNY do Elim cấu hình. Hiển thị tỷ giá này cho người dùng biết trước khi nạp tiền.

Xử lý lỗi

HTTPTình huốngXử lý ở phía bạn
400insufficient_balanceThông báo cho người dùng biết ví không đủ tiền
400Sai format platform IDThông báo lỗi validate
401JWT hết hạnThông báo lỗi hết hạn, yêu cầu người dùng đăng nhập lại
404Order không tồn tạiHiển thị trạng thái đơn không tìm thấy
429Rate limitThông báo lỗi rate limit, yêu cầu người dùng thử lại sau
502Nền tảng Taobao/1688 không phản hồiThông báo lỗi, yêu cầu người dùng thử lại

Tất cả response lỗi theo shape { statusCode, message, error }. Message đôi khi là tiếng Việt — có thể hiển thị trực tiếp cho người dùng.