Kết nối đặt bàn vào website của quán
Ba mức, chọn theo website của quán. Đặt bàn từ mọi kênh đều về chung app Sunpa Host: lịch, sơ đồ bàn, chuông nhân viên, email xác nhận và chăm sóc khách tự chạy.
1 · Đường dẫn có sẵn
https://sunpa.vn/dat-ban/<quan>2 · Gắn vào website bằng một dòng mã
Dán trước thẻ </body>. Hiện nút "Đặt bàn" nổi góc màn hình; bấm là mở khung đặt bàn ngay trên web.
<script src="https://sunpa.vn/nhung.js" data-quan="<quan>" data-mau="#14234d" async></script>data-nut="an"— không hiện nút nổi; gắndata-sunpa-dat-banvào nút có sẵn của web:<a href="#" data-sunpa-dat-ban>Đặt bàn</a>data-chu="Giữ chỗ"— đổi chữ trên nút;data-mau— màu nút.- Khung nằm trong trang, tự co giãn chiều cao:
<iframe data-sunpa-khung src="https://sunpa.vn/dat-ban/<quan>?nhung=1" style="width:100%;border:0"></iframe>(cùng dòng script ở trên). - Mở bằng mã:
window.SunpaDatBan.open()
3 · Website tự dựng giao diện (API)
Quán vào Cài đặt › Kết nối website khai tên miền web (vd norai.vn, *.norai.vn, localhost:3000 khi đang làm). Trình duyệt ở các tên miền đó được phép gọi API (CORS). Gọi từ máy chủ của web (Next.js route, PHP…) thì không cần khai. Không cần khoá, không cần đăng nhập. Mọi phản hồi là JSON; lỗi trả { ok: false, error } — câu error viết sẵn tiếng Việt để hiện thẳng cho khách.
/api/p/<quan>Thông tin quán + các ngày nhận đặt.
{ ok, restaurant: { name, city, address, phone, notice, online, guestPicksTable },
days: [{ day: "2026-10-21", open: true }, …], maxParty: 10, hold: 90 }online = false: quán đang tạm ngừng nhận đặt online — hiện notice và số điện thoại.
/api/p/<quan>?day=2026-10-21&party=4Giờ còn bàn cho nhóm đó. Quán cho khách tự chọn bàn thì có thêm floorSlots (giờ còn bàn theo từng khu).
{ …, slots: [{ time: "18:00", ok: true }, { time: "18:15", ok: false }, …] }/api/p/<quan>?day=2026-10-21&party=4&time=19:00(Khi guestPicksTable) sơ đồ bàn tại giờ đó, toạ độ theo khung width × height của khu. ok = bàn khách được chọn.rot = góc xoay (độ, quanh tâm bàn); items = vật dụng để vẽ cho giống quán (khu vực, tường, quầy, cửa…), không đặt được.
{ …, floors: [{ id, name, width, height,
items: [{ id, kind: "zone" | "wall" | "counter" | "door" | "window" | "stairs" | "plant" | "text", x, y, w, h, rot, label, tone }],
tables: [{ id, name, seats, shape: "rect" | "round" | "booth", x, y, w, h, rot, bar, st, ok }] }] }/api/p/<quan>Đặt bàn. Xếp bàn tự động (hoặc đúng tableId khách chọn), gửi email xác nhận, báo chuông nhân viên.
fetch("https://sunpa.vn/api/p/<quan>", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
day: "2026-10-21", time: "19:00", party: 4,
name: "Nguyễn Lan", phone: "0912345678",
email: "lan@example.com", // không bắt buộc — có thì khách nhận email xác nhận
note: "Sinh nhật", // không bắt buộc
marketing: true, // khách đồng ý nhận tin ưu đãi
tableId: "…" // chỉ khi khách tự chọn bàn
})
}).then(r => r.json())
// → { ok: true, code: "K7Q2", token, day, time, party, name }Giữ token để khách xem / huỷ đơn: trang có sẵn https://sunpa.vn/dat-ban/<quan>/don?t=<token>.
/api/p/<quan>/don?t=<token>Xem đơn: { ok, restaurant, booking: { code, day, time, party, name, status, tables, canCancel } }
/api/p/<quan>/donKhách tự huỷ: body { token }.
/api/p/<quan>/lich?t=<token>Tệp lịch .ics — nút "Thêm vào lịch" cho khách.
Lưu ý
- Giới hạn 15 lượt đặt / giờ / địa chỉ IP. Quán hết hạn gói dịch vụ thì API trả
online = falsevà từ chối đặt. - Giờ theo giờ Việt Nam;
daydạngYYYY-MM-DD,timedạngHH:MM. - Đổi đường dẫn quán (
<quan>) thì phải cập nhật web.