Checkout giỏ hàng
Tạo đơn hàng từ giỏ hàng (cart) sau khi đã quote.
Endpoint
PUT /site/customercarts/{uuid}/checkout
Headers
| Key | Value | Bắt buộc | Mô tả |
|---|---|---|---|
SiteTenantId | {tenant_id} | Có | ID của công ty/tenant. |
SiteAuthorization | {jwt_token} | Không | Token khách hàng (nếu đã đăng nhập). |
Workflow & Logic
API này dùng để checkout cart và tạo Order dựa trên quote hiện tại của giỏ hàng.
Luồng xử lý bao gồm: xác định khách hàng, đồng bộ thông tin checkout vào cart, tính lại quote (nếu cần), build payload order và gọi API tạo đơn.
Quy trình xử lý
-
Lấy & kiểm tra giỏ hàng theo
uuid- Hệ thống tìm cart theo
uuidtrong shop hiện tại (SiteTenantId). - Nếu cart đã gắn với một khách hàng, khách hàng khác đang đăng nhập không dùng được cart này. Khách chưa đăng nhập vẫn dùng được cart bằng
uuid. - Nếu không tồn tại → trả lỗi
error_cart_not_found.
- Hệ thống tìm cart theo
-
Xác định
customer_idcho Order-
Nếu request đi kèm token hợp lệ của shop này (khách đã đăng nhập): dùng
customer_idtừ phiên đăng nhập. -
Nếu guest:
- Đọc setting
website_checkout_create_new_customer. - Nếu setting cho phép và
create_customer = 1trong request → hệ thống tạo mới khách hàng từ thông tin đơn hàng. - Ngược lại → dùng
website_order_default_customer_idlàm khách mặc định.
- Đọc setting
-
-
Gán store xử lý mặc định
- Luôn dùng
website_order_default_storetừ setting làmstore_id(giá trịstore_idtrong request bị bỏ qua). - Đảm bảo đơn hàng luôn được gán vào một store xử lý cụ thể.
- Luôn dùng
-
Sync thông tin checkout & tính lại quote
-
Ghi đè các field checkout từ request vào cart (shipping/billing,
payment_method,coupon_code,redeem_points,tax_*, ...). -
Tính lại quote giống Lấy báo giá giỏ hàng:
- Enrich lại
details[], tínhprice_sell,price_shipping,price_discount_*,price_final. - Áp dụng promotion engine (bundle + cart) và loyalty nếu có.
- Enrich lại
-
Kết quả là một quotedCart đồng bộ với những gì user thấy ở màn hình checkout.
-
Nếu có dòng hàng mà giá theo ngữ cảnh (flash sale, khung giờ đặt hàng) không còn hiệu lực → trả lỗi
error_checkout_blocked_<lý do>(VD:error_checkout_blocked_pricing_context_expired) và không tạo đơn.
-
-
Build payload tạo order từ quoted cart
- Gộp
quotedCart+ meta bổ sung (customer_id,aff_click_token,tax_phone, ...) thành dữ liệu đơn hàng. - Tính lại
price_final,weight,quantity, mapdetails[]sang format [Order Detail] với đầy đủ thông tin SKU/UOM/giá/khuyến mãi/gift. - Ghi đè
date_createdcủa order về thời điểm hiện tại để tránh lệch thời gian so với lúc tạo cart.
- Gộp
-
Tạo Order
- Tạo đơn hàng từ dữ liệu ở trên.
- Nếu tạo đơn lỗi hoặc không trả về
idhợp lệ → thêm lỗierror_create_orderhoặcerror_create_order_empty_order_data(kèm các mã lỗi chi tiết từ bước tạo đơn).
-
Finalize cart sau khi tạo order thành công
-
Cập nhật cart:
status = 5(Finish).sale_order_id= ID order vừa tạo.- Nếu cart trước đó là guest nhưng user hiện đã đăng nhập, gán thêm
customer_idvào cart.
-
Lưu lại để phục vụ các luồng thống kê/đối soát sau này.
-
Request Body
Body là JSON checkout, tối thiểu bao gồm các field phục vụ quote (giống getQuote), và có thể kèm:
create_customer:1để tạo tài khoản khách hàng mới cho khách chưa đăng nhập (chỉ có tác dụng khi shop bậtwebsite_checkout_create_new_customer).aff_click_token: mã click tiếp thị liên kết (affiliate) để ghi nhận hoa hồng.tax_phone: số điện thoại trên hóa đơn VAT.
{
"create_customer": 0,
"aff_click_token": "",
"tax_phone": "",
"store_id": 1,
"pickup_store_id": 0,
"shipping_type": "delivery",
"shipping_address_id": 0,
"shipping_full_name": "Nguyễn Văn A",
"shipping_phone": "0900000000",
"shipping_email": "khachhang@example.com",
"shipping_address": "12 Nguyễn Huệ, P. Bến Nghé",
"shipping_region_id": 1,
"shipping_sub_region_id": 0,
"shipping_sub_sub_region_id": 0,
"shipping_profile_rate_id": 0,
"billing_full_name": "Nguyễn Văn A",
"billing_phone": "0900000000",
"billing_email": "khachhang@example.com",
"billing_address": "12 Nguyễn Huệ, P. Bến Nghé",
"billing_region_id": 1,
"billing_sub_region_id": 0,
"billing_sub_sub_region_id": 0,
"payment_method": 0,
"coupon_code": "",
"redeem_points": 0
}Response Schema
HTTP 200 - Thành công
Trả về object Order vừa được tạo thành công.
| Trường (Field) | Kiểu (Type) | Mô tả |
|---|---|---|
id | integer | ID đơn hàng (Mã đơn hàng hệ thống). |
uuid | string | UUID duy nhất của đơn hàng. |
customer_id | integer | ID khách hàng gắn với đơn hàng. |
store_id | integer | ID cửa hàng xử lý đơn hàng. |
status | integer | Trạng thái đơn hàng (xem Constant STATUS_*). |
shipping_full_name | string | Tên người nhận hàng. |
shipping_phone | string | Số điện thoại người nhận. |
shipping_address | string | Địa chỉ giao hàng chi tiết. |
shipping_type | integer | Loại vận chuyển (giao hàng, nhận tại kho, ...). |
shipping_status | integer | Trạng thái vận chuyển. |
payment_method | integer | Phương thức thanh toán (COD, Chuyển khoản, ...). |
payment_status | integer | Trạng thái thanh toán (Chương thanh toán, Đã thanh toán, ...). |
price_sell | integer | Tổng tiền hàng (trước giảm giá và phí ship). |
price_shipping | integer | Phí vận chuyển. |
price_discount | integer | Tổng số tiền được giảm giá (bao gồm coupon, promotion). |
price_tax | integer | Tổng tiền thuế. |
price_final | integer | Tổng tiền cuối cùng khách cần thanh toán. |
date_created | integer | Thời gian tạo đơn (UNIX timestamp). |
Ví dụ Response
{
"id": 10002414,
"uuid": "3b733736-2278-42d1-8c2f-31d5cef7cd81",
"customer_id": 101,
"store_id": 32,
"shipping_full_name": "Nguyễn Văn A",
"shipping_phone": "0900000000",
"shipping_address": "12 Nguyễn Huệ, P. Bến Nghé, Quận 1, TP.HCM",
"payment_method": 1,
"payment_status": 1,
"status": 1,
"price_sell": 150000,
"price_shipping": 20000,
"price_discount": 10000,
"price_tax": 0,
"price_final": 160000,
"date_created": 1738057367
}HTTP 422 - Lỗi dữ liệu / logic
| Mã lỗi | Mô tả |
|---|---|
error_cart_not_found | Không tìm thấy giỏ hàng theo uuid. |
error_create_order | Tạo order thất bại (lỗi từ hệ thống xử lý Order). |
error_create_order_empty_order_data | Hệ thống xử lý Order trả về dữ liệu rỗng sau khi tạo. |
error_checkout_blocked_* | Có dòng hàng mà giá theo ngữ cảnh (flash sale, khung giờ đặt hàng) đã hết hiệu lực. |
Ngoài ra có thể trả về các lỗi của bước quote (xem getQuote).