This is an auto-generated translation

강력한 고객 인증 규정 준수

온라인 신용카드 결제에 대한 인증 규정을 이해합니다.

개요

규제 기관과 카드 네트워크는 온라인 결제의 보안을 강화하고 사기로부터 소비자를 보호하기 위해 새로운 요건을 도입하고 있습니다. 이러한 규정 중 상당수는 온라인 결제 시 강력한 고객 인증(SCA)을 사용해야 한다는 요구 사항을 포함하고 있습니다.

  • 유럽: 개정된 결제 서비스 지침(PSD2)에 따라 특정 면제 또는 out-of-scope 사례가 적용되는 경우를 제외하고 온라인 결제 거래 시 SCA를 사용해야 합니다.
  • 일본: 일본의 SCA 의무에 따라 온라인 신용 카드 거래 시 3D 보안(3DS) 인증을 사용해야 하며 일부 거래 유형에 대해서는 예외가 적용됩니다.

3D Secure 2(3DS 2.0)는 보안과 원활한 결제 환경의 균형을 맞추면서 규정을 준수하는 솔루션으로 EMVCo와 카드 결제 처리 업계에서 개발한 기술입니다. 3DS 2.0은 SCA 규정을 준수하기 위해 Rapid API 내에서 사용되는 솔루션입니다.

이 페이지에서는 지원되는 Rapid API 결제 유형이 어떤 영향을 받는지, 여행자에게 서비스를 제공할 때 규정을 준수하기 위해 취할 수 있는 조치는 무엇인지 설명합니다.

규정 준수 요구 사항

SCA가 요구되는 국가에서 규정을 준수하는 거래를 활성화하는 단계는 기록 판매자가 누구인지, 결제는 어떻게 이루어지는지에 따라 달라집니다. Rapid API.

조직이 기록 판매자인 경우

Expedia Affiliate Collect

익스피디아 제휴사 수집을 사용하는 예약은 SCA 규정의 영향을 받지 않습니다. 규정을 준수하기 위해 결제 프로세스나 API 통합을 Rapid API 변경할 필요가 없습니다.

단, 판매자가 기록 판매자로서 여행자의 신용카드, 직불카드 또는 기타 SCA 규정의 범위 내에 있는 결제 수단을 청구하는 경우 규정의 영향을 받을 수 있습니다. 규정에 따라 결제 과정에서 3DS 2.0 솔루션( SCA-compliant )을 사용해야 할 가능성이 높습니다. 판매자가 SCA 규정을 준수하고 거래 실패를 방지하는 데 도움이 되는 기능에 대해 자세히 알아보려면 결제 처리업체에 문의하시기 바랍니다.

회사 카드

귀사가 기록 판매자이고 SCA 의무가 있는 국가에서 발급된 신용 카드 또는 직불 카드로 Rapid API 결제하는 경우 이러한 카드 유형은 SCA 요구 사항에서 면제됩니다:

  • 일회용 가상 카드
  • 개인이 아닌 회사에 발급된 법인 카드

나열된 SCA-exempt 카드가 선호되지 않는 경우, 카드를 발급한 은행에 직접 면제를 요청할 수 있습니다. 면제가 승인되면 해당 카드로 거래할 때 3DS 2.0을 사용한 one-time 온라인 인증을 제외하고는 인증이 필요하지 않습니다. 이 one-time 요건은 은행마다 다를 수 있습니다. 면제를 받는 데 시간이 오래 걸릴 수 있으며, 은행에서 사기성 결제에 대해 책임을 물을 수도 있습니다.

Rapid API 판매자가 기록 판매자인 경우

귀사에서 Rapid API 을 여행자 카드를 Rapid로 전송하는 기록 판매자로 사용하는 경우, 규정의 영향을 받을 수 있습니다. 여행자가 소매 대리점 없이 온라인으로 예약하는 경우, 규정에 따라 여행자는 SCA를 통해 결제 거래를 인증해야 합니다. 이 요구 사항에 대한 SCA-compliant 프로세스는 결제 과정에서 3DS 2.0을 사용하는 것입니다. SCA 의무가 있는 국가에서 발급된 신용 카드 또는 직불 카드에 대해 Rapid API 을 기록 판매자로 사용하려면 SCA용 솔루션( )을 채택해야 합니다.

리테일 에이전트 또는 콜센터 상담원을 통해 예약한 거래는 SCA 요건에서 면제됩니다. 이러한 거래에서 규정을 준수하려면 예약이 여행사나 상담원의 도움으로 이루어졌다는 명시적인 표시만 있으면 됩니다. 이를 표시하려면 예약 가능 여부 API의 sales_channel 필드를 사용해 주세요.

숙박 시설가 기록 판매자인 경우

회사에서 숙박 시설 수집을 사용하는 경우 규정의 영향을 받을 수 있습니다. '노쇼' 수수료나 보증금 등 여행자가 없는 상태에서 숙박 시설가 여행자의 카드에 결제를 시도할 수 있는 상황이 발생할 수 있습니다. 이 요금은 충전 전에 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의 솔루션은 세 가지 단계로 구성되어 있습니다:

  1. 여행자를 위한 발급 은행의 인증 환경을 호스팅하는 데 사용되는 check-out 페이지에 iframe 을 추가합니다. 통합 문서에서는 이를 3DS 아이프레임이라고 합니다.
  2. 또한 check-out 페이지에 새로운 client-side JavaScript 라이브러리를 포함시켜 브라우저 데이터를 수집하고, iframe과 통신하며, iframe 내에 SCA 환경을 표시합니다. 통합 문서에서는 이를 3DS 커넥터 라이브러리라고 합니다.
  3. Rapid API 은 은행의 결제자 정보를 수락하고 보안 인증이 완료된 후 예약을 완료합니다.

JavaScript 및 Rapid API 을 함께 사용하는 경우, 이제 예약 API가 호출되기 전후에 SCA를 사용한 예약 흐름에 몇 가지 추가 단계가 포함됩니다. 아래의 다이어그램은 업데이트된 예약 흐름입니다.

예약 준비는 Rapid API에서의 결제 등록과 JavaScript API에서의 데이터 수집으로 구성됩니다. 다음 단계는 Rapid API에서의 예약입니다. 마지막으로 예약 완료 단계는 JavaScript API에 SCA를 표시한 다음 예약을 완료하는 것으로 시작됩니다. Rapid API.

변경된 예약 흐름의 각 단계에서는 한 단계의 출력 정보가 다음 단계의 입력 데이터로 사용됩니다. 데이터가 브라우저의 JavaScript와 Rapid 간에 전달되어야 합니다.

참고: 위의 다이어그램은 소개 목적으로 실제 API 흐름을 단순화한 것입니다. 전체 API 흐름을 자세히 알아보려면 통합 설명서를 참조해 주세요.

통합 구성 요소 세부 정보

브라우저 iframe

check-out 경험에 배치된 iframe은 여행자의 card-issuing 은행이 소유한 URL을 호스팅합니다. 이 URL은 사용자에게 인증 환경을 표시하고 traveler-supplied 정보를 은행으로 직접 전송합니다. 아이프레임은 처음에는 숨겨져 있어야 하며, 예약 시도 후 인증 챌린지가 필요할 때 페이지 위에 오버레이할 수 있습니다.

브라우저 JavaScript 라이브러리

이 라이브러리는 check-out 페이지에 추가되며 예약 시 호출되어 인증 프로세스를 지원합니다. 라이브러리의 API는 아래에 설명된 기능을 지원합니다.

여행객의 기기 정보 자동 수집

예약을 시도하기 전에 여행자의 장치에 대한 정보를 수집하여 인증을 위한 예약을 준비해야 합니다. 해당 정보는 여행자의 issuing-bank 으로 전송되어 은행에서 위험을 평가하고 거래에 3DS 2.0 인증이 필요한지 여부를 결정하고 올바르게 표시되는지 확인할 수 있도록 검토됩니다. 3DS 2.0 사양에 따라 여행자의 브라우저에서 언어, 색심도, 화면 높이, 화면 너비, 시간대, 사용자 에이전트, Java 활성화 여부 등의 데이터가 수집됩니다.

브라우저 iframe에 인증 환경을 표시합니다.

예약 시도 후 라이브러리는 iframe 오버레이를 표시하고 은행의 콘텐츠를 iframe에 로드하는 데 사용됩니다. 인증 과정에서 은행의 콘텐츠는 위험 평가를 지원하기 위해 여행자의 기기에 대한 추가 정보를 수집할 수 있습니다. 이 절차는 예약을 완료하는 데 필요합니다.

Rapid API

Rapid API client-side JavaScript 라이브러리와 함께 작동하는 API가 포함되어 있습니다. API는 아래에 설명된 기능을 지원합니다.

여행객 등록 및 결제 정보

예약을 시도하기 전에 여행자에 대한 추가 정보를 수집하여 인증을 위한 예약을 준비해야 합니다. 데이터에는 POS(Point of Sale)와 여행객의 결제 정보가 포함된 여행객 계정의 세부 정보가 포함됩니다. 이 데이터는 나중에 은행이 위험을 평가하고 거래에 보안 인증이 필요한지 여부를 결정할 수 있도록 여행자의 issuing-bank 으로 전송되어 검토됩니다. 자세한 내용은 Rapid의 결제 등록 API를 참조해 주세요.

결제 완료 및 예약 확인

Rapid API 으로 예약을 시도하고 브라우저에서 SCA 프로세스가 완료되면 Rapid를 한 번 더 호출해야 합니다. 뒤에서 실제로 인증이 성공했는지 확인하여 예약을 확정할 수 있도록 합니다. 자세한 내용은 Rapid의 결제 세션 완료를 참조해 주세요.

예약 흐름

파트너 프로필 신속 지원에서 3DS 2.0이 활성화된 경우, 가격 확인 API는 예약 생성 API 대신 결제 등록 API로 연결되는 링크를 반환합니다. 다음 다이어그램은 여행객이 예약을 시작한 후에 필요한 API 호출 시퀀스입니다. 시퀀스에는 JavaScript 라이브러리 및 Rapid에 대한 호출이 모두 포함됩니다.

먼저 JavaScript 라이브러리를 초기화한 다음 Rapid API를 사용하여 결제 세션을 생성합니다. 흐름이 JavaScript로 돌아가 결제 세션을 초기화하면 Rapid API를 사용하여 예약합니다. 인증이 필요하지 않은 경우 예약이 완료된 것입니다. 인증이 필요한 경우 JavaScript 을 사용하여 iframe으로 3DS 2.0을 표시하고 다음을 사용하여 결제 세션을 완료합니다. Rapid API.

예약이 인증을 위해 준비된 경우, 항상 인증이 필요하지 않을 수도 있습니다. 인증 필요 여부는 결제에 사용된 신용 카드의 발급 은행에서 결정합니다. 이 결정은 거래 중에 이루어지며 예약 생성 API 응답에 표시됩니다.

다음 다이어그램은 보류 및 재개 사용 시 필요한 API 호출 시퀀스를 나타냅니다.

먼저 JavaScript 라이브러리를 초기화한 다음, Rapid API를 사용하여 결제 세션을 생성합니다. 다음으로 JavaScript API로 결제 세션을 초기화한 후 Rapid API로 예약합니다. 인증이 필요하지 않은 경우 Rapid API 으로 이동하여 예약을 재개하세요. 인증이 필요한 경우 JavaScript API를 통해 iframe으로 3DS 2.0을 표시하고 Rapid API, 으로 결제 세션을 완료한 다음 Rapid API 을 사용하여 예약을 재개합니다.

참고: 위의 다이어그램은 소개 목적으로 실제 API 흐름을 단순화한 것입니다. 전체 API 흐름을 자세히 알아보려면 통합 설명서를 참조해 주세요.

3DS 2.0 환경의 기술적 요구 사항에 대한 자세한 내용은 EMVCo의 3D 보안 프로토콜 및 핵심 기능 사양을 참조하세요 .

Rapid API 및 3DS 2.0 통합 가이드

SCA를 지원하려면 Rapid API 을 새로운 JavaScript 라이브러리(3DS 커넥터라고 함)와 통합해야 합니다. 이 두 가지를 함께 사용하여 check-out 페이지에서 3DS 2.0을 소개하고 예약을 확정할 수 있습니다. 이 솔루션은 Expedia Collect 및 Property Collect 비즈니스 모델을 모두 지원합니다.

3DS 2.0으로 예약을 지원하는 데 필요한 API 호출 순서는 아래에 요약되어 있으며 다음 섹션에 자세히 설명되어 있습니다:

  1. JavaScript 설정 메서드
  2. Rapid 결제 등록 API
  3. JavaScript 세션 초기화 메서드
  4. Rapid 예약 API
  5. JavaScript 챌린지 메서드
  6. Rapid 결제 완료 API

이 순서를 허용하려면 Rapid Partner Support에서 개별 파트너 프로필에 대해 3DS 2.0을 사용하도록 설정해야 합니다.

Rapid API

파트너 프로필에 인증이 활성화된 경우, 3DS 2.0에서 수정된 예약 흐름을 허용하도록 API 응답이 달라집니다.

가용성 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_metadataversion 필드는 JavaScript API의 setup method에서 반환됩니다.

응답에는 payment_session_idencoded_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": "/v3/itineraries?token=MY5S3j36cOcLfLBZjPYQ1abhfc8CqmjmFVzkk7euvWaunE57LLeDgaxm516m"
        }
    }
}

예약 생성 API

이는 SCA 예약 흐름의 네 번째 단계이며 JavaScript initSession방법 다음으로 진행됩니다. 요청에는 SCA에 대한 새 필드가 포함되지 않으며, 필요한 모든 정보는 결제 등록 API에서 반환한 예약 링크의 토큰에 포함되어 있습니다. 성공 시 응답에는 항상 itinerary_id가 포함됩니다. 그러나 3DS 2.0 인증이 필요할 수 있으므로 이것만으로는 예약이 확정된 것으로 볼 수 없습니다.

필요한 경우 응답에 encoded_challenge_config. 결제 등록에서 반환된 encoded_challenge_configpayment_session_id는 JavaScript challenge 메서드에 매개변수로 전달되어야 합니다.

응답에는 complete_payment_session에 대한 새 링크도 포함됩니다. 이 링크는 JavaScript 라이브러리의 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_idretrieve, cancel, 그리고 선택 사항으로 resume링크 포함)가 포함됩니다.

응답 예:

{
    "itinerary_id": "8999989898988",
    "links": {
        "retrieve": {
            "method": "GET",
            "href": "/v3/itineraries/8999989898988?token=MY5S3j36cOcLfLBZjPYQ1abhfc8CqmjmFVzkk7euvWaunE57LLeDgaxm516m"
        }
    }
}

Iframe 및 JavaScript 라이브러리 구현

SCA 예약 워크플로우를 사용하는 경우 check-out 페이지에 새 iframe과 JavaScript 라이브러리가 포함되어야 합니다. 3DS 아이프레임이라고 하는 이 아이프레임은 3D-Secure 2.0 을 사용하여 인증 환경을 표시합니다. 3DS Connector 라이브러리라고 하는 JavaScript 라이브러리는 발급 은행으로 정보 전송을 지원하고 은행의 콘텐츠를 iframe에 로드합니다.

Iframe 추가하기

3DS iframe은 처음에는 숨겨져 있다가 결제를 처리하기 위해 인증 요청이 필요할 때 표시될 수 있는 컨테이너에 있어야 합니다.

컨테이너 디자인은 호스팅 페이지에 맞게 사용자 설정할 수 있습니다. 아래는 부트스트랩 모달을 사용하여 안내용으로 제작된 구현 예시입니다.

<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의 소스는 다음 두 값 중 하나로 설정되어야 합니다.

URL 유형URL참고
프로덕션https://static.pay.expedia.com/3ds/threeDsIframe.html프로덕션 인증 지원
샌드박스 테스트https://static.pay.expedia.com/3ds/sandboxThreeDsIframe.html인증 테스트 지원

테스트 URL은 테스트를 지원하며, 이 주제는 문서 후반부에서 다룹니다. 테스트 중에 iframe의 콘텐츠를 제한하려면 샌드박스를 사용하여 iframe을 어트리뷰션할 수 있지만 다음을 허용해야 합니다:

sandbox = ’allow-scripts allow-forms allow-same-origin’;

JavaScript 라이브러리 추가

3DS Connector 라이브러리는 3DS iframe과 통신하고 iframe 콘텐츠를 제공하는 발급 은행에 데이터를 전송합니다. 아래는 결제 페이지에 라이브러리를 추가하는 방법의 예입니다.

<head>
    <script src="<<3DS connector script URL>>" integrity="<<actual integrity value>>"></script>
</head>

스크립트 요소의 소스 및 무결성 값은 다음과 같이 설정해야 합니다.

라이브러리 버전속성
1.3.39srchttps://static.pay.expedia.com/3ds/1.3.39/pay-3ds-js-libs-connector.min.js
integritysha384-par0I4Q5cfljwzqw2mAggM4dKdYzGyj4uZiL4cMviGjI3qVzEgWGuZ2075mYutbT 
1.3.65srchttps://static.pay.expedia.com/3ds/1.3.65/pay-3ds-js-libs-connector.min.js
integritysha384-gYopPw6xE5DZwnZXGavkwnvs3NkDOobnHqjroUnSHpGXvs/J9xjHX/8aGzKtSgWI 

참고: 향후 버전을 사용할 수 있게 되면 소스 URL 및 무결성이 변경됩니다. 최신 버전이 기존 통합을 중단해서는 안 됩니다. 이전 버전의 스크립트에는 계속 액세스할 수 있습니다.

3DS 및 JavaScript 사용

라이브러리에서는 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 Connector 라이브러리의 일부가 아닙니다. 이는 API로의 정보 전송을 지원하는 래퍼를 보여 주기 위한 것입니다.

예제에서는 런타임 시 정해져야 하는 매개변수에 대해 정적 값을 사용합니다(예: referenceId).

Check-out 페이지 디자인 가이드라인

3DS 인증을 지원하는 카드 브랜드는 가이드라인에 따라 로고와 브랜딩을 표시해야 할 수 있습니다.

카드 브랜드인증 브랜딩로고 및 지침
MastercardMastercard Identity Check https://brand.mastercard.com/debit/mastercard-brand-mark/downloads.html
VisaVisa Securehttps://www.merchantsignage.visa.com/brand_guidelines

참고: 다른 카드 브랜드의 로고 및 지침은 제공되는 대로 포함될 예정입니다.

3DS Connector JavaScript 라이브러리 설명서

클래스: ThreeDSConnector

생성자: new ThreeDSConnector(threeDsIFrameId, threeDsIFrameOrigin)

매개변수:

이름유형설명
threeDsIFrameIdstring3DS iframe의 ID입니다.
threeDsIFrameOriginstring3DS iframe의 소스입니다. 3DS iframe과 통신할 때 발신 창 메시지를 대상으로 하고 수신 메시지를 필터링하는 데 사용됩니다.

설정

화면 크기, 색 농도 등 백엔드 3DS 서비스에 필요한 브라우저에 대한 기본 정보를 수집하여 결제 세션을 설정합니다.

메소드 서명: setup(setupRequest)

매개변수:

이름유형
setupRequestSetupRequest

반품: 반환: 약속 SetupResponse

초기화

3DS로 인증하기 위해 세션을 초기화합니다. 초기화 과정에서 추가 데이터가 브라우저에서 수집될 수 있습니다. 카드 발급사에서 요구하는 경우 3DS 메서드 URL을 iframe에 로드하여 카드 발급사의 액세스 제어 서버가 브라우저에서 직접 데이터를 수집하도록 지원할 수 있습니다. 클라이언트는 주문을 생성하기 전에 완료 콜백이 호출될 때까지 기다리지 않아도 됩니다.

메소드 서명: initSession(initSessionRequest)

매개변수:

이름유형
initSessionRequestInitSessionRequest

반품: 반환: 약속 InitSessionResponse

챌린지

카드 발급사에서 요구하는 경우 3DS 인증 환경을 로드합니다.

메소드 서명: challenge(challengeRequest)

매개변수:

이름유형
challengeRequestChallengeRequest

반품: 반환: 약속 ChallengeResponse

클래스: SetupRequest

설정 호출의 요청 구조입니다.

속성:

이름유형설명
referenceIdstring여행객의 결제 세션을 식별하기 위한 참조 ID입니다. 로깅 및 추적에 사용됩니다. 밑줄을 사용하여 연결된 APIKey와 Customer-Session-ID를 사용합니다. 예: [APIKey]_[SessionID]

클래스: SetupResponse

설정 호출의 응답입니다.

속성:

이름유형설명
versionstring라이브러리의 버전으로, 라이브러리로의 URL 경로에 있는 버전과 동일합니다.
encodedBrowserMetadatastring수집된 브라우저 세부 정보를 포함하는 인코딩된 개체입니다. 클라이언트는 이를 구문 분석하지 않고 불분명한 데이터로 처리하여 백엔드 결제 서비스에 전달해야 합니다.

클래스: InitSessionRequest

initSession 메서드의 요청 구조입니다.

속성:

이름유형설명
paymentSessionIdstringRapid 결제 등록 API에서 반환하는 고유 ID입니다.
encodedInitConfigstringRapid 결제 등록 API에서 반환하는 초기화에 필요한 데이터가 포함된 config 개체의 인코딩된 목록입니다.

클래스: InitSessionResponse

initSession 메서드에 대한 응답 구조입니다.

속성:

이름유형설명
statusCodestringinitSession 호출의 상태입니다.
messagestring선택 사항으로, 실패 이유를 나타냅니다.

가능한 statusCode 값:

설명
SUCCESS초기화가 성공적으로 완료되었습니다.
SKIPPED초기화가 수행되지 않았습니다.
FAILED초기화에 실패했습니다. 메시지 필드에는 실패와 관련된 추가 정보가 나와 있습니다.
TIMEOUT허용 시간 내에 초기화가 완료되지 않았습니다. 제한 시간은 10초입니다.

참고: 모든 initSessionresponse statusCode값에 대해 빠른 예약 API를 진행합니다.

클래스: ChallengeRequest

챌린지 메서드의 요청 구조입니다.

속성:

statusCode 값encoded_Challenge_config 값 테스트설명
SUCCESSW3sicHJvdmlkZXJJZCI6IDA sICJzYW5kYm94Q2hhbGxlbmd lT3V0cHV0Q29uZmlnIjogIlNVQ0NFU1MifV0사용자 iframe 상호 작용 없음
SUCCESS/FAILEDW3sicHJvdmlkZXJJZCI6IDA sICJzYW5kYm94Q2hhbGxlbmd lT3V0cHV0Q29uZmlnIjogIlNIT1cifV0사용자 iframe 상호 작용 없음
FAILEDW3sicHJvdmlkZXJJZCI6IDA sICJzYW5kYm94Q2hhbGxlbmd lT3V0cHV0Q29uZmlnIjogIkZBSUxFRCJ9XQ사용자 iframe 상호 작용 없음
TIMEOUTW3sicHJvdmlkZXJJZCI6IDA sICJzYW5kYm94Q2hhbGxlbmd lT3V0cHV0Q29uZmlnIjogIlRJTUVPVVQifV0
ERRORW3sicHJvdmlkZXJJZCI6IDA sICJzYW5kYm94Q2hhbGxlbmdlT3V0cHV0Q29uZmlnIjogIkVSUk9SIn1d

가능한 statusCode 값

설명
SUCCESS3DS 챌린지가 성공적으로 완료되었습니다.
SKIPPED외부 애플리케이션 오류가 발생했습니다.
FAILED카드 소유자가 인증 챌린지에 올바르게 응답하지 못하여 3DS 챌린지가 제대로 완료되지 않았습니다.
TIMEOUT허용 시간 내에 챌린지가 완료되지 않았습니다. 제한 시간은 1,200초입니다.

참고: 모든 challengeResponse statusCode값의 경우 Rapid API 으로 진행하여 결제 세션을 완료하세요.

Rapid API 및 3DS 2.0으로 테스트

Rapid API 및 3DS 커넥터 메서드와의 통합은 API에서 지원하는 특정 시나리오에 해당하는 입력 매개변수 값으로 테스트할 수 있습니다.

Rapid API

Rapid API, 테스트하려면 HTTP 요청에 test이라는 추가 HTTP 헤더를 포함시키고 해당 API에 지원되는 값 중 하나를 사용하여 지원되는 시나리오를 테스트합니다.

SCA 예약 흐름 내에서 Rapid API 의 테스트 응답을 사용하여 3DS 커넥터 라이브러리 메서드를 테스트할 수도 있습니다.

결제 등록

다음 테스트 헤더 값은 API 응답과 다른 HTTP 응답 코드에서 상이한 encoded_init_config 값을 산출합니다. encoded_init_config 는 JavaScript 라이브러리의 initSession 호출에 전달되어 3DS Connector 라이브러리 내에서 다양한 테스트 사례를 트리거할 수 있습니다.

테스트 헤더 값HTTP 코드 및 응답initSession 테스트 사례
standard201 – Standard ResponseSUCCESS
init_skip201 - Response Without encodedInitConfig지원되지 않음
init_fail201 – Standard ResponseFAILED
init_timeout201 – Standard ResponseTIMEOUT
internal_server_error500 – Internal Server Error
internal_server_error503 - Server Unavailable

참고: init_skip은 3DS Connector Library.t_config 내에서 initSession으로 전달될 수 있는 다양한 테스트 사례를 건너뛰며, 강제로 statusCode를 SKIPPED로 설정합니다.

예약 생성

non-SCA 예약 플로우에 대한 빠른 예약 테스트 요청 에 정의된 테스트 헤더 외에도 SCA 워크플로에 대한 추가 테스트 헤더 값이 지원됩니다.

테스트 헤더 값은 서로 다른 encodedChallengeConfig 값을 생성하며, 이는 JavaScript 라이브러리의 challenge 호출로 전달되어 다양한 테스트 사례를 트리거할 수 있습니다.

테스트 헤더 값HTTP 코드 및 응답initSession 테스트 사례
complete_payment_session201 – Response with complete payment session linkSUCCESS without user iframe Interaction
complete_payment_session_show201 – Response with complete payment session linkSUCCESS/FAILED with user iframe interaction
complete_payment_session_fail201 – Response with complete payment session linkFAILED without user iframe interaction
complete_payment_session_timeout201 – Response with complete payment session linkTIMEOUT
complete_payment_session_error201 – Response with complete payment session linkERROR

결제 세션 완료

테스트 헤더 값으로 인해 결제를 완료하고 예약을 확인하려고 할 때 일어날 수 있는 다양한 오류 사례가 발생합니다.

테스트 헤더 값HTTP 코드 및 응답
payment_declined400 - Payment declined response
price_mismatch409 - Price mismatch response
rooms_unavailable410 - Rooms unavailable response

3DS Connector 라이브러리 및 iframe

특정 매개변수 값이 지원되는 메서드 응답과 일치해야 외부 종속성 없이 3DS Connector를 테스트할 수 있습니다. 이 동작은 iframe이 테스트 샌드박스 URL로 로드된 경우에만 지원됩니다.

세션 초기화

지원되는 InitSessionResponse statusCode 값은 initSessionRequest encodedInitConfig를 변경하여 테스트할 수 있습니다.

statusCode 값encodedInitConfig 값 테스트
SUCCESSW3sicHJvdmlkZXJJZCI6IDAsICJz YW5kYm94SW5pdE91dHB1dENvbmZpZyI6ICJTVUNDRVNTIn1d
FAILEDW3sicHJvdmlkZXJJZCI6IDAsICJz YW5kYm94SW5pdE91dHB1dENvbmZpZyI6ICJGQUlMRUQifV0=
TIMEOUTW3sicHJvdmlkZXJJZCI6IDAsICJz YW5kYm94SW5pdE91dHB1dENvbmZpZyI6ICJUSU1FT1VUIn1d
SKIPPED현재 지원되지 않습니다.

참고: encoded_init_config 값은 결제 등록 API의 지원되는 테스트 헤더를 사용하여 생성할 수도 있습니다.

챌린지

지원되는 challengeResponse statusCode 값은 challengeRequest encondedChallengeConfig를 변경하여 테스트할 수 있습니다.

statusCode 값encoded_Challenge_config 값 테스트설명
SUCCESSW3sicHJvdmlkZXJJZCI6IDA sICJzYW5kYm94Q2hhbGxlbmd lT3V0cHV0Q29uZmlnIjogIlNVQ0NFU1MifV0사용자 iframe 상호 작용 없음
SUCCESS/FAILEDW3sicHJvdmlkZXJJZCI6IDA sICJzYW5kYm94Q2hhbGxlbmd lT3V0cHV0Q29uZmlnIjogIlNIT1cifV0사용자 iframe 상호 작용 없음
FAILEDW3sicHJvdmlkZXJJZCI6IDA sICJzYW5kYm94Q2hhbGxlbmd lT3V0cHV0Q29uZmlnIjogIkZBSUxFRCJ9XQ사용자 iframe 상호 작용 없음
TIMEOUTW3sicHJvdmlkZXJJZCI6IDA sICJzYW5kYm94Q2hhbGxlbmd lT3V0cHV0Q29uZmlnIjogIlRJTUVPVVQifV0
ERRORW3sicHJvdmlkZXJJZCI6IDA sICJzYW5kYm94Q2hhbGxlbmdlT3V0cHV0Q29uZmlnIjogIkVSUk9SIn1d

encodedInitConfig값은 예약 API의 SCA 흐름에 대해 지원되는 테스트 헤더를 사용하여 생성할 수도 있습니다.

참고: iframe을 사용하여 사용자 입력에 따라 챌린지 상태 코드 값이 성공 또는 실패인지 테스트할 때 챌린지 메서드 응답은 iframe에서 시뮬레이션된 인증 인터페이스가 완료될 때까지 대기합니다.

3DS iframe의 UI 예:

3DS iframe의 예

사용 예

아래는 안내용으로 제작된 구현 예입니다. 이 예에서는 사전 정의된 매개변수 값을 통해 사용자가 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
    });

3DS 인증 및 숙박 시설 수집

숙박 시설 collect로 예약할 경우, Expedia는 카드에 요금을 청구하지 않습니다. 대신 숙박 시설로 전송하여 처리합니다. 숙박 시설에서는 이 정보를 바탕으로 체크인 전에 카드를 인증할 수 있습니다. 여행자는 다음 주소에서 직접 결제해야 합니다. check-in.

그러나 여행객이 체크인하지 못하는 상황이 발생할 수 있는데, 이 경우 숙박 시설은 노쇼 수수료를 부과할 수 있습니다. 이러한 요금은 여행자가 부재 중일 때 카드에 청구되기 때문에 SCA 규정의 영향을 받을 수 있습니다.

거래가 영향을 받는 경우 결제에 실패할 수 있고, 청구가 규정을 준수하지 않으면 카드 브랜드에서 숙박 시설에 위약금을 부과할 수 있습니다.

숙박 시설과의 관계를 보호하고 파트너에게 지속적으로 서비스를 제공할 수 있도록 Expedia Group은 숙박 시설에 규정 준수를 위한 옵션을 제공합니다. 영향을 받는 숙박 시설는 이제 Expedia Group 을 활용하여 인증을 대신 제공할 수 있습니다. 이를 통해 숙박 시설는 비즈니스를 보호하고 Rapid API 에서 계속해서 다양한 숙박 시설를 제공할 수 있습니다.

Rapid API 콘텐츠 파일과 숙박 시설 콘텐츠에 <payment_registration_recommended=true>플래그를 제공하면 프로젝트에 잠재적으로 관련되어 있는 숙박 시설를 식별하는 데 도움이 될 수 있습니다.

통합에 미칠 수 있는 영향

보안 인증이 필요할 수 있는 숙박 시설를 제공하려는 경우 예약 경로가 3DS를 지원해야 합니다. 3DS를 지원하지 않는 경우, card-issuing 은행에서 거래에 인증이 필요하다고 판단하는 경우 숙박 시설 예약이 실패할 수 있습니다.

no-show 수수료가 부과되는 경우 숙박 시설, Rapid API 판매자가 기록 판매자가 됩니다. 카드 청구 명세서의 청구 설명자는 숙박 시설가 아닌 조직에서 정의합니다. 이 텍스트를 사용자 지정하려면 Rapid 파트너 지원 팀에 문의해 주세요.

카드 브랜드의 요구 사항 및 Rapid API 출시 프로세스를 계속 준수하려면 다음과 같은 경우 허용된 결제 API를 사용하여 check-out 페이지에 processing_country을 표시하십시오. no-show. 이는 Rapid API 판매자가 기록 판매자인 모든 거래에 필요하며, 3DS를 사용하고 no-show 이 발생하는 경우 발생할 수 있습니다.

통합에 미치는 영향을 완화하는 방법

Rapid API 통합이 예약 흐름에서 보안 인증을 지원하지 않는 경우, 숙박 시설를 판매하지 않음으로써 예약 실패의 위험을 줄일 수 있습니다. 신속한 파트너 지원팀에 문의하여 가용성 API 응답에서 영향을 받는 숙박 시설 수집 요금이 제거되도록 하세요.

에이전트 도구를 사용하는 경우 해당 거래는 규정에 따라 SCA가 면제됩니다. 이를 표시하려면 예약 가능 여부 API의 sales_channel 필드를 사용해 주세요.

오류 처리

예약 생성 API 및 결제 세션 완료 API를 사용하면 예약 및 결제 거래를 확정할 수 있습니다.

재정 손실을 방지하고 고객 운영 문제를 피하려면 통합 시 다음 지침을 고려해야 합니다.

소스기능추천 시간 제한 설정오류 복구 절차필요한 조치
Rapid API결제 등록 토큰을 위한 사전 예약 요금 확인10초다시 시도하거나 다른 숙박 시설, 객실 또는 요금 선택-
JavaScript3DS Connector 설정10초동일한 요청 재시도-
Rapid API결제 세션 등록10초"예상: 100-계속" 프로세스 없이 동일한 요청을 다시 시도합니다.](https://tools.ietf.org/html/rfc7231#section-6.2.1 ’Follow link’)-
JavaScript결제 세션 시작10초동일한 요청 재시도-
Rapid API예약 생성90초동일한 요청 재시도모든 오류의 경우 affiliate_reference_id로 예약 검색
JavaScript디스플레이 인증 문제10초동일한 요청 재시도-
JavaScriptchallenge.statusCode 대기180~1,200초결제 세션 완료 요청-
Rapid API결제 세션 완료90초동일한 요청 재시도모든 오류의 경우 affiliate_reference_id로 예약 검색
Rapid API모든 오류의 경우 affiliate_reference_id로 예약 검색30초동일한 요청 재시도모든 오류의 경우: API 응답 코드 404 또는 200으로 예약의 최종 상태를 확인하려면 재시도 전에 90초 대기
이 페이지가 도움이 되었나요?
이 콘텐츠를 어떻게 개선하면 좋을까요?
더 나은 Developer Hub를 만드는 데 도움을 주셔서 감사합니다!