郵輪B2C P3 寫入選擇與佔房(CreateHold)

API Content

說明

客人在 P3 按〔下一步:填寫旅客資料〕時打:把每間房選的方案、艙型、房號一起送進來,每間房都佔房(保留 15 分鐘)。都佔到才進 P4;有房佔不到就回 P3 重選那間,佔到的留著。

使用重點:

文件版本:v1.0(未交付)

規格調整

日期版本調整內容
2026/11/11v1.0(未交付)初版

Request Schema

Body

名稱描述屬性範例
Page_Id必填。QueryCategory 回的 Page_IdString6f1e2d3c-4b5a-4c7d-8e9f-0a1b2c3d4e5f
Session_Version必填。手上最新的訂位版本;在 P3 是 QueryCategory 回的Int1
Room_List必填。這筆訂位的每一間都要帶,一間一筆List參考 Room_List(Request)

Room_List(Request)

名稱描述屬性範例
Room_Seq必填。第幾間,同 QueryCategory Room_List[].Room_SeqInt1
Plan_Id必填。這間選的卡片的 Plan_Id(QueryCategory)Int8101
Category_Id必填。這間選的卡片的 Category_Id(QueryCategory)Int6009
Fare_Code必填。這間選的卡片的 Fare_Code(QueryCategory)StringBESTPRICE
Cabin_Number必填。這間選的房號(QueryCabin 的 Cabin_Number);系統配房、保證艙送 GTYString9207

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_SuccessObject參考 Result_Info
Result_Data成功時是本端點的資料;不是成功時只放該代碼要帶的資料(見「錯誤回應」),沒有就是 {}Object參考 Result_Data

Result_Info

名稱描述屬性範例
Is_Successtrue=成功;false=看 Result_CodeBooltrue
Result_Code結果代碼(四碼數字);成功是空字串;其他見「錯誤回應」String
Result_Message給客人看的訊息;成功是空字串String

Result_Data

名稱描述屬性範例
Session_Version新的訂位版本,之後的寫入帶這個Int2
Earliest_Hold_Until_Time各房最早的佔房到期時間(yyyy-MM-ddTHH:mm:ss),P4 倒數用String2026-11-02T14:35:00
Room_List每間的佔房到期時間List參考 Room_List(回應)

Room_List(回應)

名稱描述屬性範例
Room_Seq第幾間Int1
Hold_Until_Time這間的佔房到期時間(yyyy-MM-ddTHH:mm:ss),從佔房那一刻起算 15 分鐘。回 P3 時用它判斷哪一間有保留String2026-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=第幾間。

HTTPResult_Code中文名稱訊息(給客人看)情境前端動作
4004001/4002缺少必填參數/參數格式錯誤不給客人看(訊息開頭是代碼)Page_Id、Session_Version、Room_List 沒帶(4001)或格式錯(4002)前端帶錯值,修正後重打
2001001艙房已被訂走艙房已被別人訂走,請重新選擇有房佔不到:那間被別人佔走;跟著回 Fail_Room_List(佔不到的每一間各一筆:Room_Seq、Cabin_Number、Fail_Code、Fail_Text)。各間原因不只一種時外層回 1006(見下方 1006 那列)回 P3 重查 QueryCategory,重選佔不到的房,佔到的留著;紅條逐間列出 Fail_Text(見使用重點、下方範例)
2001002重複佔房重複訂位兩間選了同一個房號(保證艙除外),或重選後再按〔下一步〕時,後端要放掉原本那間重佔、但放房沒成功;訊息「重複訂位」,跟著回 Fail_Room_List顯示「重複訂位」,回 P3 重選那一間(同 1001 艙房已被訂走)
2001005艙型已售完艙型已售完,請改選其他艙型有房佔不到:那間的艙型已經沒有名額;跟著回 Fail_Room_List回 P3 重查 QueryCategory(沒名額的艙型不會再出現),重選那一間,佔到的留著
2001006部分艙房無法保留部分艙房無法保留,請看各間說明有房佔不到、各間原因不只一種(例一間被佔走、一間艙型已售完);跟著回 Fail_Room_List,每間原因看 Fail_Code(也可能是 6001、6005、6008)回 P3,紅條逐間列出 Fail_Text;🟡 有一間要客服或重試時畫面怎麼走,等 UIUX
2005003選擇已失效選擇已失效,請重新查詢少帶房、Room_Seq 重複或不存在、卡片不是那間最近一次 QueryCategory 回的;跟著回 Invalid_List重查 QueryCategory 後再選
2005002房數或人數不符艙房數或人數不符,請調整人數超過艙型上限;跟著回 Invalid_List顯示 Result_Message,回燈箱改人數
2002003資料版本不符資料已更新,請重新整理版本不符(例:開了兩個分頁,另一頁改過)重新還原整包後再操作(🟡 還原整包的 GetBooking 文件之後給)
2002001訂位資料不存在訂位資料已失效,請重新選擇Page_Id 找不到手上有行程與人數就在 P3 開「艙房/人數」燈箱重新查詢(在 P4 先回 P3);沒有就回 P2 重新選
2002002訂單已成立訂單已成立這筆訂位已經成立訂單導向訂單頁(🟡 訂單頁文件之後給)
2006001供應商拒絕訂位未成功,請聯絡客服佔房時供應商回其他錯誤(不是上面幾種);後端已放掉這次佔到的房顯示訊息+客服導引
2006006供應商連線設定錯誤訂位系統暫時無法使用,請聯絡客服跟供應商的連線設定有誤(後端已告警)顯示訊息+客服導引
2006007供應商回人數超過可住人數此艙房無法容納這麼多人,請改選其他艙房佔房時供應商說這間住不下這麼多人;跟著回 Fail_Room_List(那一間);後端已放掉這次佔到的房回 P3 重查 QueryCategory,重選那一間
2006005供應商無回應系統忙碌,請稍後再試佔房時供應商沒回應;後端已放掉那一間顯示「系統忙碌,請稍後再試」,可以重試
5009999系統錯誤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第幾間Int1
Cabin_Number這間選的艙號(保證艙是 GTY);Fail_Code 是 1001 時就是被佔走的那間,紅條可以顯示String9207
Fail_Code這間沒佔到的原因:1001 被別人佔走、1002 重複佔房、1005 艙型已售完、6007 住不下這麼多人;外層是 1006 時也可能是 6001 供應商拒絕、6005 供應商沒回應、6008 年齡規則不符String1001
Fail_Text這間給客人看的一句話,前端直接逐間列在紅條(🟡 文字待 UIUX 定稿)String艙房 1(9207)已被別人訂走,請重新選擇

測試情境/單元測試(開發前規劃)

畫面呼叫

舊版畫面

新版畫面

UIUX 20260922 版 P3-W01 底部結帳列、P3-A15 的〔下一步:填寫旅客資料〕。Request 帶的是 P3 選好的卡片與房號,回應欄位在 P3 不顯示(倒數在 P4),不附畫面欄位對照圖。有房佔不到時,雛形 P3-A15 畫的是彈窗、兩間全部重選;請以「使用重點」寫的為準:頂端紅條、佔到的那間留著(UIUX 改圖中)。