使用 Rapid Lodging API 和 3DS 2.0 进行测试
使用 API 支持的特定场景测试您的 SCA 实现。
要测试 Rapid Lodging API,请在 HTTP 请求中包含名为 test 的附加 HTTP 标头,并使用该 API 支持的值之一来测试支持的场景。
在强客户认证 (SCA) 预订流程中,也可以使用来自 Rapid API 的测试响应来测试 3D 安全 (3DS) 连接器库方法。
注册付款
以下测试标头值会在 API 响应中产生不同的 encoded_init_config 值和不同的 HTTP 响应代码。可以将 encoded_init_config 传递给 JavaScript 库的 initSession 调用,以触发 3DS 连接器库中的不同测试用例。
| 测试标头值 | HTTP 代码和响应 | initSession 测试案例 |
|---|---|---|
| 标准型车 | 201–标准回复 | SUCCESS |
init_skip | 201–未回复 encoded_init_config | Not supported |
init_fail | 201–标准回复 | FAILED |
init_timeout | 201–标准响应 | TIMEOUT |
internal_server_error | 500–内部服务器错误 | — |
internal_server_error | 503 - 服务器不可用 | — |
注意: 使用 init_skip 测试用例,这些用例位于 3DS 连接器库 encoded_init_config 中,可以传递给 initSession 并强制执行 statusCode 跳过。
创建预订
除了 Rapid Lodging API 的 non-SCA 预订流程的测试请求中定义的测试标头外,SCA 工作流还支持其他测试标头值。
测试头值会产生不同的 encodedChallengeConfig 值,这些值可以传递给 JavaScript 库的挑战调用,以触发各种测试用例。
| 测试标头值 | HTTP 代码和响应 | initSession 测试案例 |
|---|---|---|
complete_payment_session | 201 – Response with complete payment session link | SUCCESS without user iframe interaction |
complete_payment_session_show | 201 – Response with complete payment session link | SUCCESS/FAILED with user iframe interaction |
complete_payment_session_fail | 201 – Response with complete payment session link | FAILED without user iframe interaction |
complete_payment_session_timeout | 201 – Response with complete payment session link | TIMEOUT |
complete_payment_session_error | 201 – Response with complete payment session link | ERROR |
除了 Rapid Lodging API 的 non-SCA 预订流程的测试请求中定义的测试标头外,SCA 工作流还支持其他测试标头值。
测试头值会产生不同的 encodedChallengeConfig 值,这些值可以传递给 JavaScript 库的 challenge 调用,以触发各种测试用例。
| 测试标头值 | HTTP 代码和响应 | initSession 测试案例 |
|---|---|---|
complete_payment_session | 201 – Response with complete payment session link | SUCCESS without user iframe interaction |
complete_payment_session_show | 201 – Response with complete payment session link | SUCCESS/FAILED with user iframe interaction |
complete_payment_session_fail | 201 – Response with complete payment session link | FAILED without user iframe interaction |
complete_payment_session_timeout | 201 – Response with complete payment session link | TIMEOUT |
complete_payment_session_error | 201 – Response with complete payment session link | ERROR |
完成付款会话
测试标头值会导致在尝试完成付款和确认预订时可能出现的不同错误情况。
| 测试标头值 | HTTP 代码和响应 |
|---|---|
payment_declined | 400 - Payment declined response |
price_mismatch | 409 - Price mismatch response |
rooms_unavailable | 410 - Rooms unavailable response |
3DS 连接器库和内嵌框架
要在没有外部依赖因 素的情况下测试 3DS 连接器,特定的参数值应对应于支持的方法响应。仅当内嵌框架使用测试沙盒 URL 加载时才支持此行为。
初始化会话
可以通过改变 initSessionResponse statusCode 来测试 initSessionRequest encoded_init_config 支持的值。
| statusCode 值 | 测试 encodedInitConfig 值 |
|---|---|
| SUCCESS | W3sicHJvdmlkZXJJZCI6IDAsICJzYW5kYm94SW5pdE91dHB1dENvbmZpZyI6ICJTVUNDRVNTIn1d |
| FAILED | W3sicHJvdmlkZXJJZCI6IDAsICJzYW5kYm94SW5pdE91dHB1dENvbmZpZyI6ICJGQUlMRUQifV0= |
| TIMEOUT | W3sicHJvdmlkZXJJZCI6IDAsICJzYW5kYm94SW5pdE91dHB1dENvbmZpZyI6ICJUSU1FT1VUIn1d |
| SKIPPED | 目前不支持。 |
注:encoded_init_config 值也可以使用注册付款信息 API 的受支持测试标头生成。
挑战
可以通过改变 challengeResponse statusCode 来测试 challengeRequest encoded_challenge_config 支持的值。
| statusCode 值 | 测试 encoded_Challenge_config 值 | 说明 |
|---|---|---|
| SUCCESS | W3sicHJvdmlkZXJJZCI6IDAsICJzYW5kYm94Q2hhbGxlbmdlT3V0cHV0Q29uZmlnIjogIlNVQ0NFU1MifV0 | 没有用户内嵌框架互动 |
| SUCCESS/FAILED | W3sicHJvdmlkZXJJZCI6IDAsICJzYW5kYm94Q2hhbGxlbmdlT3V0cHV0Q29uZmlnIjogIlNIT1cifV0 | 没有用户内嵌框架互动 |
| FAILED | W3sicHJvdmlkZXJJZCI6IDAsICJzYW5kYm94Q2hhbGxlbmdlT3V0cHV0Q29uZmlnIjogIkZBSUxFRCJ9XQ | 没有用户内嵌框架互动 |
| TIMEOUT | W3sicHJvdmlkZXJJZCI6IDAsICJzYW5kYm94Q2hhbGxlbmdlT3V0cHV0Q29uZmlnIjogIlRJTUVPVVQifV0 | |
| ERROR | W3sicHJvdmlkZXJJZCI6IDAsICJzYW5kYm94Q2hhbGxlbmdlT3V0cHV0Q29uZmlnIjogIkVSUk9SIn1d |
也可以使用 Booking API 的 SCA 流程支持的测试标头生成 encoded_init_config 值。
注意: 当根据用户对 iframe 的输入测试挑战状态代码值为 SUCCESS 或 FAILED 时,挑战方法响应将等待 iframe 中模拟身份验证界面的完成。
3DS 内嵌框架中的 UI 示例:

示例用法
本示例演示了如何使用预定义的参数值来测试库的 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 认证和稍后付款
使用 pay-later 型号进行预订时,Expedia 不会从卡中扣款。相反,我们会将其发送给供应商进行处理。商家可能会使用此信息在预订前验证信用卡。旅客需在抵达时亲自支付费用。
然而,有时计划会发生变化,在这种情况下,供应商可能会收取 no-show 费用。这些费用可能会受到强客户认证 (SCA) 法规的影响,因为它们涉及在旅行者不在场的情况下从信用卡扣款。
如果交易受到影响,付款可能会失败,或者如果收费是 non-compliant,供应商可能会面临信用卡品牌的处罚。
为了保护我们与供应商的关系并继续为我们的合作伙伴服务,Expedia Group 提供了一种可选的合规途径:Expedia Group 可以代表他们提供身份验证。这样一来,供应商就能保护自己的业务,并确保 Rapid API 能够继续提供同样多样化的选择。
在 Rapid Lodging API 中,这是以属性内容文件和属性内容中的标志 payment_registration_recommended=true 的形式存在的,它可以帮助您识别可能与项目相关的属性。
对整合的潜在影响
如果您想提供需要安全身份验证的供应商,那么预订流程应该支持 3DS。如果不支持 3DS,且 card-issuing 银行确定交易需要身份验证,则预订这些选项可能会失败。
当收取 no-show 费用时,Rapid API 将是记录在案的商户。信用卡账单上的收费描述将由您的组织定义,而不是由酒店定义。要自定义此文本,请联系 Rapid 合作伙伴支持。
为了符合卡组织的要求和 Rapid API 启动流程,请使用 Accepted Payments API 来显示processing_country在 no-show 的情况下,请在 check-out 页面上查看。对于所有 Rapid API 为记录商户的交易,都需要进行此操作;如果使用 3DS 并且出现 no-show,则可能会发生这种情况。
如何减轻整合带来的影响
如果 Rapid API 集成不支持预订流程中的安全身份验证,则可以通过排除不符合规定的供应商来降低预订失败的风险。请联系 Rapid Partner 支持团队,将受影响的费率从您的可用性 API 响应中移除。
使用代理工具时,根据相关规定,交易可免于强客户认证 (SCA)。使用可用性 APIsales_channel用于指示此内容的字段。
错误处理
创建预订 API 和完成付款会话 API 可能会导致确认的预订和付款交易。
您的集成应考虑以下说明,以避免财务损失和客户操作案例:
| 来源 | 功能 | 建议的超时设置 | 错误恢复过程 | 所需操作 |
|---|---|---|---|---|
| Rapid API | 注册付款令牌的预订前价格检查 | 10 秒 | 重试或选择其他住宿、房型或房价 | - |
| JavaScript | 3DS 连接器设置 | 10 秒 | 重试相同的请求 | - |
| Rapid API | 注册付款会话 | 10 秒 | 重试同一请求,但不执行“Expect: 100-continue”流程。 | - |
| JavaScript | 启动付款会话 | 10 秒 | 重试相同的请求 | - |
| Rapid API | 创建预订 | 90 秒 | 重试相同的请求 | 对于所有错误:使用 affiliate_reference_id 检索预订 |
| JavaScript | 显示身份验证挑战 | 10 秒 | 重试相同的请求 | - |
| JavaScript | 等待 challenge.statusCode | 180 ~ 1200 秒 | 请求完成付款会话 | - |
| Rapid API | 完成付款会话 | 90 秒 | 重试相同的请求 | 对于所有错误:使用 affiliate_reference_id 检索预订 |
| Rapid API | 对于所有错误:使用 affiliate_reference_id 检索预订 | 30 秒 | 重试相同的请求 | 对于所有错误:等待 90 秒后再重试,以通过 API 响应代码 404 或 200 确认预订的最终状态 |