Chuyển đến nội dung chính
Elimapi

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_paymentNền tảng đã tạo đơn, chờ thanh toán
paidĐơn đã thanh toán phía nền tảng
shippedHà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
unknownKhô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í
unpaidMặc định khi tạo đơn — chưa gửi yêu cầu thanh toánChưa tác động
requestedNgười dùng đã gửi yêu cầu thanh toánĐã giữ (frozen_balance)
approvedElim đã duyệt yêu cầu, đang thanh toán nền tảngVẫn đang giữ
paidThanh toán hoàn tấtĐã trừ khỏi balance
rejectedElim 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
successNền tảng ghi nhận đã thanh toán
failedNền tảng báo lỗi — Elim sẽ xử lý thủ công
unknownChưa xác định được kết quả

Luôn hiển thị cả statuspayment_status trong giao diện. platform_payment_status chủ yếu để chẩn đoán khi có sự cố.

Endpoint đơn hàng

Prefix /v1/orders. Rate limit tính theo giây.

EndpointMethodMô tảRate limit
/v1/orders/previewPOSTXem 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ền20 / 60s
/v1/ordersPOSTTạo đơn thật trên nền tảng10 / 60s
/v1/ordersGETDanh sách đơn của người dùng hiện tại (phân trang)30 / 60s
/v1/orders/statsGETThống kê tổng hợp đơn theo khoảng thời gian / trạng thái30 / 60s
/v1/orders/:idGETChi tiết đơn — tự đồng bộ trạng thái mới nhất từ nền tảng mỗi lần gọi30 / 60s
/v1/orders/:id/cancelPOSTHủy đơn khi còn ở trạng thái hủy được10 / 60s
/v1/orders/:id/logistic-detail?package_id=<int>GETTracking 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ườngKiểuBắt buộcMô tả
platformstringtaobao hoặc alibaba (1688)
receiver_addressAddressĐịa chỉ nhận hàng hợp lệ tại Trung Quốc
warehouse_addressAddressKhôngĐịa chỉ kho gửi hàng
line_itemsLineItem[]Danh sách mặt hàng (xem bên dưới)
preview_tokenstringKhôngToken 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_keystringNê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_idstringKhôngMã đơn từ hệ thống của bạn (tự sinh nếu bỏ trống)
promotion_idstringKhôngMã khuyến mãi
remarkstringKhôngGhi 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ườngKiểuBắt buộcMô tả
product_refstringID hoặc link sản phẩm từ response tìm sản phẩm
sku_refstringID SKU tương ứng — Taobao: skus[].id · 1688: skus[].spec_id
quantitynumberSố lượng
pricenumberKhô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ườngBắt buộcMô tả
nameTên người nhận
phoneSố điện thoại bàn
mobileSố di động
addressĐịa chỉ chi tiết (tiếng Trung)
province / city / areaNên cóTỉnh / Thành phố / Quận-huyện
townKhôngPhườ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ườngMô tả
total_product_amountTổng tiền hàng (CNY)
total_post_feeTổng phí vận chuyển nội địa Trung Quốc
total_amountTổ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ườngMô tả
data.idID đơn nội bộ dạng ORD + 10 chữ số — dùng cho mọi thao tác sau này
statuspending_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ểuMô tả
pagenumberTrang hiện tại (mặc định 1)
sizenumberSố đơn mỗi trang (mặc định 20)
platformstringtaobao / alibaba — bỏ trống = cả hai
statusstringLọc theo trạng thái nền tảng
payment_statusstringLọc theo trạng thái thanh toán Elim
client_order_idstringLọc theo mã đơn phía bạn
created_from / created_toISO dateKhoả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 / products trong danh sách là ảnh chụp lúc tạo đơn. Muốn dữ liệu mới nhất, gọi GET /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ảngDanh sách hàngVận chuyển
1688products[]logistics.logistics_info[] nhúng sẵn trong response
Taobaoline_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_idsố 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 statuscreating 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.

EndpointMethodMô tả
/v1/purchasing/walletGETSố dư ví
/v1/purchasing/wallet/transactionsGETLịch sử giao dịch (phân trang)
/v1/purchasing/exchange-ratesGETTỷ 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ườngMô tả
balanceTổng số dư CNY
frozen_balanceĐang bị giữ cho các đơn requested / approved
available_balancebalance − frozen_balance — số thực dùng được. So số này với giá trị đơn
total_deposited / total_spentSố 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
depositNạp tiền vào ví
order_freezeGiữ tiền khi gửi yêu cầu thanh toán
order_unfreezeGiải phóng tiền khi rút yêu cầu hoặc bị từ chối
order_deductionTrừ tiền khi thanh toán đơn hoàn tất
order_refundHoàn tiền đơn về ví
admin_adjustmentElim đ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....

EndpointMethodTừ trạng tháiSang trạng tháiMô tả
/request-paymentPOSTunpaidrequestedXác nhận đơn và gửi yêu cầu thanh toán — giữ tiền trong ví
/cancel-payment-requestPOSTrequestedunpaidRút yêu cầu — giải phóng tiền đã giữ
/confirmPOSTunpaidpaidThanh toán trực tiếp (nơi được bật) — trừ tiền ngay, không qua bước duyệt
/paymentGETChi 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 ElimTừSangTác động ví
Duyệt yêu cầurequestedapprovedTiền vẫn giữ
Từ chối yêu cầurequestedrejectedGiải phóng tiền đã giữ; rejection_reason có lý do
Thanh toán nền tảng thành côngapprovedpaidTrừ tiền đã giữ; platform_payment_status = success
Thanh toán nền tảng lỗiapprovedunpaidplatform_payment_status = failed; Elim liên hệ xử lý
Hoàn tiềnpaidrefundedCộ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ệnKhi nào gửi
order.updatedstatus đơn đổi: đồng bộ từ nền tảng, đồng bộ định kỳ, hoặc hủy đơn
payment.updatedpayment_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

HTTPTình huốngXử lý phía bạn
400insufficient_balanceNạp thêm deficit CNY rồi gửi lại yêu cầu
400Cannot request payment: current status is "..."Đơn không còn ở unpaid
400Sai định dạng ID nền tảngKiểm tra product_ref / sku_ref
401JWT hết hạnLấy token mới
403Truy cập đơn không thuộc tài khoảnChỉ 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ạiKiểm tra lại ID ORD...
422LINE_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
429Vượt rate limitChờ ~60 giây, giãn nhịp gọi
502Nền tảng Taobao/1688 không phản hồiThử 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