Bỏ qua để đến nội dung

Tổng quan bề mặt tích hợp

8 phút đọc

Trang này xác định phạm vi kết nối giữa hệ thống của đối tác và nền tảng Ferry. Bạn sẽ nắm rõ những nhóm nghiệp vụ nào có thể gọi bằng API key, các khu vực nội bộ không thể truy cập, và nguyên tắc phân quyền trên toàn hệ thống.

Hệ thống backend của Ferry phân tách bề mặt API thành 4 tầng riêng biệt tuỳ theo đối tượng gọi và phương thức xác thực:

Tầng APIĐối tượng sử dụngPhương thức xác thựcPhạm vi đối tác
publicKhách truy cập web, ứng dụng di động, đối tácKhông yêu cầu xác thựcGọi được danh mục tuyến, bến và hãng tàu
partnerĐối tác B2B tích hợp hệ thốngAPI key trong header AuthorizationTầng chính dành cho đối tác với 86 route nghiệp vụ
internalNhân viên vận hành đại lý và nhân viên FerryJWT của tài khoản đăng nhậpKhông truy cập được qua API key
adminĐội ngũ quản trị kỹ thuật hệ thống FerryJWT mang vai trò quản trị viên cấp caoKhông truy cập được qua API key

Sơ đồ dưới đây cho thấy các tầng API và phạm vi truy cập của đối tác:

flowchart LR
subgraph callers["Chủ thể gọi"]
partner["Đối tác B2B<br/>kèm API key"]
guest["Khách vãng lai<br/>không xác thực"]
dashboard["Nhân viên vận hành<br/>kèm JWT"]
end
subgraph reachable["Vùng đối tác truy cập"]
tierpublic["Tầng public<br/>Danh mục dùng chung"]
tierpartner["Tầng partner<br/>86 route nghiệp vụ"]
end
subgraph blocked["Vùng nội bộ đóng"]
tierinternal["Tầng internal<br/>Yêu cầu JWT người dùng"]
tieradmin["Tầng admin<br/>Yêu cầu JWT quản trị hệ thống"]
end
guest --> tierpublic
partner --> tierpublic
partner --> tierpartner
dashboard --> tierinternal

Tầng partner khai báo 112 route, nhưng chỉ có 87 route được cấu hình cơ chế kiểm tra API key, trong đó 1 route yêu cầu thêm quyền quản trị viên nội bộ cấp cao. Vì vậy, chính xác 86 route là bề mặt đối tác thực sự có thể gọi bằng API key (các route còn lại là công cụ nội bộ của Ferry như kiểm tra cổng hãng tàu hay ép đồng bộ dữ liệu).

Tầng public gồm 9 route không yêu cầu xác thực. Cả hai tầng này đều xuất hiện trên giao diện tài liệu công khai tại /docs. Đối với các danh mục dùng chung như tuyến đường, bến tàu và hãng tàu, hệ thống không có endpoint riêng có xác thực — đối tác bắt buộc phải gọi trực tiếp vào các route công khai mà không truyền khoá.

Toàn bộ 86 route nghiệp vụ dành cho đối tác được phân bổ vào các nhóm chức năng chính sau:

Nhóm nghiệp vụNăng lực chínhHướng dẫn chi tiết
Tra cứu lịch chạyTìm chuyến theo tuyến và ngày, kiểm tra lịch tàu, lấy chi tiết chuyếnTra cứu chuyến
Sơ đồ ghế và chỗ trốngLấy sơ đồ khoang ghế, kiểm tra số lượng chỗ còn khả dụng theo chuyếnTra cứu chuyến
Đặt vé và quản lý đơnTạo booking giữ chỗ, xác nhận xuất vé điện tử, tra cứu và cập nhật bookingLuồng đặt vé
Tra cứu đơn hàng (Orders)Liệt kê và xem chi tiết đơn hàng (chỉ đọc); không tạo hay xuất vé qua nhóm nàyXuất vé
Huỷ véTạo yêu cầu huỷ vé và theo dõi trạng thái tiếp nhận xử lý từ hãngHuỷ vé và hoàn tiền
Khách hàng và công tyTạo hồ sơ khách hàng, cập nhật thông tin và quản lý danh sách công tyTra cứu tại Scalar, nhóm Customers
Giá vé và ưu đãiKiểm tra quy tắc phụ thu, chính sách giá và kiểm tra điều kiện áp dụng voucherGiá và markup
Dòng tiền và công nợKiểm tra số dư ký quỹ đại lý, tra cứu sổ công nợ và lịch sử giao dịchThanh toán và số dư
Quản lý tổ chức conTạo, cập nhật và có quyền xoá tổ chức con thuộc chuỗi đại lýXác thực bằng API key
Thông báo và sự kiệnĐăng ký địa chỉ webhook nhận thông báo trạng thái, gửi email đơn hàngWebhooks

Để đảm bảo an toàn vận hành, hệ thống khoá hoàn toàn các khu vực sau đối với yêu cầu gửi bằng API key:

Khu vực đóngLý do kỹ thuậtPhương thức thay thế
Toàn bộ tầng internal và adminYêu cầu xác thực phiên người dùng bằng JWTThao tác trên giao diện Dashboard
Kênh dữ liệu thời gian thực (SSE)Yêu cầu phiên JWT của người dùng trực tuyếnSử dụng Webhook hoặc cơ chế polling định kỳ
Quản lý hoá đơn điện tửEndpoint tầng partner bị đóng hoàn toànNhận webhook sự kiện, xem chi tiết qua Dashboard
Gửi tin nhắn Zalo ZNS cho bookingLuôn trả về 403 Forbidden do lược đồ phân quyền thiếu vai API keyTự gửi tin qua Zalo OA của đối tác
Tạo mới và cấp phát API keyChỉ tài khoản quản trị đại lý thao tác trên DashboardQuản trị viên đại lý tạo tại API Keys
Tìm kiếm toàn cụcChỉ dành cho nhân viên vận hành trên giao diệnTra cứu theo từng thực thể cụ thể (chuyến, đơn vé, khách)

Lưu ý thêm: Endpoint danh sách booking (GET /api/v1/bookings) trả về header cảnh báo sắp ngừng dùng khi truyền bộ lọc động và hiện chưa có route thay thế ở tầng partner.

API key của Ferry gắn liền với một tổ chức đại lý cụ thể. Khi gọi API bằng khoá này, toàn bộ hành động và dữ liệu tạo ra đều thuộc quyền sở hữu của tổ chức đó.

Hệ quả quan trọng đối tác cần lưu ý:

  • Bảo mật phía máy chủ: Tuyệt đối không nhúng API key vào mã nguồn ứng dụng di động, giao diện web chạy trên trình duyệt hoặc các tệp tin công khai.
  • Rủi ro xoá tổ chức con: Quyền hạn của khoá bao gồm cả việc xoá các tổ chức con thuộc chuỗi đại lý. Một khoá bị lộ có thể bị kẻ xấu lợi dụng để xoá tổ chức con hoặc can thiệp sâu vào giao dịch và khách hàng.
  • Xử lý khi lộ khoá: Khi nghi ngờ khoá bị lộ, bạn cần lập tức thu hồi khoá cũ và tạo khoá mới trên Dashboard theo quy trình xoay khoá an toàn.
Hiểu nhầmThực tếCách xử lý đúng
Nghĩ rằng mọi route trên tài liệu đều gọi được bằng API keyTài liệu công khai chứa cả route không cần xác thực và một số route yêu cầu quyền quản trịĐối chiếu với danh mục 86 route của tầng partner
Tìm kiếm endpoint danh mục tuyến, bến, hãng tàu bằng API keyDanh mục dùng chung chỉ có ở tầng public không cần xác thựcGọi trực tiếp các route public không kèm header Authorization
Cố gắng gửi tin nhắn Zalo ZNS qua API FerryLuôn nhận 403 Forbidden do chưa hỗ trợ vai trò API keyTự xây dựng luồng gửi ZNS từ hệ thống của đối tác
Cố gắng đọc chi tiết hoá đơn qua API sau khi nhận webhookEndpoint hoá đơn ở tầng partner bị đóng hoàn toànTheo dõi và tra cứu hoá đơn trên giao diện Dashboard
Xuất vé qua nhóm Tra cứu đơn (Orders)Nhóm Orders chỉ hỗ trợ đọc thông tin đơnThực hiện toàn bộ quy trình đặt và xuất vé qua nhóm Bookings
Nhúng API key vào ứng dụng di động của người dùng cuốiBất kỳ ai giải nén ứng dụng đều có thể lấy được API keyMọi lệnh gọi tới Ferry phải đi qua máy chủ backend của đối tác
Tìm kiếm endpoint tạo API key bằng codeQuyền tạo khoá chỉ mở cho quản trị viên trên DashboardQuản trị viên đại lý tạo khoá thủ công trên Dashboard
Cố gắng kết nối vào luồng SSE bằng API keyKênh SSE yêu cầu phiên JWTĐăng ký webhook để nhận sự kiện đổi trạng thái đơn hàng

Trang tài liệu này định vị các nhóm chức năng trên giao diện tài liệu tương tác Scalar UI — Ferry VN API:

Nhóm nghiệp vụ cần tra cứuTên nhóm hiển thị trên Scalar
Chuyến, sơ đồ ghế và số lượng chỗVoyages, Boat Layout, Voyage Counts
Đặt chỗ và chi tiết đơn hàngBookings, Orders
Phụ thu giá và mã giảm giáTicket Price Additions, Vouchers
Giao dịch thanh toán và công nợTransactions, Debt Ledgers
Hồ sơ khách hàng, đối tác và tổ chứcCustomers, Companies, Organizations
Danh mục tuyến, bến và hãng tàu (công khai)Routes, Locations, Operators
TrangNội dung nên đọc tiếp
Bắt đầu: từ số 0 tới booking đầu tiên10 bước thực hành từ chuẩn bị khoá đến xuất vé thành công
Môi trườngTìm hiểu về môi trường UAT và Production trước khi gọi API
Xác thực bằng API keyQuy chuẩn truyền header, định dạng khoá và quy trình xoay khoá
Quy ước chungQuy định về phân trang, định dạng thời gian và xử lý lỗi