Your EPS account
Sign in to view secure API documentation, update your account details, log support requests and much more.
Your email or password is incorrect. Please try again or reset your password.
If the issue persists please contact your EPS representative.
Reset your password
Please enter your email address below. We will send password reset instructions to the email associated with your EPS account.
Thank you
An email has been sent to your account email address with further instructions on how to reset your password.
概述
支付服务指令 2 是一项 EEA 法规,针对涉及 EEA 国家所发行信用卡的所有交易更改了付款和预订流程。
本法规旨在帮助减少在线欺诈行为并保护旅客,也必然会令整个欧洲的付款工作有基础性的改变。本法规要求一个有力的客戶认证解决方案来处理消费者电子支付流程。所有发卡公司,收款银行和商业机构都必须在 2020 年 12 月 31 日后支持该有力的客戶认证解决方案。
本页将说明 EPS 所支持的付款类型将受到怎样的影响,以及合作伙伴在服务旅客时可以采取哪些合规行动。如果您想详细了解本法规的具体内容,请访问欧洲委员会官方网站查看相关规定。
合规性要求
在 EEA 中启用合规交易的步骤会有所不同,具体取决于谁是记录商户以及向 EPS 付款的方式。
合作伙伴为记录商户
Expedia Affiliate Collect
使用 EAC 的预订不受 PSD2 法规的影响 – EPS 的支付流程或 API 集成更改无需遵守合规性要求。然而,如果您是记录商户并向旅客的信用卡、借记卡或欧盟法规范围内其他付款方式收费,可能会受到本法规的影响。本法规可能要求您在付款过程中支持使用双重身份验证的 PSD2 合规版本。请联系您的付款处理方并详细了解其各项功能,帮助商户遵守 PSD2 要求并避免交易失败。
合作伙伴卡支付
如果贵公司为记录商户,并通过由 EEA 发行的专属信用卡或借记卡向 EPS 付款,您可能会受到本法规的影响。需要符合PSD2 法规的卡有:
- EEA 境内发行的一次性虚拟卡。
- EEA 境内向贵公司(而非个人)发行的公司卡。
- EEA 境外发行的任何卡片。
如果您对旅客的信用卡、借记卡或 EEA法规范围内其他付款方式收费,可能会受到本法规的影响。本法规可能要求您在付款过程中支持使用双重身份验证的 PSD2 合规版本。请联系您的付款处理方并详细了解其各项功能,帮助商户遵守 PSD2 要求并避免交易失败。
如果上述 PSD2 合规的合作伙伴卡同样不可用,您的组织可以直接向您的合作伙伴卡发行银行申请豁免。如果银行授予豁免,则该卡上的交易无需身份验证,除非可能通过双重身份验证 (2FA) 进行一次性在线验证。这种一次性验证要求可能因银行而异。请注意,批准豁免的流程也许比较耗时,这也意味着您的银行可能需要您对欺诈付款负责。
EPS 为记录商户
如果贵公司通过发送旅客卡片至 EPS 而将 EPS 作为记录商户,您可能会受到本法规的影响。当旅客在没有零售客服的情况下进行在线预订时,本法规将要求 EPS 允许旅客验证是否已发起付款。在付款过程中,双重身份验证 (2FA) 是符合此项 PSD2 要求的流程。如果合作伙伴想通过由 EEA 发行的信用卡或借记卡将 EPS 作为记录商户,则需要采用我们的 EPS Rapid 解决方案(适用于 EPS Rapid v2.2+ 中的 2FA 流程)。
然而,通过零售客服或呼叫中心客服预订的交易无需符合 2FA 要求。如需遵守此类交易的要求,只需要明确表示预订是在客服协助下完成即可。请使用可订空房 API 的 sales_channel 字段明示此类信息。
住宿提供方为记录商户 (Property Collect)
如果贵公司使用 Property Collect,您可能会受到本法规的影响。在某些情况下,住宿提供方可能会在旅客不在场时尝试向其卡片收费(如“预订后未入住”的费用或押金)。如果在收费前未执行双重身份验证 (2FA),此类收费将被视为不合规。如果合作伙伴想通过由 EEA 发行的信用卡或借记卡而将 Property Collect 用于旅客预订,则需要采用我们的 EPS Rapid 解决方案(适用于 EPS Rapid v2.2+ 的 2FA 流程)。
EPS Rapid 解决方案概述
如何运作?
如果合作伙伴通过旅客卡片使用 EPS 记录商户或 Property Collect,可采用 EPS 的 API 解决方案生成符合本法规的预订。这些 API 在预订流程中支持 3DS 2.0 的双重身份验证,从而遵守 PSD2 要求。借助 3DS 2.0,我们支持基于风险的身份验证,通过准许银行酌情决定何时运用/不用 2FA 咨询旅客,减少与旅客之间的摩擦。
2FA 的解决方案由三个不同部分组成:
- 合作伙伴添加到付款页面的 iFrame。它用于托管旅客的发卡银行 2FA 体验。在集成文档中,它被称为 3DS iFrame。
- 位于付款页面上的新客户端 JavaScript 库。它用于采集浏览器数据,与 iFrame 通信,以及在 iFrame 中显示 2FA 体验。在集成文档中,它被称为 3DS Connector 库。
- EPS Rapid 接受银行的付款人信息,并在 2FA 之后完成预订。
如果同时使用 JavaScript 和 EPS Rapid,在调用预订 API 前后,使用 2FA 的预订流程将包含一些额外步骤。下图将描述这项更新预订流程。

以上预订流程每一个步骤的输出将包含特定数据,这些数据会用作下一步骤的输入。数据需要在 JavaScript(浏览器上)和 EPS Rapid 之间传递。
注意:上图简单介绍了实际的 API 流程。请参考集成文档,详细了解完整的 API 流程。
集成部分详情
浏览器iFrame
付款体验中的 iFrame 会托管旅客发卡银行的专属连接 URL。该连接可向用户显示 2FA 体验,并将旅客提供的任何信息直接传输至发卡银行。一开始隐应该藏该 iFrame,并且在尝试预订后需要 2FA 质询时,能够在页面顶部叠加显示。
Browser JavaScript Library (new)
添加该库至付款页面,并在预订时调用该库用于支持 2FA 流程。该库的 API 支持以下功能:
自动收集旅客的设备信息
尝试预订前,必须先收集旅客设备的相关信息,为需要 2FA 的预订做好准备。稍后,将这些信息发送至旅客的发卡银行进行审核,以便银行评估风险,确定交易是否需要 2FA,以及确保显示的信息正确无误。根据 3DS 2.x 规范,需要从旅客的浏览器中收集以下数据:语言、颜色深度、屏幕高度、屏幕宽度、时区、用户代理以及是否已启用 Java。
在浏览器
iFrame 中显示 2FA 体验
尝试预订后,该库用于叠加显示 iFrame 并将银行的内容加载至 iFrame。 在 2FA 流程中,银行的内容可能会收集旅客设备的其他信息,以便支持他们的风险评估。完成预订需要执行该程序。
EPS Rapid
EPS Rapid v2.2 及更高版本包括各项全新 API,这些 API 可与客户端 JavaScript 库协同运作。 这些 API 现已支持以下功能:
登记旅客及付款详情
尝试预订前,必须先收集旅客的其他信息,为需要 2FA 的预订做好准备。这些数据包含旅客的销售网站帐户及其付款的详细信息。随后,将这些数据发送至旅客的发卡银行进行审核,以便银行评估风险并确定交易是否需要 2FA。请查看 EPS Rapid v2.2+ 中的注册付款 API,了解更多信息。
完成付款并确认预订
在尝试使用 EPS Rapid 进行预订并在浏览器上完成 2FA 流程之后,必须再次调用 EPS Rapid。我们将在后台确认 2FA 操作已成功,如此一来,预订也可得到确认。请查看 EPS Rapid v2.2+ 中的完成付款会话,了解更多信息。
预订流程
概述
如果在 Partner Profile EPS Support 中启用 2FA,则价格检查 API 将返回一条指向注册付款 API 而非创建预订 API 的链接。下图是旅客发起预订后所需的 API 调用序列图。该序列涉及对 Javascript 库和 EPS Rapid 的调用。


当预订准备进行 2FA 时,不一定要求必须执行 2FA。是否需要 2FA 取决于付款信用卡的发卡银行。发卡银行将在交易期间作出决定,并在创建预订 API 响应中提供指示。
下图是使用暂停和继续流程时所需的 API 调用序列图。

注意:上图简单介绍了实际的 API 流程。请参考集成文档,详细了解完整的 API 流程。
更多信息
如需详细了解 2FA 体验的技术要求,请查看 EMVCo 的“3-D Secure Protocol and Core Functions Specification"
EPS Rapid 与双重身份验证集成指南
概述
如需支持双重身份验证 (2FA),则必须和新的 JavaScript 库(称为 3DS Connector)和 EPS Rapid 进行集成。 两者皆需用于在付款页面上实现 2FA 并确认预订。 该解决方案支持“Expedia Collect”和“Property Collect”两种业务模型。
下面将概述支持 2FA 预订所需的 API 调用序列,并在以下各节中详细说明。
- JavaScript Setup method
- EPS Rapid Register Payment API
- JavaScript Initialize Session method
- EPS Rapid Book API
- JavaScript Challenge method
- EPS Rapid Complete Payment API
- EPS Rapid Resume API (optional)
如需使用以上序列运作,必须由EPS技术支持 (EPS Partner Support) 在个别合作伙伴资料中启动。
EPS Rapid
如果合作伙伴资料中启用了双重身份验证 (2FA),则 API 响应将有所相同,以便允许使用带有 2FA 的改进预订流程。
购物 API
API 请求中的 sales_channel
字段数值必须准确无误,以便在法规允许的情况下免除 2FA 流程。在预订时,相应发卡行将审查该字段数值以及其他数值,决定是否免除流程。只有客服工具不受 2FA 的限制。如需指定此选项,请将 sales_channel
的值设置为 agent_tool
。
价格查询API
该 API 响应将包含一条指向注册付款 API(而非创建预订 API)的链接。
启用 2FA 时的响应示例:
{ "status": "matched", "occupancies": { ...(example omitted for length) }, "links": { "payment_session": { "method": "POST", "href": "/2.2/payment-sessions?token=QldfCGlcUAVgBDRwdWXBBL" } } }
注册付款API
这是 JavaScript-Rapid PSD2 预订流程的第二步,在 JavaScript 的 setup
方法之后执行该步骤。
该请求将包括非 PSD2 预订流程中的付款详情以及支持顺利进行 2FA 的新字段。其中两个字段 encoded_browser_metadata
和 version
是从 JavaScript API 的 setup method
中返回的。
该响应将包含 payment_session_id
和 encoded_init_config
字段。这两个字段被指定为 JavaScript 库的 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": "2018-02-12T11:59:00.000Z", "create_date": "2018-09-15", "change_date": "2018-09-17", "password_change_date": "2018-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": "2025", "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": "2018-09-15" } ] }
响应示例:
{ "payment_session_id": "76d6aaea-c1d5-11e8-a355-529269fb1459", "encoded_init_config": "QSBiYXNlNjQgZW5jb2RlZCBvYmplY3Qgd2hpY2ggY29udGFpbnMgY29uZmlndXJhdGlvbiBuZWVkZWQgdG8gcGVyZm9ybSBkZXZpY2UgZmluZ2VycHJpbnRpbmcgYW5kL29yIDNEUyBNZXRob2Qu", "links": { "book": { "method": "POST", "href": "/2.2/itineraries?token=MY5S3j36cOcLfLBZjPYQ1abhfc8CqmjmFVzkk7euvWaunE57LLeDgaxm516m" } } }
创建预订API
这是 JavaScript-Rapid PSD2 预订流程的第四步,在 JavaScript 的 initSession
方法之后执行该步骤。
该请求不需包含 PSD2 的任何新字段 - 注册付款 API 将返回预订链接,所有必要信息均包含在该链接的标记 (token) 中。
如果成功,该响应将始终包含 itinerary_id
字段。不过,因为可能需要 2FA,所以此响应并不表示预订已确认。
如果需要 2FA,响应还将包含 encoded_challenge_config
字段。从注册付款返回的 encoded_challenge_config
和 payment_session_id
需要作为参数传递到 JavaScript challenge
方法中。
该响应还将包括一条 complete_payment_session
的新链接。此链接应在 JavaScript 库的 challenge
方法之后使用。
如果无需 2FA,将完成预订的确认,响应将包括 retrieve
、cancel
和 resume
(可选)字段。 响应示例(如需 2FA):
{ "payment_session_id": "76d6aaea-c1d5-11e8-a355-529269fb1459", "encoded_init_config": "QSBiYXNlNjQgZW5jb2RlZCBvYmplY3Qgd2hpY2ggY29udGFpbnMgY29uZmlndXJhdGlvbiBuZWVkZWQgdG8gcGVyZm9ybSBkZXZpY2UgZmluZ2VycHJpbnRpbmcgYW5kL29yIDNEUyBNZXRob2Qu", "links": "book": { "method": "POST", "href": "/2.2/itineraries?token=MY5S3j36cOcLfLBZjPYQ1abhfc8CqmjmFVzkk7euvWaunE57LLeDgaxm516m" } }
完整的付款会话API
这是 JavaScript-Rapid PSD2 预订流程的第六步,在 JavaScript 的 challenge
方法之后执行该步骤。需要此 API 才能完成付款并通知 EPS 已完成 2FA 尝试以及结果是否成功。
该请求将不包括 PSD2 的任何新字段。
如果成功,该响应将包含 itinerary_id
以及 retrieve
、cancel
和 resume
(可选)字段的链接。预订已确认的成功响应。
响应示例:
{ "itinerary_id": "8999989898988", "links": { "retrieve": { "method": "GET", "href": "/2.2/itineraries/8999989898988?token=MY5S3j36cOcLfLBZjPYQ1abhfc8CqmjmFVzkk7euvWaunE57LLeDgaxm516m" } } }
3DS Connector JavaScript 库和 3DS iFrame
使用 PSD2 预订工作流程时,付款页面必须包含新的 iFrame 和 JavaScript 库。 iFrame(称为 3DS iFrame)将通过 3D-Secure2.x 向旅客显示身份验证体验。JavaScript 库(称为 3DS Connector 库)将支持传输信息至发卡银行,以及加载银行内容至 iFrame
添加 3DS iFrame 和 JavaScript 库
添加 3DS iFrame
3DS iFrame 应包含在容器中,iFrame 一开始被隐藏起来,但在处理付款时,如需身份验证质询,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 的来源设置为以下两个数值之一:
Production | 支持生成 2FA | |
Testing Sandbox | https://static.pay.expedia.com/3ds/sandboxThreeDsIframe.html | 支持 2FA 的测试 |
测试 URL 可以是支持测试 – 将在本文档后半部分讨论该主题。如需在测试过程中限制 iFrame 的内容,您可以使用沙盒为 iFrame 指定属性,但是沙盒必须允许以下操作:
sandbox="allow-scripts allow-forms allow-same-origin"
添加 3DS Connector JavaScript 库
3DS Connector 库与 3DS iFrame 通信,并将数据发送到发卡银行(该银行提供 iFrame 内容)。以下示例将说明如何在付款页面中添加库。
<head> <script src="<<3DS connector script URL>>" integrity="<<actual integrity value>>"></script> </head>
脚本元素的来源值和完整值可以设置为以下数值:
Library Version |
Attribute | Value |
---|---|---|
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 |
注意:随着将来其他版本的采用,来源 URL 和完整值将发生变化。新版本不应破坏现有的集成。脚本的旧版本仍然可以访问。
使用 3DS iFrame 和 JavaScript 库
该库要求使用 JavaScript Promise。下面将说明操作示例(仅用于指导目的),并演示 Javascript 方法与 EPS 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 Connector 库。这些引用旨在演示可支持传输信息至 API 的包装 (wrapper) 类。
注意:该示例使用静态值作为运行时需要确定的参数(如 referenceId)
付款页面准则
支持 2FA 的银行卡品牌可能需要根据其准则显示专属的徽标和品牌。
Card Brand |
2FA Branding | Logos and Guidance |
---|---|---|
Mastercard | Mastercard Identity Check | http://offers.worldpayglobal.com/rs/850-JOA-856/images/MC%20Identify%20Check%20logos.zip |
Visa | Visa Secure | http://offers.worldpayglobal.com/rs/850-JOA-856/images/Visa%20Secure%20logos.zip |
注意:如果其他银行卡品牌适用,将包含相应的徽标和准则。
3DS Connector JavaScript 库文档
类:ThreeDSConnector
建构子(Constructor)
new ThreeDSConnector(threeDsIFrameId, threeDsIFrameOrigin)
参数:
Name |
Type | Description |
---|---|---|
threeDsIFrameId | string | The ID of the 3DS iframe. |
threeDsIFrameOrigin | string | The origin of the 3DS iframe. Used to target outgoing window messages and filter incoming messages when communicating with the 3DS iframe. |
方法
设置
收集 3DS 后端服务所需的浏览器基本详细信息(如屏幕大小、颜色深度等),用于设置付款会话。
方法签名:
setup(setupRequest)
参数:
Name |
Type |
---|---|
setupRequest | SetupRequest |
返回内容: Promoise for a SetupResponse
初始化会话
通过 3DS 将身份验证的会话初始化。作为初始化的一部分,可从浏览器收集其他数据。如果发卡银行提出要求,可将 3DS 方法 URL 加载到 iFrame 中,使发卡银行的访问控制服务器 (ACS) 能够直接从浏览器收集数据。客户不必等待回调完成即可创建订单。
方法签名:
initSession(initSessionRequest)
参数:
Name |
Type |
---|---|
initSessionRequest | InitSessionRequest |
返回内容: Promoise for a InitSessionResponse
质询
如果发卡银行提出要求,请加载 3DS 身份验证体验。
方法签名:
challenge(challengeRequest)
参数:
Name |
Type |
---|---|
challengeRequest | ChallengeRequest |
返回内容: Promoise for a ChallengeResponse
类: SetupRequest
适用于设置调用的请求结构。
住宿:
Name |
Type |
Description |
---|---|---|
referenceId | string | 用于标识旅客付款会话的参考 ID。 用于记录和跟踪。 用于记录和跟踪。 由您的APIKey 和 Customer-Session-ID 的串联字符串组成。 Example: [APIKey]_[SessionID] |
类: SetupResponse
从设置调用返回的响应。
住宿:
Name |
Type | Description |
---|---|---|
version | string | 该库的版本。这与库的 URL 路径中现存版本相同。 |
encodedBrowserMetadata | string | 包含已收集浏览器详情的编码对象。客户应将其视为不透明的数据,此类数据无需解析即可传递给后端付款服务。 |
类: InitSessionRequest
针对 initSession 方法的请求结构。
住宿:
Name |
Type | Description |
---|---|---|
paymentSessionId | string | EPS Rapid 注册付款 API 返回的唯一 ID。 |
encodedInitConfig | string | 由 EPS Rapid 注册付款 API 返回的配置对象编码列表包含初始化所需数据。 |
类: InitSessionResponse
针对 initSession 方法的响应结构。
住宿:
Name |
Type | Description |
---|---|---|
statusCode | string | initSession 的调用状态 |
message | string | 可选。表明失败原因。 |
statusCode 的可能值:
Value |
Description |
---|---|
SUCCESS | 初始化已顺利完成。 |
SKIPPED | 初始化尚未完成。 |
FAILED | 初始化失败。消息字段包含有关初始化失败的其他信息。 |
TIMEOUT | 初始化未在可用时间内完成。超时持续时间为 10 秒。 |
注意:对于所有 initSessionresponse statusCode 数值,请使用 EPS Rapid 预订 API 继续操作
类: ChallengeRequest
针对质询方法的请求结构。
住宿:
statusCode Value | Test encoded_Challenge_config Value | Description |
---|---|---|
SUCCESS |
W3sicHJvdmlkZXJJZCI6IDA sICJzYW5kYm94Q2hhbGxlbmd lT3V0cHV0Q29uZmlnIjogIlNVQ0NFU1MifV0 |
没有 iFrame 用户互动 |
SUCCESS / FAILED |
W3sicHJvdmlkZXJJZCI6IDA sICJzYW5kYm94Q2hhbGxlbmd lT3V0cHV0Q29uZmlnIjogIlNIT1cifV0 |
没有 iFrame 用户互动 |
FAILED |
W3sicHJvdmlkZXJJZCI6IDA sICJzYW5kYm94Q2hhbGxlbmd lT3V0cHV0Q29uZmlnIjogIkZBSUxFRCJ9XQ |
没有 iFrame 用户互动 |
TIMEOUT |
W3sicHJvdmlkZXJJZCI6IDA sICJzYW5kYm94Q2hhbGxlbmd lT3V0cHV0Q29uZmlnIjogIlRJTUVPVVQifV0 | |
ERROR |
W3sicHJvdmlkZXJJZCI6IDA sICJzYW5kYm94Q2hhbGxlbmdlT3V0cHV0Q29uZmlnIjogIkVSUk9SIn1d |
statusCode 的可能值:
Value |
Description |
---|---|
SUCCESS | 3DS 质询已顺利完成。 |
SKIPPED | 外部应用程序错误。 |
FAILED | 由于持卡人无法正确响应身份验证质询,因此 3DS 质询未能成功完成。 |
TIMEOUT | 质询未在可用时间内完成。超时持续时间为 1200 秒。 |
注意:对于所 有challengeResponse statusCode 数值,请继续使用 EPS Rapid 处理完成付款会话。
使用 EPS Rapid 和双重身份验证测试
您可以利用输入参数值来测试您的 EPS Rapid 集成和 3DS Connector 方法,这些数值均与 API 所支持的特定场景相对应。
EPS Rapid
如需测试 EPS Rapid,请在 HTTP 请求中添加名为“Test”的附加 HTTP 标头,并利用该 API 的一个支持数值来测试所支持的场景。
在 PSD2 预订流程中,EPS Rapid 返回的测试响应也可用于测试 3DS Connector 库方法。
注册付款
以下 test header 值在 API 响应和 HTTP 响应代码中分别产生不同的 encoded_init_config 值。可以将 encoded_init_config 传递到 Javascript 库的 initSession 调用中,以触发 3DS Connector 库中的不同测试案例。
Test Header Value | HTTP Code & Response | initSession Test Case |
---|---|---|
standard |
201 – Standard Response |
SUCCESS |
init_skip |
201 - Response Without encodedInitConfig |
Not supported |
init_fail |
201 – Standard Response | FAILED |
init_timeout |
201 – Standard Response | TIMEOUT |
internal_server_error |
500 – Internal Server Error | |
internal_server_error |
503 - Server Unavailable |
注意:可以将 3DS Connector Library.t_config 中的不同测试案例传递到 initSession 并强制显示 statusCode
创建预订
除了针对非 PSD2 预订流程的EPS Rapid 预订测试请求中定义的test header以外,PSD2 工作流程中同样支持其他test header值。
Test header值将产生不同的 encodedChallengeConfig 值,这些数值可被传递到 JavaScript 库的 challenge 调用中,用于触发不同的测试案例。
Test Header Value | HTTP Code & Response | initSession Test Case |
---|---|---|
complete_payment_session |
201 – Response with Complete Payment Session link |
SUCCESS 没有 iFrame 用户互动 |
complete_payment_session_show |
201 – Response with Complete Payment Session link |
SUCCESS/FAILED 有 iFrame 用户互动 |
complete_payment_session_fail |
201 – Response with Complete Payment Session link | FAILED 没有 iFrame 用户互动 |
complete_payment_session_timeout |
201 – Response with Complete Payment Session link | TIMEOUT |
complete_payment_session_error |
201 – Response with Complete Payment Session link | ERROR |
完成付款会话
Test header值会导致不同的错误案例,如果尝试完成付款并确认预订,则可能发生此类案例。
Test Header Value |
HTTP Code & Response |
---|---|
payment_declined | 400 - Payment Declined Response |
price_mismatch | 409 - Price Mismatch Response |
rooms_unavailable | 410 - Rooms Unavailable Response |
3DS Connector 库和 iFrame
如果需要在不依赖外部应用的情况下测试 3DS Connector,可以使用特定参数值以测试对应支持的函数。此操作只支持有加载测试沙箱 URL 的 iFrame 。
初始化会话
可以通过更改 initSessionRequest encodedInitConfig
测试受支持的 InitSessionResponse statusCode
数值。
statusCode Value |
Test encodedInitConfig Value |
---|---|
SUCCESS | W3sicHJvdmlkZXJJZCI6IDAsICJz YW5kYm94SW5pdE91dHB1dENvbmZpZyI6ICJTVUNDRVNTIn1d |
FAILED | W3sicHJvdmlkZXJJZCI6IDAsICJz YW5kYm94SW5pdE91dHB1dENvbmZpZyI6ICJGQUlMRUQifV0= |
TIMEOUT | W3sicHJvdmlkZXJJZCI6IDAsICJz YW5kYm94SW5pdE91dHB1dENvbmZpZyI6ICJUSU1FT1VUIn1d |
SKIPPED | Not supported at this time. |
注意:可以通过注册付款 API 所支持的Test header生成 encoded_init_config
数值。
质询
可以通过更改 challengeRequest encondedChallengeConfig
测试受支持的 challengeResponse statusCode
数值。
statusCode Value | Test encoded_Challenge_config Value | Description |
---|---|---|
SUCCESS |
W3sicHJvdmlkZXJJZCI6IDA sICJzYW5kYm94Q2hhbGxlbmd lT3V0cHV0Q29uZmlnIjogIlNVQ0NFU1MifV0 |
没有 iFrame 用户互动 |
SUCCESS / FAILED |
W3sicHJvdmlkZXJJZCI6IDA sICJzYW5kYm94Q2hhbGxlbmd lT3V0cHV0Q29uZmlnIjogIlNIT1cifV0 |
没有 iFrame 用户互动 |
FAILED |
W3sicHJvdmlkZXJJZCI6IDA sICJzYW5kYm94Q2hhbGxlbmd lT3V0cHV0Q29uZmlnIjogIkZBSUxFRCJ9XQ |
没有 iFrame 用户互动 |
TIMEOUT |
W3sicHJvdmlkZXJJZCI6IDA sICJzYW5kYm94Q2hhbGxlbmd lT3V0cHV0Q29uZmlnIjogIlRJTUVPVVQifV0 | |
ERROR |
W3sicHJvdmlkZXJJZCI6IDA sICJzYW5kYm94Q2hhbGxlbmdlT3V0cHV0Q29uZmlnIjogIkVSUk9SIn1d |
注意:可以通过预订 API 的 PSD2 流程所支持的Test Header生成 encodedInitConfig
数值。
注意:如果根据 iFrame 的用户输入来测试质询状态代码值 SUCCESS 或 FAILED 时,质询函数响应将等待 iFrame 完成模拟身份验证 UI 后返回。
3DS iFrame 中的 UI 示例:

用法示例
下面将说明操作示例(仅用于指导目的)。该示例将演示在无需用户与 iFrame 互动的情况下,如何运用预定义的参数值来测试 3DS 质询库是否成功。
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 });
双重身份验证和 Property Collect
关于 Property Collect 的双重身份验证
预订 Property Collect 时,Expedia 不会向银行卡收费 - 我们只会将卡片信息发送给住宿方处理。住宿方可能会在住客入住前使用这些信息来验证卡片。办理入住手续时,住宿提供方会预期旅客亲自付款。
不过,有时旅客无法办理入住手续,住宿可能就会收取“预订后未入住”的费用。由于此类收费涉及银行卡且旅客不在场,因而收费可能会受到 PSD2 法规的影响。
如果交易受到影响且收费不合规,住客付款可能会失败,或者住宿方可能需要支付银行卡品牌的罚款。
为了维护我们与住宿提供方的关系并继续服务我们的合作伙伴,Expedia Group 为住宿提方供了一种遵守法规的可选方式。如今,受影响的住宿可以利用 Expedia Group 为他们提供 2FA。如此一来,住宿既能够维护自身业务,同时也确保 EPS 可以继续提供多元化住宿。
EPS Rapid 2.4+ 将在“住宿内容文件”和“住宿内容API”中供<payment_registration_recommended=true>
的标记,用来帮助您识别可能涉及本项目的住宿。
注意:只有欧洲经济区 (EEA) 内的住宿才符合 2FA 的资格。
注意:可能需要 2FA 的住宿数量并非一成不变 - 当更多住宿选择启用此功能时,该集合便随之扩展。可在 EPS Rapid Content v.2.4 中查看这一住宿属性。
Property Collect 的 2FA 对集成有何影响?
如果合作伙伴需要这些要求执行 2FA 的住宿,必须将预订路径设置为支持 2FA。如果不支持 2FA,当发卡银行确定交易需要 2FA 时(例如使用 EEA 境内发行的银行卡),可能无法预订这些住宿。
当住宿收取预订后未入住的费用时,EPS 将成为记录商户 (Merchant of Record)。银行卡账单上的费用描述符将不会显示为住宿方。描述符的数值将由合作伙伴定义。如需自定义此文本,请联系 EPS 合作伙伴支持 (EPS Partner Support)。 为了让银行卡品牌和 EPS Rapid 发布流程的要求符合法规,请在“预订后未入住”的付款页面中,使用已接受付款 API 显示 processing_country。对于 EPS 作为 MOR 而如果使用 2FA 且出现“预订后未入住”的情况的所有交易,这是必要操作。
如何减轻对集成的影响
如果 EPS Rapid 集成在预订流程中不支持 2FA,那么停止销售住宿可以减少预订失败的风险。
请联系 EPS 合作伙伴支持部门 (EPS Partner Support) ,从可订空房 API 响应中删除这些受影响的 Property Collect 房价。
根据本法规,如果使用客服工具,交易则不受 2FA 的限制。使用可订空房 API 的 sales_channel
字段提供说明。
错误处理
创建预订 API 和完成付款会话 API 可能会产生已确认预订和付款交易。
您的集成应参考以下说明,以避免出现财务损失和客户运营事件:
Source | Function | Suggested Timeout Setup | Error Recovery Process | Action(s) Needed |
---|---|---|---|---|
EPS Rapid API |
Pre-Book Price Check for Register Payment Token | 10 seconds | 重试或选择其他住宿、客房或房价 | - |
JavaScript | 3DS Connector Setup | 10 seconds | 重试相同的请求 |
- |
EPS Rapid API | Register Payment Session | 10 seconds | 重试相同的请求,但不包含“Expect: 100-Continue”流程 |
- |
JavaScript | Initiate Payment Session | 10 seconds | 重试相同的请求 |
- |
EPS Rapid API | Create Booking | 90 seconds | 重试相同的请求 |
对于所有错误:通过 affiliate_reference_id 检索预订 |
JavaScript | Display 2FA Challenge | 10 seconds | 重试相同的请求 | - |
JavaScript | Wait for challenge.statusCode |
180 ~ 1200 seconds |
请求完成付款会话 |
- |
EPS Rapid API | Complete Payment Session | 90 seconds | 重试相同的请求 | 对于所有错误:通过 affiliate_reference_id 检索预订 |
EPS Rapid API | 对于所有错误:通过 affiliate_reference_id 检索预订 |
30 seconds | 重试相同的请求 | 对于所有错误:等待 90 秒,然后重试,根据 API 响应代码 404 或 200 确认最终预订状态 |
EPS Home | EPS Portal Login | Expedia Partner Central | Advertise with Expedia | News | Privacy Policy | Cookie Policy
© 2020 Expedia, Inc. All Rights Reserved.