API Content
說明
客人在 P3 按〔下一步:填寫旅客資料〕時打:把每間房選的方案、艙型、房號一起送進來,每間房都佔房(保留 15 分鐘)。都佔到才進 P4;有房佔不到就回 P3 重選那間,佔到的留著。
- 路徑:
Cruise/Products/CreateHold
使用重點:
- P3 選卡片、房號時前端先記著(不打 API),按〔下一步〕時用這支一次送出。每間房都要帶,一間一筆:
Plan_Id、Category_Id、Fare_Code 取這間選的 QueryCategory 卡片,Cabin_Number 取 QueryCabin 選的房號,系統配房、保證艙送 GTY
- 卡片要是這間最近一次 QueryCategory 回的(重查過就用重查回的),不然回
5003 選擇已失效。兩間不能選同一個房號(保證艙除外):前端在房號清單先擋,送進來也會回 1002 重複佔房
- 成功:記下
Session_Version(之後的寫入帶這個)和每間的 Hold_Until_Time,進 P4;P4 倒數用 Earliest_Hold_Until_Time。進 P4 再打 InitBooking 取餐飲時段、填寫頁報價(🟡 InitBooking 文件之後給)
- 有房佔不到(
1001 艙房已被訂走、1002 重複佔房、1005 艙型已售完、6007 供應商回人數超過可住人數):回 P3,頂端紅條說明哪間被訂走、哪間已保留(跟著回 Fail_Room_List,紅條逐間列出每間的 Fail_Text,例「艙房 1(9207)已被別人訂走,請重新選擇」);佔到的那間維持「已選」,佔不到的那間框變紅、回「尚未選擇」。🟡 紅條畫面等 UIUX 出圖
- 回 P3 後帶
Page_Id 和佔不到那間的 Room_Seq 重查 QueryCategory,重查會回最新的 Session_Version 和每間的 Hold_Until_Time。客人重選那間後再按〔下一步〕,全部房一起帶,佔到的那間帶原本的選擇
- ⚠ 保留只有 15 分鐘,客人重選太久,佔到的那間也可能佔不到,紅條文字不要寫成保證
- 佔到的那間要改選:按〔重選艙房〕先跳確認「保留會放掉」,確認後打 ReleaseHold 放掉(見 ReleaseHold 文件)
- 從填寫頁回 P3、什麼都沒改就按〔下一步〕:照打這支,全部房都佔著、沒過期就不重佔。P4 重整不打這支,打 InitBooking
文件版本:v1.0(未交付)
規格調整
Request Schema
Body
| Page_Id | 必填。QueryCategory 回的 Page_Id | String | 6f1e2d3c-4b5a-4c7d-8e9f-0a1b2c3d4e5f |
| Session_Version | 必填。手上最新的訂位版本;在 P3 是 QueryCategory 回的 | Int | 1 |
| Room_List | 必填。這筆訂位的每一間都要帶,一間一筆 | List | 參考 Room_List(Request) |
Room_List(Request)
| Room_Seq | 必填。第幾間,同 QueryCategory Room_List[].Room_Seq | Int | 1 |
| Plan_Id | 必填。這間選的卡片的 Plan_Id(QueryCategory) | Int | 8101 |
| Category_Id | 必填。這間選的卡片的 Category_Id(QueryCategory) | Int | 6009 |
| Fare_Code | 必填。這間選的卡片的 Fare_Code(QueryCategory) | String | BESTPRICE |
| Cabin_Number | 必填。這間選的房號(QueryCabin 的 Cabin_Number);系統配房、保證艙送 GTY | String | 9207 |
JSON 範例
{
"Page_Id": "6f1e2d3c-4b5a-4c7d-8e9f-0a1b2c3d4e5f",
"Session_Version": 1,
"Room_List": [
{
"Room_Seq": 1,
"Plan_Id": 8101,
"Category_Id": 6009,
"Fare_Code": "BESTPRICE",
"Cabin_Number": "9207"
},
{
"Room_Seq": 2,
"Plan_Id": 8101,
"Category_Id": 6011,
"Fare_Code": "BESTPRICE",
"Cabin_Number": "GTY"
}
]
}
Response Schema
回應主體
Result_Info
| Is_Success | true=成功;false=看 Result_Code | Bool | true |
| Result_Code | 結果代碼(四碼數字);成功是空字串;其他見「錯誤回應」 | String | |
| Result_Message | 給客人看的訊息;成功是空字串 | String | |
Result_Data
| Session_Version | 新的訂位版本,之後的寫入帶這個 | Int | 2 |
| Earliest_Hold_Until_Time | 各房最早的佔房到期時間(yyyy-MM-ddTHH:mm:ss),P4 倒數用 | String | 2026-11-02T14:35:00 |
| Room_List | 每間的佔房到期時間 | List | 參考 Room_List(回應) |
Room_List(回應)
| Room_Seq | 第幾間 | Int | 1 |
| Hold_Until_Time | 這間的佔房到期時間(yyyy-MM-ddTHH:mm:ss),從佔房那一刻起算 15 分鐘。回 P3 時用它判斷哪一間有保留 | String | 2026-11-02T14:35:00 |
JSON 範例
{
"Result_Info": {
"Is_Success": true,
"Result_Code": "",
"Result_Message": ""
},
"Result_Data": {
"Session_Version": 2,
"Earliest_Hold_Until_Time": "2026-11-02T14:35:00",
"Room_List": [
{
"Room_Seq": 1,
"Hold_Until_Time": "2026-11-02T14:35:00"
},
{
"Room_Seq": 2,
"Hold_Until_Time": "2026-11-02T14:35:00"
}
]
}
}
錯誤回應
200 的代碼在 Result_Info.Result_Code、訊息在 Result_Message;400、500 只回一句訊息,代碼在訊息開頭(格式「代碼|訊息」,例「4002|Start_Date 格式錯誤」)。訊息欄除了「重複訂位」與「出發日期已無法訂購,請重新選擇」已定,其他是暫定文字,UIUX 定稿後只改文字、不改代碼;N=第幾間。
| 400 | 4001/4002 | 缺少必填參數/參數格式錯誤 | 不給客人看(訊息開頭是代碼) | Page_Id、Session_Version、Room_List 沒帶(4001)或格式錯(4002) | 前端帶錯值,修正後重打 |
| 200 | 1001 | 艙房已被訂走 | 艙房已被別人訂走,請重新選擇 | 有房佔不到:那間被別人佔走;跟著回 Fail_Room_List(佔不到的每一間各一筆:Room_Seq、Cabin_Number、Fail_Code、Fail_Text)。各間原因不只一種時外層回 1006(見下方 1006 那列) | 回 P3 重查 QueryCategory,重選佔不到的房,佔到的留著;紅條逐間列出 Fail_Text(見使用重點、下方範例) |
| 200 | 1002 | 重複佔房 | 重複訂位 | 兩間選了同一個房號(保證艙除外),或重選後再按〔下一步〕時,後端要放掉原本那間重佔、但放房沒成功;訊息「重複訂位」,跟著回 Fail_Room_List | 顯示「重複訂位」,回 P3 重選那一間(同 1001 艙房已被訂走) |
| 200 | 1005 | 艙型已售完 | 艙型已售完,請改選其他艙型 | 有房佔不到:那間的艙型已經沒有名額;跟著回 Fail_Room_List | 回 P3 重查 QueryCategory(沒名額的艙型不會再出現),重選那一間,佔到的留著 |
| 200 | 1006 | 部分艙房無法保留 | 部分艙房無法保留,請看各間說明 | 有房佔不到、各間原因不只一種(例一間被佔走、一間艙型已售完);跟著回 Fail_Room_List,每間原因看 Fail_Code(也可能是 6001、6005、6008) | 回 P3,紅條逐間列出 Fail_Text;🟡 有一間要客服或重試時畫面怎麼走,等 UIUX |
| 200 | 5003 | 選擇已失效 | 選擇已失效,請重新查詢 | 少帶房、Room_Seq 重複或不存在、卡片不是那間最近一次 QueryCategory 回的;跟著回 Invalid_List | 重查 QueryCategory 後再選 |
| 200 | 5002 | 房數或人數不符 | 艙房數或人數不符,請調整 | 人數超過艙型上限;跟著回 Invalid_List | 顯示 Result_Message,回燈箱改人數 |
| 200 | 2003 | 資料版本不符 | 資料已更新,請重新整理 | 版本不符(例:開了兩個分頁,另一頁改過) | 重新還原整包後再操作(🟡 還原整包的 GetBooking 文件之後給) |
| 200 | 2001 | 訂位資料不存在 | 訂位資料已失效,請重新選擇 | Page_Id 找不到 | 手上有行程與人數就在 P3 開「艙房/人數」燈箱重新查詢(在 P4 先回 P3);沒有就回 P2 重新選 |
| 200 | 2002 | 訂單已成立 | 訂單已成立 | 這筆訂位已經成立訂單 | 導向訂單頁(🟡 訂單頁文件之後給) |
| 200 | 6001 | 供應商拒絕 | 訂位未成功,請聯絡客服 | 佔房時供應商回其他錯誤(不是上面幾種);後端已放掉這次佔到的房 | 顯示訊息+客服導引 |
| 200 | 6006 | 供應商連線設定錯誤 | 訂位系統暫時無法使用,請聯絡客服 | 跟供應商的連線設定有誤(後端已告警) | 顯示訊息+客服導引 |
| 200 | 6007 | 供應商回人數超過可住人數 | 此艙房無法容納這麼多人,請改選其他艙房 | 佔房時供應商說這間住不下這麼多人;跟著回 Fail_Room_List(那一間);後端已放掉這次佔到的房 | 回 P3 重查 QueryCategory,重選那一間 |
| 200 | 6005 | 供應商無回應 | 系統忙碌,請稍後再試 | 佔房時供應商沒回應;後端已放掉那一間 | 顯示「系統忙碌,請稍後再試」,可以重試 |
| 500 | 9999 | 系統錯誤 | 9999|系統發生錯誤,請稍後再試 | 系統錯誤(未預期的例外) | 顯示友善錯誤訊息,可以重試 |
有房佔不到的回應範例(艙房 1 選的 9207 被別人佔走、艙房 2 選的保證艙那一類沒名額;兩間原因不一樣,外層回 1006):
{
"Result_Info": {
"Is_Success": false,
"Result_Code": "1006",
"Result_Message": "部分艙房無法保留,請看各間說明"
},
"Result_Data": {
"Fail_Room_List": [
{
"Room_Seq": 1,
"Cabin_Number": "9207",
"Fail_Code": "1001",
"Fail_Text": "艙房 1(9207)已被別人訂走,請重新選擇"
},
{
"Room_Seq": 2,
"Cabin_Number": "GTY",
"Fail_Code": "1005",
"Fail_Text": "艙房 2 的艙型已售完,請改選其他艙型"
}
]
}
}
| Fail_Room_List | 沒佔到、要回 P3 重選的每一間各一筆(1001、1002、1005、6007、1006 會回) | List | 見上方範例 |
| Room_Seq | 第幾間 | Int | 1 |
| Cabin_Number | 這間選的艙號(保證艙是 GTY);Fail_Code 是 1001 時就是被佔走的那間,紅條可以顯示 | String | 9207 |
| Fail_Code | 這間沒佔到的原因:1001 被別人佔走、1002 重複佔房、1005 艙型已售完、6007 住不下這麼多人;外層是 1006 時也可能是 6001 供應商拒絕、6005 供應商沒回應、6008 年齡規則不符 | String | 1001 |
| Fail_Text | 這間給客人看的一句話,前端直接逐間列在紅條(🟡 文字待 UIUX 定稿) | String | 艙房 1(9207)已被別人訂走,請重新選擇 |
測試情境/單元測試(開發前規劃)
畫面呼叫
舊版畫面
新版畫面
UIUX 20260922 版 P3-W01 底部結帳列、P3-A15 的〔下一步:填寫旅客資料〕。Request 帶的是 P3 選好的卡片與房號,回應欄位在 P3 不顯示(倒數在 P4),不附畫面欄位對照圖。有房佔不到時,雛形 P3-A15 畫的是彈窗、兩間全部重選;請以「使用重點」寫的為準:頂端紅條、佔到的那間留著(UIUX 改圖中)。