遵守《電子簽章法》(SCA)及《支付服務指令二》(PSD2)的相關規定
了解線上信用卡付款的驗證規定
簡介
監管機構與信用卡組織正推出新規定,以強化線上支付的安全性,並保護消費者免受詐騙侵害。其中許多法規均規定,線上支付必須採用「強客戶認證」(SCA) 。
- 歐洲:《修訂版支付服務指令》(PSD2)規定,線上支付交易必須採用「強化身份驗證」(SCA) ,但 符合特定豁免條件或 out-of-scope 情況者除外。
- 日本: 根據日本 SCA 規定,線上信用卡交易必須使用 3D Secure (3DS) 驗證機制,但某些交易類型可獲豁免。
3D Secure 2 (3DS 2.0) 是 Rapid API 中用於符合 SCA 法規的解決方案。3DS 2.0 是由 EMVCo 與卡片支付處理產業共同開發的一項技術,旨在確保合規性的同時,在安全性與流暢的結帳體驗之間取得平衡。
本頁面說明受支援的「Rapid API」付款方式將受到何種影響,以及您在為旅客提供服務時,可採取哪些措施以符合相關規定。
合規要求
在需要進行「強化客戶驗證」(SCA)的國家/地區,啟用符合規範的交易所需步驟將因「登記商家」的身分以及向該商家付款的方式而有所不同。Rapid API.
當貴組織是「登記商家」時
Expedia Affiliate Collect
使用 Expedia Affiliate Collect 進行的預訂不受 SCA 法規影響。無需對 Rapid API 的付款流程或 API 整合進行任何變更,即可符合合規要求。
然而,若您身為「登記商家」,並向旅客的信用卡 (卡號:金融卡) 或其他屬於《安全與信貸法》(SCA)規範範圍內的支付方式進行扣款,則您可能會受到該法規的影響。相關法規很可能要求在支付流程中採用 3DS 2.0 作為「SCA-compliant」解決方案。請聯絡您的支付服務供應商,進一步了解他們能提供哪些協助,以幫助商家符合 SCA 規範並避免交易失敗。
公司卡片
若貴公司身為「登記商戶」,且使用在實施 SCA 規定的國家所發行的信用卡或金融卡向 Rapid API 付款,則以下卡種可豁免 SCA 要求:
- 一次性虛擬卡
- 企業卡是發給貴公司,而非發給個人
若您不希望使用上述列出的 SCA-exempt 卡,貴機構可直接向發卡銀行申請豁免。若獲准豁免,該卡的交易將無需進行身份驗證,惟可能需透過 3DS 2.0 進行「one-time」線上驗證。此項「one-time」要求可能因銀行而異。請注意,從申請到通過豁免可能需要很長時間;此外,若發生任何詐騙交易,銀行可能會要求貴公司負責。
當 Rapid API 擔任「登記商家」時
若貴公司透過將差旅卡寄送至 Rapid,並以 Rapid API 作為「登記商戶」,則可能會受到相關法規的影響。當旅客透過線上管道預訂,且未經由實體旅行社代理時,相關法規規定付款交易必須由旅客透過「強化客戶身份驗證」(SCA)進行驗證。針對此項要求,SCA-compliant 的處理流程是在付款過程中使用 3DS 2.0。若貴機構希望將 Rapid API 作為「登記收單機構」,並處理任何在實施「強式客戶驗證」(SCA)規定的國家所發行的信用卡或借記卡交易,則必須採用我們的 SCA 解決方案。
透過零售代理或客服中心代理辦理的交易,無須符合《安全通信法》(SCA)的要求。只要註明預訂是由專人協助辦理,交易就符合規定。如有需要,可在「供應情況 API」的 sales_channel 欄位加註。
當旅宿為「登記商家」時
若貴公司使用旅宿 collect,您可能會受到相關法規的影響。在某些情況下,旅宿可能會在旅客不在場的情況下嘗試從其信用卡扣款,例如收取「未到場」費用或押金。若未在扣款前進行 3DS 2.0 驗證,這些扣款將不被視為「SCA-compliant」。若貴機構希望針對使用任何由實施 SCA 規定的國家所發行的信用卡或簽帳金融卡的旅客,採用旅宿收款方式,則需採用我們的 SCA 解決方案。
Rapid API 解決方案
運作方式
若您將 Rapid API 設為「登記商家」,或使用旅宿透過旅行者卡進行收款,即可採用 Rapid 的 API 解決方案,以產生符合 SCA 法規的預訂紀錄。我們的 API 透過在預訂流程中採用 3DS 2.0,以符合 SCA 規範。透過 3DS 2.0,我們支援「risk-based」驗證機制,此機制賦予銀行酌情決定何時要求旅客進行安全驗證的權限,從而降低旅客的交易摩擦。
3DS 2.0 的解決方案包含三個明確的步驟:
- 您將在 check-out 頁面中加入一個 iframe,該 iframe 用於託管發卡銀行為旅客提供的驗證流程。在整合文件中,這被稱為 3DS iframe。
>> 了解 iframes - 您還需在 check-out 頁面中加入一個新的 client-side JavaScript 函式庫,該函式庫用於收集瀏覽器資料、與 iframe 進行通訊,並在 iframe 內顯示 SCA 體驗。在整合文件中,這被稱為 3DS 連接器函式庫。
- Rapid API 將接受銀行的付款人資訊,並在完成安全驗證後完成預訂。
當同時使用 JavaScript 和 Rapid API 時,採用 SCA 的預訂流程現在會在呼叫預訂 API 之前和之後,增加幾個額外的步驟。下圖為更新後的預訂流程:

更新後的預訂流程中,上一步驟的輸出資料用做下一步驟的輸入資料。也就是資料會在瀏覽器的 JavaScript 和 Rapid 之間傳輸。
註: 上圖是實際 API 流程的簡化版本,僅供入門參考。完整 API 流程請參閱整合相關文件。
整合所需元件詳細說明
瀏覽器 iframe
此 iframe 嵌入於「check-out」體驗中,並載入旅客所屬銀行 card-issuing 的網址。此網址將向使用者顯示驗證流程,並將任何「traveler-supplied」相關資訊直接傳送至其銀行。該 iframe 應預設為隱藏狀態,並能在用戶嘗試預訂後需進行身分驗證時,將其疊加顯示於頁面之上。
瀏覽器 JavaScript Library
此函式庫已新增至 check-out 頁面,並會在預訂時被呼叫,以支援驗證流程。其 API 支援以下功能:
自動收集旅客裝置上的資料
在嘗試預訂之前,必須先收集旅客裝置的相關資訊,以便為預訂進行身份驗證做準備。該資訊會傳送至旅客的 issuing-bank 進行審核,以便銀行評估風險、決定該筆交易是否需要進行 3DS 2.0 驗證,並確保其顯示正確。根據 3DS 2.0 規範,系統將從旅客的瀏覽器中蒐集以下資料:語言、色彩深度、螢幕高度、螢幕寬度、時區、使用者代理程式,以及 Java 是否已啟用。
在瀏覽器的 iframe 中顯示驗證流程
進行預訂後,JavaScript Library 會用來顯示 iframe 置入的網頁,並將銀行網頁內容載入 iframe。在驗證過程中,銀行可能會收集有關旅客裝置的額外資訊,以輔助其風險評估。此為完成預訂的必要過程。
Rapid API
Rapid API 包含可與 client-side JavaScript 函式庫協同運作的 API。這些 API 目前支援以下功能:
登記旅客及付款詳情
在嘗試預訂之前,必須先蒐集旅客的相關資訊,以便為預訂進行驗證。這些資料包括銷售點和付款等旅客帳戶詳情。這些資料隨後會傳送至旅客的 issuing-bank 進行審核 ,以便銀行評估風險,並決定該筆交易是否需要進行安全驗證。請參閱 Rapid Booking API 中的「註冊付款 API」,以了解更多資訊。
完成付款並確認預訂
在嘗試透過 Rapid API 進行預訂,且瀏覽器上的 SCA 流程完成後,必須再次呼叫 Rapid。在後台,我們將確認身份驗證確實成功,以便確認預訂。請參閱 [Rapid Booking API 中的「完整付款流程」章節] 以了解更多資訊。
預訂流程
若在「合作夥伴檔案快速支援」中啟用了 3DS 2.0,價格查詢 API 將返回「註冊付款」API 的連結,而非「建立預訂」API 的連結。下圖所示為旅客下訂後的 API 所需呼叫順序,包括對 JavaScript Library 和對 Rapid 的呼叫。

當一筆訂單準備進行驗證時,未必總是需要進行驗證。是否需要進行身份驗證,由用於付款的信用卡發卡銀行決定。此判定是在交易過程中進行的,並會顯示於「建立預訂」API 的回應中。
下圖所示為使用「暫停與繼續處理 API」所需的呼叫順序:

註: 上述圖表是實際 API 流程的簡化版本,僅供入門參考。完整 API 流程請參閱整合相關文件。
如需進一步了解 3DS 2.0 體驗的技術要求,請參閱 EMVCo 的 3D Secure 協定與核心功能規範。
Rapid API 以及 3DS 2.0 整合指南
若要支援 SCA,則需將 Rapid API 與一個名為「3DS Connector」的新 JavaScript 函式庫進行整合。這兩項功能會配合使用,以在「check-out」頁面中呈現 3DS 2.0 並確認預訂。此解決方案支援 Expedia Collect 和入住時付款兩種商業模式。
以下概述了支援 3DS 2.0 預訂所需的 API 呼叫順序,詳細內容請參閱後續各節:
- JavaScript 設定方法
- Rapid 註冊付款 API
- JavaScript 初始化工作階段方法
- Rapid 預訂 API
- JavaScript Challenge 方法
- Rapid 完成付款 API
若要啟用此流程,必須由 Rapid Partner Support 針對個別合作夥伴檔案啟用 3DS 2.0。
Rapid API
若已為合作夥伴檔案啟用驗證功能,API 回應將有所不同,以支援採用 3DS 2.0 的更新版預訂流程。
可用性 API
若要根據法規規定取得認證豁免,API 請求中的「sales_channel」欄位所填報的數值必須準確無誤。發卡銀行會在預訂時,綜合考量此數值及其他許多因素,以做出決定。唯有代理工具不受《安全通信法案》(SCA)的規範。若需註明此項目,請把 sales_channel 的值設為 agent_tool。
價格檢查 API
API 會回傳連結到「註冊付款 API」,而不是到「建立預訂 API」。
啟用 3DS 2.0 時的回應範例:
{
"status": "matched",
"occupancies": {
//...(example omitted for length)
},
"links": {
"payment_session": {
"method": "POST",
"href": "/v3/payment-sessions?token=QldfCGlcUAVgBDRwdWXBBL"
}
}
}註冊付款 API
這將是 SCA 預訂流程中的第二個步驟,發生在 JavaScript setup方法之後。
該請求將包含屬於 non-SCA 預訂流程的一部分之付款詳細資訊,以及用於支援成功驗證的新欄位。其中兩個欄位:encoded_browser_metadata 和 version 是從 JavaScript API 的 setup method 回傳。
回應中會包括 payment_session_id 和 encoded_init_config,並成為 JavaScript Library initSession 方法的輸入資料。在呼叫initSession 方法之後,應使用回覆中包含的預訂連結。
請求範例:
{
"version": "1",
"browser_accept_header": "*/*",
"encoded_browser_metadata": "ZW5jb2RlZF9icm93c2VyX21ldGFkYXRh",
"preferred_challenge_window_size": "medium",
"merchant_url": "https://server.adomainname.net",
"customer_account_details": {
"authentication_method": "guest",
"authentication_timestamp": "2027-02-12T11:59:00.000Z",
"create_date": "2027-09-15",
"change_date": "2027-09-17",
"password_change_date": "2027-09-17",
"add_card_attempts": 1,
"account_purchases": 1
},
"payments": [
{
"type": "customer_card",
"card_type": "VI",
"number": "4111111111111111",
"security_code": "123",
"expiration_month": "08",
"expiration_year": "2027",
"billing_contact": {
"given_name": "John",
"family_name": "Smith",
"email": "smith@example.com",
"phone": "4875550077",
"address": {
"line_1": "555 1st St",
"line_2": "10th Floor",
"line_3": "Unit 12",
"city": "Seattle",
"state_province_code": "WA",
"postal_code": "98121",
"country_code": "US"
}
},
"enrollment_date": "2027-09-15"
}
]
}回應範例:
{
"payment_session_id": "76d6aaea-c1d5-11e8-a355-529269fb1459",
"encoded_init_config": "QSBiYXNlNjQgZW5jb2RlZCBvYmplY3Qgd2hpY2ggY29udGFpbnMgY29uZmlndXJhdGlvbiBuZWVkZWQgdG8gcGVyZm9ybSBkZXZpY2UgZmluZ2VycHJpbnRpbmcgYW5kL29yIDNEUyBNZXRob2Qu",
"links": {
"book": {
"method": "POST",
"href": "/v3/itineraries?token=MY5S3j36cOcLfLBZjPYQ1abhfc8CqmjmFVzkk7euvWaunE57LLeDgaxm516m"
}
}
}建立預訂 API
這將是 SCA 預訂流程中的第四個步驟,發生在 JavaScript initSession方法之後。該請求將不會包含任何針對 SCA 的新欄位。所有必要資訊均包含在「註冊付款 API」所回傳的「預訂連結」的存取令牌中。若回應成功,一定會包含 itinerary_id。然而,這並不代表預訂已確認,因為可能需要進行 3DS 2.0 驗證。
如有需要,回覆中亦將包含一個 encoded_challenge_config. 從「註冊付款」回傳的 encoded_challenge_config 和 payment_session_id 必須用為參數傳入 JavaScript challenge 方法。
回應還會包括用來 complete_payment_session 的新連結。此連結應於 JavaScript Library 的 challenge 方法之後使用。
若無需進行 3DS 2.0 驗證,則預訂即告確認,回應中將包含retrieve、cancel 以及 (可選)resume 的連結。
範例:若需進行 3DS 2.0 驗證,則產生「建立預訂」回應:
{
"itinerary_id": "8999989898988",
"links": {
"complete_payment_session": {
"method": "PUT",
"href": "/v3/itineraries/8999989898988/payment-sessions?token=MY5S3j36cOcLfLBZjPYQ1abhfc8CqmjmFVzkk7euvWaunE57LLeDgaxm516m"
}
},
"encoded_challenge_config": "ABElifsiejfacies2@033asfe="
}完成付款工作階段 API
這將是 SCA 預訂流程中的第六個步驟,發生在 JavaScript challenge方法之後。此 API 用於完成付款,並通知 Rapid API 已進行安全驗證嘗試,無論是否成功。
該請求將不會包含任何針對 SCA 的新欄位。
若回應成功,其中將包含預訂的確認資訊,包括itinerary_id,以及retrieve、cancel 的連結,以及 (可選)resume 的連結。
回應範例:
{
"itinerary_id": "8999989898988",
"links": {
"retrieve": {
"method": "GET",
"href": "/v3/itineraries/8999989898988?token=MY5S3j36cOcLfLBZjPYQ1abhfc8CqmjmFVzkk7euvWaunE57LLeDgaxm516m"
}
}
}Iframe 與 JavaScript 函式庫的實作
使用 SCA 預訂工作流程時,check-out 頁面必須包含一個新的 iframe 以及 JavaScript 函式庫。此 iframe (以下稱為「3DS iframe」) 將透過 3D-Secure 2.0 顯示驗證流程。JavaScript 函式庫 (以下稱為「3DS 連接器函式庫」) 將支援將資訊傳輸至發卡銀行,並將銀行的內容載入至 iframe 中。
新增 iframe
3DS iframe 應包在開始時為隱藏的容器中,當付款程序判定為必須進行驗證時,則會再顯示。
容器設計可配合裝載頁面來自訂。以下為使用 Bootstrap 模態框顯示的執行範例,僅供參考。
<div id="threeDsIframeModal" class="modal" role="dialog">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-body iframe-container">
<div class="embed-responsive embed-responsive-16by9">
<iframe id="threeDsIframe" src="<<3DS iframe URL>>"> </iframe>
</div>
</div>
</div>
</div>
</div>iframe 的源 (source) 必須設為以下兩個值之一:
| URL 類型 | URL | 備註 |
|---|---|---|
| 正式環境 | https://static.pay.expedia.com/3ds/threeDsIframe.html | 支援生產端驗證 |
| 測試沙箱 | https://static.pay.expedia.com/3ds/sandboxThreeDsIframe.html | 支援身份驗證測試 |
上列測試 URL 可支援測試,下文會再回到這個主題。若要在測試期間限制 iframe 的內容,可為 iframe 設定 sandbox 屬性,但必須允許以下操作:
sandbox = 'allow-scripts allow-forms allow-same-origin';加入 JavaScript 函式庫
3DS Connector Library 負責和 3DS iframe 溝通,並傳送資料給發卡銀行;銀行為 iframe 內容提供者。以下範例顯示如何將 3DS Connector Library 新增到付款頁面。
<head>
<script src="<<3DS connector script URL>>" integrity="<<actual integrity value>>"></script>
</head>Script 元素的 source 和 integrity 屬性值應設定為以下值。
| Library 版本 | 屬性 | 值 |
|---|---|---|
| 1.3.39 | src | https://static.pay.expedia.com/3ds/1.3.39/pay-3ds-js-libs-connector.min.js |
| integrity | sha384-par0I4Q5cfljwzqw2mAggM4dKdYzGyj4uZiL4cMviGjI3qVzEgWGuZ2075mYutbT | |
| 1.3.65 | src | https://static.pay.expedia.com/3ds/1.3.65/pay-3ds-js-libs-connector.min.js |
| integrity | sha384-gYopPw6xE5DZwnZXGavkwnvs3NkDOobnHqjroUnSHpGXvs/J9xjHX/8aGzKtSgWI | |
| 2.0.1 | src | https://static.pay.expedia.com/3ds/2.0.1/pay-3ds-js-libs-connector.min.js |
| integrity | sha384-1ntftSOl8ZSqJ/m7qqxXTNGOx3JLbF7Uw5YX8i/ageTjgmTnUMZ3ROpxxMiUkYma |
註: 隨著未來版本陸續推出,來源網址及完整性將會有所變更。新版不會破壞現有的整合。舊版的 script 元素仍可存取。
使用 3DS 和 JavaScript 進行 SCA
JavaScript Library 需使用 JavaScript Promise 物件。下圖為執行範例,顯示 JavaScript 方法和 Rapid 之間如何交換數據,僅供參考。
// Initialize the library
let connector = new PayThreeDSConnector.ThreeDSConnector("threedsiframe", "https://static.pay.expedia.com");
RapidIntegration.priceCheck(priceCheckLink)
.then(priceCheckResponse => {
paymentSessionLink = priceCheckResponse.links.payment_session.href;
// Setup an authentication session with the library
return connector.setup({ referenceId: ’1000’ })
}).then(setupResponse => {
console.log("Setup Response: ", setupResponse);
// Send information from setup to Rapid’s Register Payments API
return RapidIntegration.registerPayment(paymentSessionLink,
setupResponse);
}).then(paymentSessionResponse => {
console.log("Register Payments Response: ", paymentSessionResponse);
paymentSessionId = paymentSessionResponse.paymentSessionId;
bookLink = paymentSessionResponse.links.book.href;
if (paymentSessionResponse.encoded_init_config) {
// If the payment session response contains an encoded_init_config
// field, initialize an authentication session with the library
// using information returned from Rapid’s Register Payments API
connector.initSession({
paymentSessionId: paymentSessionId,
encodedInitConfig: paymentSessionResponse.encodedInitConfig
}).then(initSessionResponse => {
console.log("Init Session Response: ", initSessionResponse);
// Then create a booking with Rapid’s Book API
return RapidIntegration.createBooking(bookLink,
paymentSessionId);
})
} else {
// Otherwise, create a booking with Rapid’s Book API directly
return RapidIntegration.createBooking(bookLink, paymentSessionId);
}
}).then(createBookingResponse => {
console.log("Create Booking Response: ", createBookingResponse);
itineraryId = createBookingResponse.itinerary_id;
if (createBookingResponse.encoded_challenge_config) {
// If the Create Booking API contains an encoded_challenge_config field,
// display the authentication challenge window
$(’#threeDsIframeModal).modal(’show’);
completePaymentSessionLink = createBookingResponse.links.complete_payment_session.href;
// Perform the challenge using the information returned from Rapid’s Register Payments API
// and Create Booking API
connector.challenge({
paymentSessionId: paymentSessionId,
encodedChallengeConfig: createBookingResponse.encodedChallengeConfig
}).then(challengeResponse => {
console.log("Challenge Response: ", challengeResponse);
// Complete a booking with Rapid’s Complete Payment Session API
return RapidIntegration.completePaymentSession(completePaymentSessionLink, itineraryId);
}).then(completePaymentSessionResponse => {
console.log("Complete Payment Session Response: ", completePaymentSessionResponse);
return completePaymentSessionResponse;
}).finally(() => {
// Close the authentication challenge window
$(’#threeDsIframeModal’).modal(’hide’);
});
} else {
return createBookingResponse;
}
}).then(bookingResponse => {
...
});註: 其中對RapidIntegration 類別的引用僅為範例的一部分,並不屬於 3DS 連接器函式庫。旨在示範可支援資料傳輸到 API 的封套資料。
範例中使用靜態變數為參數,執行時應另行決定,如 referenceId。
Check-out 頁面設計指引
支援 3DS 驗證的信用卡品牌,可能會要求依照其指引顯示其標誌及品牌標識。
| 支付卡類別 | 認證品牌形象 | 商標和使用方法 |
|---|---|---|
| MasterCard (萬事達卡) | 萬事達卡 ID Check | https://brand.mastercard.com/debit/mastercard-brand-mark/downloads.html |
| Visa | Visa 驗證 | https://www.merchantsignage.visa.com/brand_guidelines |
註: 的標誌及其他信用卡品牌的相關指引,將於取得後陸續納入。
3DS Connector JavaScript Library 相關文件
類別 (Class):ThreeDSConnector
建構函式: new ThreeDSConnector(threeDsIFrameId, threeDsIFrameOrigin)
參數:
| 名稱 | 類型 | 說明 |
|---|---|---|
threeDsIFrameId | 字串 | 3DS iframe 的 ID。 |
threeDsIFrameOrigin | 字串 | 3DS iframe 的原點 (Origin)。在與 3DS iframe 溝通使用以傳出視窗訊息並過濾接受訊息。 |
設定
透過蒐集後端 3DS 服務所需的瀏覽器基本資訊 (例如螢幕尺寸、色彩深度等),來設定付款流程。
方法簽名: setup(setupRequest)
參數:
| 名稱 | 類型 |
|---|---|
setupRequest | SetupRequest |
回傳值: 承諾將返回一個 SetupResponse
初始化
初始化用於透過 3DS 進行身份驗證的會話。進行初始化可能需要從瀏覽器收集其他資料。若發卡機構提出要求,iframe 可載入 3DS URL 來啟動發卡機構的存取控制伺服器 (Access Control Server),直接從瀏覽器收集資料。用戶端不必等待回呼完成,於建立命令前即可調用。
方法簽名: initSession(initSessionRequest)
參數:
| 名稱 | 類型 |
|---|---|
initSessionRequest | InitSessionRequest |
回傳: 承諾將返回一個 InitSessionResponse
挑戰 (Challenge)
若發卡機構有此要求,請載入 3DS 驗證流程。
方法簽名: challenge(challengeRequest)
參數:
| 名稱 | 類型 |
|---|---|
challengeRequest | ChallengeRequest |
回傳值: 承諾將返回一個 ChallengeResponse
類別 (Class):SetupRequest
設定呼叫的需求架構。
性質:
| 名稱 | 類型 | 說明 |
|---|---|---|
referenceId | string | 辨識旅客付款頁面工作階段的參考 ID,用於記錄和追蹤。請使用 APIKey 和 Customer-Session-ID 的序連字元,中間以下劃線連接,例如:[APIKey]_[SessionID] |
類別 (Class):SetupResponse
來自設定呼叫的回應。
性質:
| 名稱類型 | 說明 | |----|----|----| | version | 字串 | 函式庫版本,和連往函式庫的 URL 所示版本相同。 | | encodedBrowserMetadata | 字串 | 編碼物件,內含從瀏覽器收集的資料。用戶端應將此視為不透明數據,無需解析即可傳給後端支付服務。 |
類別 (Class):InitSessionRequest
initSession 方法的需求架構。
性質:
| 名稱 | 類型 | 說明 |
|---|---|---|
paymentSessionId | 字串 | 「Rapid 註冊付款 API」傳回的唯一識別碼。 |
encodedInitConfig | 字串 | 編碼物件組態清單,內含初始化所需資料,由「Rapid 註冊付款 API」傳回。 |
類別 (Class):InitSessionResponse
initSession 方法的回應結構。
性質:
| 名稱 | 類型 | 說明 |
|---|---|---|
statusCode | 字串 | initSession 呼叫的狀態。 |
message | 字串 | 可選用。標示失敗原因。 |
statusCode 可能會有以下的值:
| 值 | 說明 |
|---|---|
SUCCESS | 初始化成功完成。 |
SKIPPED | 沒有進行初始化。 |
FAILED | 初始化失敗。訊息欄位包含更多失敗相關的訊息。 |
TIMEOUT | 初始化未在時間內完成。時限為 10 秒。 |
注意: 對於所有initSessionresponse statusCode 的值,請使用 Rapid Booking API 進行操作。
類別 (Class):ChallengeRequest
挑戰 (Challenge) 方法的需求架構。
性質:
| statusCode 值 | 測試 encoded_Challenge_config 值 | 說明 |
|---|---|---|
| SUCCESS | W3sicHJvdmlkZXJJZCI6IDA sICJzYW5kYm94Q2hhbGxlbmd lT3V0cHV0Q29uZmlnIjogIlNVQ0NFU1MifV0 | 無使用者 iframe 互動 |
| SUCCESS / FAILED | W3sicHJvdmlkZXJJZCI6IDA sICJzYW5kYm94Q2hhbGxlbmd lT3V0cHV0Q29uZmlnIjogIlNIT1cifV0 | 無使用者 iframe 互動 |
| FAILED | W3sicHJvdmlkZXJJZCI6IDA sICJzYW5kYm94Q2hhbGxlbmd lT3V0cHV0Q29uZmlnIjogIkZBSUxFRCJ9XQ | 無使用者 iframe 互動 |
| TIMEOUT | W3sicHJvdmlkZXJJZCI6IDA sICJzYW5kYm94Q2hhbGxlbmd lT3V0cHV0Q29uZmlnIjogIlRJTUVPVVQifV0 | |
| ERROR | W3sicHJvdmlkZXJJZCI6IDA sICJzYW5kYm94Q2hhbGxlbmdlT3V0cHV0Q29uZmlnIjogIkVSUk9SIn1d |
statusCode 可能會有以下的值:
| 值 | 說明 |
|---|---|
SUCCESS | 3DS 挑戰 (Challenge) 成功完成。 |
SKIPPED | 外部應用程式錯誤。 |
FAILED | 由於持卡人無法正確回應身分驗證挑戰,故 3DS 挑戰未成功完成。 |
TIMEOUT | 挑戰未在時間內完成。時限為 1200 秒。 |
注意: 對於所有challengeResponse statusCode 的值,請繼續執行 Rapid API 以完成整個付款流程。
使用 Rapid API 和 3DS 2.0 進行測試
您可以透過輸入對應於 API 所支援之特定情境的參數值,來測試您與 Rapid API 以及 3DS 連接器方法的整合功能。
Rapid API
若要測試 Rapid API,,請在 HTTP 請求中加入一個名為test 的額外 HTTP 標頭,並使用該 API 支援的其中一個值來測試受支援的場景。
在 SCA 預訂流程中,亦可使用來自 Rapid API 的測試回應來測試 3DS 連接器函式庫的方法。
註冊付款 (Register Payments)
以下測試標頭值 在 API 回應中會產生不同 encoded_init_config,以及不同 HTTP 回應碼。encoded_init_config 可傳入 JavaScript Library 的 initSession 呼叫,以啟動 3DS Connector Library 中的不同測試用例。
| 測試標題值 | HTTP 代碼與回應 | initSession 測試用例 |
|---|---|---|
standard | 201 – 標準回應 | SUCCESS |
init_skip | 201 - 不含 encodedInitConfig 的回應 | Not supported |
init_fail | 201 – 標準回應 | FAILED |
init_timeout | 201 – 標準回應 | TIMEOUT |
internal_server_error | 500 – 內部伺服器錯誤 | |
internal_server_error | 503 - 伺服器無法使用 |
註: init_skip 內含 3DS ConnectorLibrary.t_config 中的各種測試案例,這些案例可傳遞至initSession,並強制觸發statusCode 狀態,使其顯示為「SKIPPED」。
建立預訂
除了在「non-SCA」預訂流程的「預訂測試請求」中定義的測試標頭外,SCA 工作流程還支援其他測試標頭值。
測試標頭值會產生不同的 encodedChallengeConfig 值,這些值可傳入 JavaScript Library 的 challenge 呼叫,以觸發不同的測試案例。
| 測試標題值 | HTTP 代碼與回應 | initSession 測試用例 |
|---|---|---|
complete_payment_session | 201 – 含完成付款工作階段連結的回應 | SUCCESS 無使用者 iframe 互動 |
complete_payment_session_show | 201 – 含完成付款工作階段連結的回應 | SUCCESS/FAILED 有使用者 iframe 互動 |
complete_payment_session_fail | 201 – 含完成付款工作階段連結的回應 | FAILED 無使用者 iframe 互動 |
complete_payment_session_timeout | 201 – 含完成付款工作階段連結的回應 | TIMEOUT |
complete_payment_session_error | 201 – 含完成付款工作階段連結的回應 | ERROR |
完成付款工作階段
在試著完成付款並確認預訂時,測試標頭值會產生不同錯誤情況。
| 測試標題值 | HTTP 代碼與回應 |
|---|---|
payment_declined | 400 - 付款遭拒回應 |
price_mismatch | 409 - 房價不符回應 |
rooms_unavailable | 410 - 無空房回應 |
3DS Connector Library 和 iframe
在無外部相依關係下測試 3DS Connector 時,需使用符合支援方法回應的特定參數值。僅限 iframe 用測試沙箱 URL 載入時才支援這種做法。
初始化工作階段
InitSessionResponse statusCode 所支援的值可用變更 initSessionRequest encodedInitConfig 的方法來測試。
| statusCode 值 | 測試 encodedInitConfig 值 |
|---|---|
| SUCCESS | W3sicHJvdmlkZXJJZCI6IDAsICJz YW5kYm94SW5pdE91dHB1dENvbmZpZyI6ICJTVUNDRVNTIn1d |
| FAILED | W3sicHJvdmlkZXJJZCI6IDAsICJz YW5kYm94SW5pdE91dHB1dENvbmZpZyI6ICJGQUlMRUQifV0= |
| TIMEOUT | W3sicHJvdmlkZXJJZCI6IDAsICJz YW5kYm94SW5pdE91dHB1dENvbmZpZyI6ICJUSU1FT1VUIn1d |
| SKIPPED | Not supported at this time. |
註: 此外,也可透過「註冊付款」API 支援的測試標頭來產生encoded_init_config 中的數值。
挑戰 (Challenge)
challengeResponse statusCode 所支援的值可用變更 challengeRequest encondedChallengeConfig 的方法來測試。
| statusCode 值 | 測試 encoded_Challenge_config 值 | 說明 |
|---|---|---|
| SUCCESS / FAILED | W3sicHJvdmlkZXJJZCI6IDA sICJzYW5kYm94Q2hhbGxlbmd lT3V0cHV0Q29uZmlnIjogIlNIT1cifV0 | 無使用者 iframe 互動 |
| FAILED | W3sicHJvdmlkZXJJZCI6IDA sICJzYW5kYm94Q2hhbGxlbmd lT3V0cHV0Q29uZmlnIjogIkZBSUxFRCJ9XQ | 無使用者 iframe 互動 |
| TIMEOUT | W3sicHJvdmlkZXJJZCI6IDA sICJzYW5kYm94Q2hhbGxlbmd lT3V0cHV0Q29uZmlnIjogIlRJTUVPVVQifV0 | |
| ERROR | W3sicHJvdmlkZXJJZCI6IDA sICJzYW5kYm94Q2hhbGxlbmdlT3V0cHV0Q29uZmlnIjogIkVSUk9SIn1d |
encodedInitConfig的值亦可透過 Booking API 的 SCA 流程所支援的測試標頭來產生。
注意: 當根據使用者透過 iframe 輸入的內容,測試挑戰狀態碼值為 SUCCESS 或 FAILED 時,挑戰方法的回應將等待 iframe 中的模擬認證介面完成。
3DS iframe 中的 UI 範例:

用法範例
以下為執行範例,僅供參考。範例中可看到如何使用預先定義的值來測試 Library 進行 3DS 挑戰,而不需要使用者與 iframe 互動。
var c = new PayThreeDSConnector.ThreeDSConnector(’threedsiframe’, ’https://static.pay.expedia.com’); // change to match the 3DS iframe ID
c.setup({ referenceId: ’1000’ })
.then((setupResponse) => {
console.log(’Setup Output: ’, setupResponse);
return c.initSession({
paymentSessionId: 1,
encodedInitConfig: ’ W3sicHJvdmlkZXJJZCI6IDAsICJzYW5kYm94SW5pdE91dHB1dENvbmZpZyI6ICJTVUNDRVNTIn1d’,
}); // SUCCESS
})
.then((initResponse) => {
console.log(’InitSession Output: ’, initResponse);
$(’#threedsIframeModal’).modal(); // replace with code to show the modal containing the 3DS iframe
return c.challenge({
paymentSessionId: 1,
encodedChallengeConfig:
’ W3sicHJvdmlkZXJJZCI6IDAsICJzYW5kYm94Q2hhbGxlbmdlT3V0cHV0Q29uZmlnIjogIlNVQ0NFU1MifV0=’,
}); // SUCCESS
})
.then((challengeResponse) => {
console.log(’Challenge Output: ’, challengeResponse);
})
.finally(() => {
$(’#threedsIframeModal’).modal(’hide’); // replace with code to hide the modal containing the 3DS iframe
});3DS 驗證與旅宿匯集
透過旅宿預訂並選擇「到店取房」時,Expedia 不會向您的信用卡扣款。相反地,我們會將它轉交給旅宿處理。旅宿可能會用收到的資訊在入住前先進行信用卡驗證。旅客須親臨以下地點付款:check-in.
然而,有些旅客在預訂後卻沒有入住,此時旅宿就會收取未入住罰款。由於這些收費涉及在旅客不在場的情況下對卡片進行扣款,因此可能受到《安全交易法》(SCA)相關法規的影響。
當交易受 PSD2 影響而收款手續卻不符規定,則可能會導致交易失敗,旅宿也可能會面臨信用卡公司的罰款。
Expedia Group 為了維持與旅宿的良好關係,並繼續服務我們的合作夥伴,因此提供給旅宿另一項合規辦法:受影響的物件現在可以利用 Expedia Group 來代為進行身分驗證。此舉有助於物業業主保障其業務,並確保「Rapid API」能繼續提供同樣豐富多樣的物業選擇。
Rapid API 在旅宿內容檔案及旅宿內容中提供<payment_registration_recommended=true> 標記,這有助於您在該項目中識別可能涉及旅宿的情況。
對整合可能造成的影響
若您想提供可能需要安全驗證的房源,則預訂流程應支援 3DS。若不支援 3DS,當「card-issuing」銀行判定該筆交易需要進行驗證時,預訂這些房源可能會失敗。
當旅宿, Rapid API 收取「no-show」手續費時,該網站將成為「登記商家」。帳單上該筆交易的描述將由您的組織定義,而非旅宿。若想自訂此名稱,請聯絡 Rapid 合作夥伴服務。
為符合信用卡品牌的要求以及「Rapid API」上線流程,請在發生以下情況時,使用「Accepted Payments API」在「check-out」頁面顯示「processing_country」:no-show. 凡由 Rapid API 擔任「登記商戶」的所有交易均須遵守此規定;若使用 3DS 且發生「no-show」情況時,亦可能適用此規定。
如何減輕對整合的影響
若某個「Rapid API」整合服務在預訂流程中不支援安全驗證,則可透過不販售這些住宿設施來降低預訂失敗的風險。請聯絡 Rapid Partner Support,以將受影響的旅宿收費率從您的可用性 API 回應中移除。
使用代理工具時,根據相關規定,該筆交易可豁免適用《強式客戶認證》(SCA)規定。如有需要,可在「供應情況 API」的 sales_channel 欄位加註。
錯誤處理
「建立預訂 API」和「完成付款工作階段 API」可能會產生預訂確認和付款交易。
系統整合時請考慮以下說明,以避免財物損失和客戶操作的情形。
| 來源 | 功能 | 建議時限 | 錯誤復原做法 | 需採取的行動 |
|---|---|---|---|---|
| Rapid API | 註冊付款的預訂前價格檢查記號 | 10 秒 | 重試或選擇其他住宿、客房或房價 | — |
| JavaScript | 3DS Connector 設定 | 10 秒 | 重試相同的要求 | — |
| Rapid API | 註冊付款工作階段 | 10 秒 | 在不執行 ["Expect: 100-Continue"] 的情況下重新嘗試相同的請求](https://tools.ietf.org/html/rfc7231#section-6.2.1 ’Follow link’) | — |
| JavaScript | 初始化付款工作階段 | 10 秒 | 重試相同的要求 | — |
| Rapid API | 建立預訂 | 90 秒 | 重試相同的要求 | 所有錯誤:用 affiliate_reference_id 取回預訂 |
| JavaScript | 顯示驗證挑戰 | 10 秒 | 重試相同的要求 | — |
| JavaScript | 等待 challenge.statusCode | 180 ~ 1200 秒 | 要求完成付款工作階段 | — |
| Rapid API | 完成付款工作階段 (Complete Payment Session) | 90 秒 | 重試相同的要求 | 所有錯誤:用 affiliate_reference_id 取回預訂 |
| Rapid API | 所有錯誤:用 affiliate_reference_id 取回預訂 | 30 秒 | 重試相同的要求 | 所有錯誤:等待 90 秒後再重試,用 API 回應碼 404 或 200 確認預訂最後狀態 |