Payments
Tài liệu này mô tả cách tích hợp thanh toán trong luồng booking của Cohost, tập trung vào:
payment_method,payment_status,payment_url.- Cách FE xử lý redirect gateway & trạng thái sau thanh toán.
- Cách bên thứ 3 hiểu được cơ chế thanh toán khi tích hợp booking.
Scope: Tài liệu này ưu tiên mô tả Internal checkout & payments (ứng dụng Cohost, JWT + X-Team-ID).
PhầnPayment trong External Bookinglà overview cho đối tác, chi tiết xem thêm:
- Integration (Internal API) — booking/checkout nội bộ
- External API Guide — external bookings & payments
1. Khái niệm chính
- payment_method: phương thức thanh toán mà user/host chọn, ví dụ:
VNPAY(cổng thanh toán online).CASH(tiền mặt tại chỗ).BANK_TRANSFER(chuyển khoản).- Các phương thức khác tuỳ cấu hình backend.
- payment_status: trạng thái thanh toán của booking/master_reservation:
PENDING: chưa thanh toán hoặc đang chờ hoàn tất.PAID: đã thanh toán đầy đủ.REFUNDED: đã hoàn tiền (toàn phần hoặc một phần tuỳ nghiệp vụ).
- payment_url: URL trả về từ backend để FE redirect đến cổng thanh toán (khi dùng online payment).
2. Thanh toán trong luồng Checkout nội bộ
Khi Host/Cohost/Owner tạo booking qua endpoint:
POST /api/v1/checkout/confirm
Payload có chứa:
{
// ...
payment_method: string; // "VNPAY", "CASH", "BANK_TRANSFER", ...
payment_gateway_token?: string; // Optional - token/return URL tuỳ thiết kế
}
Response trả về (rút gọn):
{
master_reservation_id: number;
reservations: ReservationResponse[];
payment_status: "PENDING" | "PAID" | "REFUNDED";
payment_transaction_id?: string;
payment_url?: string; // URL để redirect đến payment gateway (nếu có)
}
2.1. Cách FE xử lý
- Nếu
payment_methodlà online (vdVNPAY) và response cópayment_url:- FE redirect browser tới
payment_url. - Sau khi user thanh toán xong, cổng thanh toán redirect user về một URL callback do FE/BE cấu hình.
- FE redirect browser tới
- Nếu
payment_methodlà offline (tiền mặt, chuyển khoản):payment_urlcó thể không có.- FE chuyển user sang trang xác nhận booking (
/reservations/{master_reservation_id}/confirmation) và hiển thịpayment_statushiện tại.
2.2. Webhook & cập nhật trạng thái
- Cổng thanh toán sẽ gọi webhook về backend khi thanh toán thành công/thất bại.
- Backend:
- Cập nhật
payment_statusvàpayment_transaction_id. - Có thể emit event để FE (hoặc hệ thống khác) cập nhật UI theo thời gian thực (tuỳ kiến trúc).
- Cập nhật
Chi tiết error codes liên quan thanh toán xem thêm:
docs/error_codes_design.md(mụcPayments / Checkout).guides/error-handling(format lỗi chuẩn).
3. Payment trong External Booking
Đối với endpoint:
POST /api/v1/external/bookings
Payload cũng bao gồm:
{
// ...
payment_method: string;
// ...
}
Tuỳ vào hợp đồng tích hợp với từng đối tác:
- Partner có thể:
- Tự thu tiền và chỉ sync booking sang Cohost (Cohost xem như đã
PAID/PENDINGtuỳ quy ước). - Hoặc chuyển user sang cổng thanh toán của Cohost (sẽ sử dụng
payment_urltương tự như internal checkout).
- Tự thu tiền và chỉ sync booking sang Cohost (Cohost xem như đã
Todos và chi tiết business cho từng integration cụ thể sẽ được ghi trong các tài liệu riêng (vd Dayladau integration).
4. Best practices cho FE & bên thứ 3
- Luôn hiển thị rõ
payment_statusvà tổng tiền trong trang xác nhận booking. - Với online payment:
- Xử lý các case user đóng tab hoặc back giữa chừng:
- Cho phép user “Retry payment” nếu
payment_statusvẫn làPENDING.
- Cho phép user “Retry payment” nếu
- Xử lý các case user đóng tab hoặc back giữa chừng:
- Handle lỗi thanh toán:
- Sử dụng error codes chuẩn (
PAYMENT_*,CHECKOUT_CREATE_BOOKING_FAILED, …). - Hiển thị message thân thiện, chi tiết mapping xem
docs/error_codes_design.md.
- Sử dụng error codes chuẩn (
- Log và theo dõi:
- Lưu
payment_transaction_idđể support tra cứu về sau.
- Lưu
5. Liên kết với các tài liệu khác
guides/bookings: chi tiết flow checkout/confirm & external bookings.guides/error-handling: format lỗi chung và ví dụ xử lý lỗi bằng Python.architecture/booking-flow: mô tả tổng thể luồng đặt phòng & soft-lock.