欧州 PSD2 規制の遵守

EEA の新しいカード決済規制がビジネスに与える影響について解説します。

概要

決済サービス指令 2 (PSD2) は EEA の規制であり、EEA 加盟国で発行されたクレジットカードが含まれるすべての取引について、支払いと予約のプロセスの変更が求められます。

PSD2 によりセキュリティは向上し詐欺を抑えられますが、同時にヨーロッパ全域における決済方法も根本的に変わりました。こうした規制の一環として、規制範囲内で電子決済を処理する場合に確実な本人認証のためのソリューションが必須となりました。すべてのクレジットカード発元、加盟店管理銀行、加盟店に、確実な本人認証ソリューションのサポートが求められます。EEA 内の銀行ではこの規制が実施されているため、規制に準拠していないと決済に失敗することになります。

このページでは、サポート対象の Rapid API の支払方法への影響と、パートナー様が規制に準拠してお客様との取引を行うために講じられる措置について説明します。この指令の詳細については、欧州委員会の公式サイトで法令を参照してください。

コンプライアンス要件

EEA 内で規制に準拠した取引を行うための手順は、クレジットカードの請求元と、Rapid API への支払い方法によって異なります。

パートナー様がクレジットカードの請求元である場合

Expedia Affiliate Collect

EAC を使用する予約は、PSD2 規制の影響を受けません。規制に準拠するために、支払いプロセスや Rapid との API 統合を変更する必要はありません。ただし、パートナー様がクレジットカードの請求元であり、かつ請求対象が EU 規制範囲内のお客様のクレジットカード、デビットカード、またはその他の支払い方法である場合は、規制の影響を受ける可能性があります。規制により、支払いプロセスで PSD2 に準拠したバージョンの二段階認証 (2FA) のサポートが求められることがあります。クレジットカードの請求元として PSD2 規制に準拠し取引の失敗を回避するための機能について詳しくは、決済処理業者にお問い合わせください。

パートナーカード

パートナー様がクレジットカードの請求元であり、EEA 内で発行された社用クレジットカードまたはデビットカードで Rapid への支払いを行う場合は、規制の影響を受ける可能性があります。PSD2 に準拠したカードの一覧を以下に示します。

  • EEA 内で発行された使い捨てのバーチャルカード
  • EEA 内で個人ではなく会社に発行された法人カード
  • EEA 外で発行されたすべてのカード

請求対象が EEA 規制範囲内のお客様のクレジットカード、デビットカード、またはその他の支払い方法である場合は、規制の影響を受ける可能性があります。規制により、支払いプロセスで PSD2 に準拠したバージョンの二段階認証 (2FA) のサポートが求められることがあります。クレジットカードの請求元として PSD2 規制に準拠し取引の失敗を回避するための機能について詳しくは、決済処理業者にお問い合わせください。

上述の PSD2 準拠パートナーカード以外を使用する必要がある場合は、パートナー様からパートナーカードの発行元の銀行に対して適用免除を直接依頼できます。適用免除が認められた場合、そのカードでの取引は認証が不要になります。ただし、オンラインでの 2FA を使用したワンタイム認証が行われる可能性があります。このワンタイム認証の要件は、銀行によって異なる場合があります。適用除外が認められるまでのプロセスには時間がかかる可能性があり、パートナー様には銀行から不正決済の責任を問われる可能性があることに注意してください。

Rapid がクレジットカードの請求元である場合

お客様のクレジットカード情報を Rapid に送信するかたちでパートナー様が Rapid をクレジットカードの請求元として利用している場合、規制の影響を受ける可能性があります。Rapid は規制により、お客様が小売り代理店を利用せずにオンラインで予約する場合に、お客様が支払いの開始を確認できる仕組みを用意することを義務付けられています。この要件に対応する PSD2 準拠のプロセスが、支払いプロセス中の二段階認証 (2FA) です。パートナー様が EEA 内で発行されたクレジットカードまたはデビットカードについて Rapid をクレジットカードの請求元として利用する場合は、2FA 用の Rapid ソリューションを導入する必要があります。

ただし、小売り代理店またはコールセンターのエージェントを通じて予約された取引は、2FA 要件の適用が免除されます。これらの取引で規制に準拠するには、その予約が業者の支援を受けて行われたことの明確な証明のみが求められます。この証明には、Availability API の sales_channel フィールドを使用します。

宿泊施設がクレジットカードの請求元である場合

パートナー様が Property Collect を使用している場合、規制の影響を受ける可能性があります。「ノーショー」やデポジットなど、宿泊施設がお客様不在の状態でお客様のカードに請求をしようとする状況があります。こういった場合の請求は、請求前に二段階認証 (2FA) を実行しないと規制違反になります。パートナー様が EEA 内で発行されたクレジットカードまたはデビットカードを利用するお客様に対して Property Collect を使用する場合は、2FA 用の Rapid ソリューションを導入する必要があります。

Rapid API ソリューションの概要

仕組み

パートナー様がお客様のカードについて Rapid をクレジットカードの請求元として利用するか、または Property Collect を利用する場合、Rapid の API ソリューションを導入することで、規制に準拠した予約を生成できます。この API は、予約フロー中の 3DS 2.0 による二段階認証をサポートすることで、PSD2 規制への準拠に対応しています。3DS 2.0 はリスクベースの認証をサポートしており、銀行がお客様に 2FA を要求するタイミングと要求しないタイミングを自由に決定できるので、お客様との不和を軽減できます。

2FA 用ソリューションは以下の 3 つの独立したコンポーネントで構成されます。

  • iframe : パートナー様がお支払いページに追加し、カード発行銀行のお客様向け 2FA サービスをホストするために使われます。統合ドキュメントでは 3DS iframe と表記されています。
  • 新しいクライアントサイド JavaScript ライブラリー : お支払いページに常駐し、ブラウザデータの収集、iframe との通信、iframe 内での 2FA サービスの表示に使用されます。統合ドキュメントでは 3DS Connector ライブラリーと表記されています。
  • Rapid : 銀行の支払人情報を受け取り 2FA の後に予約を完了します。

JavaScript と Rapid を一緒に使用する場合、2FA を使用した予約フローには、Booking API の呼び出し前後にいくつかのステップが加わります。下の図に、この新しい予約フローを示します。

予約の準備では、Rapid API での支払いの登録と JavaScript API でのデータの収集を行います。次のステップは、Rapid API での予約です。最後の予約完了ステップでは、まず JavaScript API で 2FA を表示し、次に Rapid API で予約を完了します。

改訂された予約フローの各ステップでは、1 つのステップの出力に、次のステップの入力として使われるデータが含まれます。データは、ブラウザ上の JavaScript と Rapid の間で受け渡す必要があります。

注 : 上の図は、わかりやすくするために実際の API フローを簡略化したものです。詳細な API フローについては、統合ドキュメントを参照してください。

統合コンポーネントの詳細

ブラウザの iframe

お支払いサービスに配置された iframe は、お客様のカード発行銀行が所有する URL をホストします。この URL で、お客様に 2FA サービスが表示され、お客様が入力した情報が銀行に直接転送されます。iframe は、最初は非表示にしておいて、予約の試行後に 2FA の実行を求められた場合に、ページ上にオーバーレイ表示されるようにしておく必要があります。

ブラウザの JavaScript ライブラリー

このライブラリーはお支払いページに追加され、予約時に 2FA プロセスをサポートするために呼び出されます。ライブラリーの API は、以下で説明する機能をサポートしています。

お客様のデバイス情報の自動収集

予約の試行前に、2FA に対する予約の準備としてお客様のデバイスに関する情報を収集する必要があります。収集された情報は後で確認のためにお客様のカードの発行銀行に送信されます。銀行はこの情報に基づいてリスクを評価し、取引に 2FA が必要かどうかを判断して、2FA が画面に正しく表示されるようにします。3DS 2.x の仕様に基づいて、お客様のブラウザから言語、色深度、画面の高さ、画面の幅、タイムゾーン、ユーザーエージェント、Java が有効かどうかに関するデータが収集されます。

ブラウザの iframe での 2FA サービスの表示

予約の試行後、ライブラリーを使用して iframe がオーバーレイ表示され、銀行のコンテンツが iframe に読み込まれます。2FA の処理中に、銀行のコンテンツにより、リスク評価を補足するためにお客様のデバイスに関する追加情報が収集されこともあります。このプロセスは、予約を完了するために必要です。

Rapid

Rapid には、クライアントサイドの JavaScript ライブラリーと連携する API が含まれています。これらの API は、以下で解説する機能をサポートしています。

お客様と支払い情報の登録

予約の試行前に、2FA に対する予約の準備としてお客様に関する追加情報を収集する必要があります。収集されるデータには、販売サイトのお客様のアカウントやお客様の支払いに関する詳細が含まれます。収集されたデータは後で確認のためにお客様のカードの発行銀行に送信されます。銀行はこのデータに基づいてリスクを評価し、取引に 2FA が必要かどうかを判断します。詳しくは、Rapid の Register Payment API を参照してください。

支払いの完了と予約の確認

Rapid での予約の試行およびブラウザでの 2FA プロセスが完了したら、Rapid をもう一度呼び出す必要があります。2FA に成功したことがバックグラウンドで確認され、予約が確定されます。詳しくは、Rapid の支払いセッションの完了を参照してください。

予約フロー

概要

Partner Profile Rapid Support で 2FA が有効になっている場合、Price Check API は Create Booking API ではなく、Register Payments API へのリンクを返します。下の図に、お客様が予約を開始した後で必要になる API 呼び出しの流れを示します。一連の流れには、JavaScript ライブラリーの呼び出しと Rapid の呼び出しがどちらも含まれています。

最初に JavaScript ライブラリーを初期化してから、Rapid API を使用して支払いセッションを作成します。その後再び JavaScript で支払いセッションを初期化し、Rapid API を使用して予約を行います。2FA が必要ない場合、予約はこれで完了です。2FA が必要な場合は、JavaScript を使用して iframe で 2FA を表示し、最後に Rapid API を使用して支払いセッションを完了します。

予約の際に 2FA に備えていたとしても、必ずしも 2FA が必要になるとは限りません。2FA が必要かどうかは、支払いに使用されるクレジットカードの発行銀行が決定します。この決定は取引中に行われ、決定結果が Create Booking API レスポンスに示されます。

下の図に、保留と再開を使用するときに必要になる API 呼び出しの流れを示します。

まず JavaScript ライブラリーを初期化してから、Rapid API を使用して支払いセッションを作成します。次に、JavaScript API を使用して支払いセッションを初期化し、Rapid API を使用して予約を行います。2FA が必要ない場合、Rapid API を使用して予約を再開します。2FA が必要な場合は、JavaScript API を通じて iframe で 2FA を表示し、Rapid API で支払いセッションを完了して、最後に Rapid API を使用して予約を再開します。

注 : 上の図は、わかりやすくするために実際の API フローを簡略化したものです。詳細な API フローについては、統合ドキュメントを参照してください。

詳細を表示

2FA サービスの技術的要件について詳しくは、EMVCo の『3D secure protocol and core functions specification』をご覧ください。

Rapid と二段階認証の統合ガイド

概要

二段階認証 (2FA) をサポートするには、3DS Connector という新しい JavaScript ライブラリーと Rapid を統合する必要があります。この 2 つを組み合わせて、お支払いページへの 2FA の表示と予約の確認を行います。このソリューションは、Expedia Collect と Property Collect の両方の決済モデルをサポートしています。

2FA を伴う予約をサポートするために必要な API 呼び出しの大まかな流れは以下のとおりです。詳しくは次のセクションで解説します。

  1. JavaScript set-up メソッド
  2. Rapid Register Payment API
  3. JavaScript initialize session メソッド
  4. Rapid Book API
  5. JavaScript challenge メソッド
  6. Rapid Complete Payment API

このフローを実現するには、Rapid パートナーサポートにより個々のパートナープロフィールに対して 2FA が有効化される必要があります。

Rapid

パートナープロフィールで二段階認証が有効になっている場合、2FA を使用した改訂版予約フローを実行できるように API レスポンスが変化します。

Availability API

2FA の免除が規制で許容される場合に免除を受けるには、API リクエストの sales_channel フィールドの値が正確である必要があります。この値は、他の多くの要素とあわせて、カードの発行銀行が予約時に判断を下すために確認します。2FA が免除されるのはエージェントツールのみです。これを指定するには、 sales_channel の値を agent_tool に設定します。

Price Check API

API レスポンスには、Create Booking API ではなく、Register Payments API へのリンクが含まれます。

2FA が有効な場合のレスポンスの例 :

{
    "status": "matched",
    "occupancies": {
        //...(example omitted for length)
    },
    "links": {
        "payment_session": {
            "method": "POST",
            "href": "/v3/payment-sessions?token=QldfCGlcUAVgBDRwdWXBBL"
        }
    }
}

Register Payments API

これは JavaScript と Rapid による PSD2 予約フローの 2 番目のステップであり、JavaScript の setup メソッドの次に実行されます。

リクエストには、PSD2 対象外の予約フローに含まれる支払いの詳細と、2FA が成功するようにサポートする新しいフィールドが含まれます。これらのフィールドのうち encoded_browser_metadataversion の 2 つは、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"
        }
    }
}

Create Booking API

これは JavaScript と Rapid による PSD2 予約フローの 4 番目のステップであり、JavaScript の initSession メソッドの次に実行されます。リクエストには PSD2 用の新しいフィールドは含まれません。必要な情報はすべて、Register Payment API によって返される予約リンクのトークン内に含まれています。成功した場合、レスポンスには常に itinerary_id が含まれます。ただし、2FA が必要な可能性があるため、これだけで予約が確定したことにはなりません。

2FA が必要な場合は、レスポンスには encoded_challenge_config も含まれます。Register Payment API から返された encoded_challenge_configpayment_session_id を、JavaScript の challenge メソッドにパラメータとして渡す必要があります。

レスポンスには、complete_payment_session への新しいリンクも含まれます。このリンクは、JavaScript ライブラリーの challenge メソッドの後で使用してください。

2FA が不要な場合は予約が確定し、レスポンスには retrievecancel へのリンク、および状況に応じて resume へのリンクが含まれます。

2FA が必要な場合の Create Booking レスポンスの例 :

{
    "itinerary_id": "8999989898988",
    "links": {
        "complete_payment_session": {
            "method": "PUT",
            "href": "/v3/itineraries/8999989898988/payment-sessions?token=MY5S3j36cOcLfLBZjPYQ1abhfc8CqmjmFVzkk7euvWaunE57LLeDgaxm516m"
        }
    },
    "encoded_challenge_config": "ABElifsiejfacies2@033asfe="
}

Complete Payment Session API

これは JavaScript と Rapid による PSD2 予約フローの 6 番目のステップであり、JavaScript の challenge メソッドの次に実行されます。この API は、支払い処理を完了し、2FA の試行が成否によらず完了したことを Rapid に通知するために必要です。

リクエストには、PSD2 用の新しいフィールドは含まれません。

成功した場合、応答には itinerary_idretrievecancel へのリンク、および状況により resume へのリンクが含まれます。成功レスポンスは、予約が確定したことを示します。

レスポンスの例 :

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

3DS connector JavaScript ライブラリーと 3DS iframe

PSD2 予約ワークフローを使用する場合、お支払いページに新しい iframe と JavaScript ライブラリーを追加する必要があります。iframe (別名 3DS iframe) により、3D セキュア 2.x を使用した認証サービスがお客様に表示されます。JavaScript ライブラリー (別名 3DS Connector ライブラリー) は、カード発行銀行への情報の転送と iframe への銀行コンテンツの読み込みをサポートします。

3DS iframe と JavaScript ライブラリーの追加

3DS 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 の src には、次の 2 つの値のいずれかを設定する必要があります。

URL タイプURL備考
本番環境https://static.pay.expedia.com/3ds/threeDsIframe.html本番環境の 2FA をサポート
テスト用サンドボックスhttps://static.pay.expedia.com/3ds/sandboxThreeDsIframe.html2FA のテストをサポート

テスト 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>

script 要素の src と integrity は以下の値に設定する必要があります。

ライブラリーのバージョン属性
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 と integrity は、今後のバージョンの提供に伴い変更されます。バージョン更新は、既存の統合に支障が生じないように行われる予定です。古いバージョンのスクリプトには、引き続きアクセスできます。

3DS iframe と 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 など) に静的な値を使用しています。

お支払いページのガイドライン

2FA をサポートするカードブランドについては、そのカードのガイドラインに従ったロゴとブランドの表示が求められる場合があります。

カードブランド2FA ブランドロゴとガイダンス
MastercardMastercard Identity Check(https://brand.mastercard.com/debit/mastercard-brand-mark/downloads.html))]
VisaVisa Secure[https://www.merchantsignage.visa.com/brand_guidelines

注 : 他のカードブランドのロゴとガイダンスは、利用可能になり次第掲載します。

3DS Connector JavaScript ライブラリーのドキュメント

クラス : ThreeDSConnector

コンストラクター

new ThreeDSConnector(threeDsIFrameId, threeDsIFrameOrigin)

パラメータ :

名前タイプ説明
threeDsIFrameOriginstring3DS iframe の ID です。
threeDsIFrameOriginstring3DS iframe のオリジンです。3DS iframe との通信時に、送信ウィンドウメッセージをターゲットにして受信メッセージを絞り込むために使用されます。

メソッド

setup

画面サイズや色深度など、バックエンド 3DS サービスで必要なブラウザの基本情報を収集し、支払いセッションを設定します。

メソッドのシグネチャー :

setup(setupRequest)

パラメータ :

名前タイプ
setupRequestSetupRequest

戻り値 :

SetupResponse のプロミス

セッションの初期化

3DS での認証のためにセッションを初期化します。初期化の過程で、ブラウザから追加データが収集される場合があります。クレジットカード発行元から求められた場合は、カード発行元のアクセス制御サーバーがブラウザから直接データを収集できるように、3DS メソッドの URL を iframe に読み込みます。クライアントは、完了コールバックが呼び出されるのを待たずに注文を作成できます。

メソッドのシグネチャー :

initSession(initSessionRequest)

パラメータ :

名前タイプ
initSessionRequestInitSessionRequest

戻り値 : InitSessionResponse のプロミス

チャレンジ

クレジットカード発行者から要求された場合に、3DS 認証サービスを読み込みます。

メソッドのシグネチャー :

challenge(challengeRequest)

パラメータ :

名前タイプ
challengeRequestChallengeRequest

戻り値 : ChallengeResponse のプロミス

クラス : SetupRequest

setup 呼び出しのリクエスト構造です。

プロパティ :

名前タイプ説明
referenceIdstringお客様のお支払いセッションを識別するための参照 ID です。ログ作成とトレースに使用されます。アンダースコアで APIKey と Customer-Session-ID を連結して使用します。例 : [APIKey]_[SessionID]

クラス : SetupResponse

setup 呼び出しからのレスポンスです。

プロパティ :

名前タイプ説明
versionstringこのライブラリーのバージョンです。これはライブラリーへの URL パスに表示されるバージョンと同じです。
encodedBrowserMetadatastring収集されたブラウザの詳細を含む、エンコードされたオブジェクトです。クライアントは、これを非公開データとして扱い解析せずにバックエンドの支払いサービスに渡す必要があります。

クラス : InitSessionRequest

initSession メソッドのリクエスト構造です。

プロパティ :

名前タイプ説明
paymentSessionIdstringRapid Register Payments API によって返される一意の ID です。
encodedInitConfigstringRapid Register Payments API によって返される、初期化に必要なデータを含む config オブジェクトのエンコード済みリストです。

クラス : InitSessionResponse

initSession メソッドのレスポンス構造です。

プロパティ :

名前タイプ説明
statusCodestringinitSession 呼び出しのステータスです。
messagestringオプションです。失敗の理由を示します。

statusCode が取り得る値 :

説明
SUCCESS初期化が正常に完了しました。
SKIPPED初期化は行われませんでした。
FAILED初期化に失敗しました。メッセージフィールドに、失敗に関する追加情報が記載されています。
TIMEOUT制限時間内に初期化が完了しませんでした。タイムアウト時間は 10 秒です。

注 : すべての initSessionresponse statusCode 値について、Rapid Book API を続けて実行します。

クラス : ChallengeRequest

challenge メソッドのリクエスト構造です。

プロパティ :

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 の支払いセッションの完了に進みます。

Rapid と 2 段階認証を使ったテスト

Rapid および 3DS Connector メソッドとの統合を、API でサポートされている具体的なシナリオに対応する入力パラメータ値を使用してテストできます。

Rapid

Rapid をテストするには、HTTP リクエストに Test という名前の HTTP ヘッダーを追加し、テスト対象の API でサポートされている値のいずれかを使用して、サポートされているシナリオをテストします。

PSD2 予約フロー内では、Rapid からのテストレスポンスを使用して 3DS Connector ライブラリーのメソッドをテストすることもできます。

支払いの登録

以下の Test ヘッダー値により、さまざまな API レスポンスの encoded_init_config 値と、さまざまな HTTP レスポンスコードを得られます。encoded_init_config を JavaScript ライブラリーの initSession 呼び出しに渡すと、3DS Connector ライブラリー内のさまざまなテストケースをトリガーできます。

Test ヘッダーの値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 にできます。

予約の作成

PSD2 ワークフローでは、PSD2 対象外の予約フロー向けに Rapid 予約テストリクエストで定義されている Test ヘッダーに加えて、追加の Test ヘッダー値もサポートされます。

Test ヘッダー値によりさまざまな encodedChallengeConfig 値が返されます。これらの値を JavaScript ライブラリーの challenge 呼び出しに渡して、さまざまなテストケースをトリガーすることができます。

Test ヘッダーの値HTTP コードとレスポンスinitSession テストケース
complete_payment_session201 – Response with complete payment session linkSUCCESS (ユーザーと iframe のやり取りなし)
complete_payment_session_show201 – Response with complete payment session linkSUCCESS/FAILED (ユーザーと iframe のやり取りあり)
complete_payment_session_fail201 – Response with complete payment session linkFAILED (ユーザーと iframe のやり取りなし)
complete_payment_session_timeout201 – Response with complete payment session linkTIMEOUT
complete_payment_session_error201 – Response with complete payment session linkERROR

支払いセッションを完了する

Test ヘッダー値により、支払い完了および予約の確定を試行する際に発生する可能性のあるさまざまなエラーケースを発生させられます。

Test ヘッダーの値HTTP コードとレスポンス
payment_declined400 - Payment declined response
price_mismatch409 - Price mismatch response
rooms_unavailable410 - Rooms unavailable response

3DS Connector ライブラリーと iframe

外部依存関係なしで 3DS Connector をテストするには、サポートされているメソッドレスポンスに対応する特定のパラメータ値を使用します。この手法は、テスト用サンドボックスの URL を使用して iframe を読み込む場合のみサポートされます。

セッションの初期化

initSessionRequest encodedInitConfig を変更することで、サポートされている InitSessionResponse statusCode の値をテストできます。

statusCode の値テストする encodedInitConfig の値
SUCCESSW3sicHJvdmlkZXJJZCI6IDAsICJz YW5kYm94SW5pdE91dHB1dENvbmZpZyI6ICJTVUNDRVNTIn1d
FAILEDW3sicHJvdmlkZXJJZCI6IDAsICJz YW5kYm94SW5pdE91dHB1dENvbmZpZyI6ICJGQUlMRUQifV0=
TIMEOUTW3sicHJvdmlkZXJJZCI6IDAsICJz YW5kYm94SW5pdE91dHB1dENvbmZpZyI6ICJUSU1FT1VUIn1d
SKIPPED現時点ではサポートされていません。

注 : encoded_init_config の値は、Register Payments API のサポート対象 Test ヘッダーで生成することもできます。

チャレンジ

challengeRequest encondedChallengeConfig を変更することで、サポートされている challengeResponse statusCode の値をテストできます。

statusCode の値テストする encoded_Challenge_config の値説明
SUCCESSW3sicHJvdmlkZXJJZCI6IDA sICJzYW5kYm94Q2hhbGxlbmd lT3V0cHV0Q29uZmlnIjogIlNVQ0NFU1MifV0ユーザーと iframe のやり取りなし
SUCCESS / FAILEDW3sicHJvdmlkZXJJZCI6IDA sICJzYW5kYm94Q2hhbGxlbmd lT3V0cHV0Q29uZmlnIjogIlNIT1cifV0ユーザーと iframe のやり取りなし
FAILEDW3sicHJvdmlkZXJJZCI6IDA sICJzYW5kYm94Q2hhbGxlbmd lT3V0cHV0Q29uZmlnIjogIkZBSUxFRCJ9XQユーザーと iframe のやり取りなし
TIMEOUTW3sicHJvdmlkZXJJZCI6IDA sICJzYW5kYm94Q2hhbGxlbmd lT3V0cHV0Q29uZmlnIjogIlRJTUVPVVQifV0
ERRORW3sicHJvdmlkZXJJZCI6IDA sICJzYW5kYm94Q2hhbGxlbmdlT3V0cHV0Q29uZmlnIjogIkVSUk9SIn1d

注 : encodedInitConfig の値は、Booking API の PSD2 フローでサポートされている Test ヘッダーで生成することもできます。

注 : iframe へのユーザー入力に基づいて SUCCESS または FAILED のチャレンジ ステータスコード値をテストする場合、challenge メソッドのレスポンスは、iframe のシミュレートされた認証 UI が完了するまで待機します。

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
    });

二段階認証と Property Collect

Property Collect 向けの二段階認証について

Property Collect による予約については、Expedia はカードへの請求は行わず、カード情報を処理用に宿泊施設に送信します。宿泊施設はこの情報を使用して、チェックイン前にカードの有効性を確認できます。お客様はチェックイン時に直接料金を支払うことになります。

ただし、お客様がチェックインできず、宿泊施設がノーショー料金を請求する場合があります。これらの料金は、お客様が不在の状態でカードに請求する必要があるため、PSD2 規制の影響を受ける可能性があります。

取引が影響を受ける場合、決済に失敗するか、請求が規制に準拠していない場合に宿泊施設がカードブランドからペナルティを受ける可能性があります。

宿泊施設との関係を維持し、パートナー様にサービスを提供し続けるために、Expedia Group は規制に準拠するためのオプションを宿泊施設に提供しています。現在、規制の影響を受ける宿泊施設は、2FA の提供を Expedia Group に代行させられます。これにより、宿泊施設はビジネスを守り、Rapid はこれまでと同じように多様な宿泊施設を提供し続けることができます。

Rapid では、施設コンテンツファイルと施設コンテンツに <payment_registration_recommended=true> のフラグが立ちます。このフラグは、プロジェクトに含まれる可能性が生じた宿泊施設を識別するのに役立ちます。

注 : 2FA の対象となるのは、欧州経済領域 (EEA) 内の宿泊施設のみです。2FA が必要になる可能性のある一連の宿泊施設は固定ではありません。この機能を有効にする宿泊施設が増えると、その数が増える可能性があります。

Property Collect 用の 2FA が統合に及ぼす影響

2FA が必要になる可能性のある宿泊施設を提供する場合、パートナー様の予約販路が 2FA をサポートしている必要があります。2FA をサポートしていないと、カード発行銀行が取引に 2FA が必要だと判断した場合 (カードが EEA 内で発行されているなど)、これらの宿泊施設の予約が失敗する可能性があります。

宿泊施設がノーショー料金を請求する場合は、Rapid がクレジットカードの請求元になります。カードの請求明細書に記載される請求名は、宿泊施設が定義することはありません。請求名の値は、パートナー様が定義します。このテキストをカスタマイズするには、Rapid パートナーサポートにお問い合わせください。
カードブランドの要件と Rapid の公開プロセスに準拠し続けるため、ノーショーの場合には Accepted Payments API を使用してお支払いページに processing_country を表示してください。これは Rapid がクレジットカードの請求元であるすべての取引で必須であり、このような事態は 2FA が使用されノーショーが発生した場合に生じる可能性があります。

統合への影響を軽減する方法

Rapid 統合で予約フロー中の 2FA をサポートしていない場合は、こうした宿泊施設を販売しないことで予約が失敗するリスクを減らせます。

規制の影響を受ける Property Collect 料金を Availability API レスポンスから削除するには、Rapid パートナーサポートにお問い合わせください。

エージェントツールを使用しての取引は、規制に基づいて 2FA が免除されます。この証明には、Availability API の sales_channel フィールドを使用します。

エラー処理

Create Booking API と Complete Payment Session API を使用すると、予約と支払い取引が確定する場合があります。

統合では、金銭的な損失と窓口にお問い合わせいただく事態を避けるために、以下の指示に留意してください。

発生元機能推奨タイムアウト設定エラー修復プロセス必要な対応
Rapid API支払い登録トークンの予約前料金チェック10 秒再試行、または別の宿泊施設、客室、料金を選択-
JavaScript3DS Connector の設定10 秒同じリクエストを再試行-
Rapid API支払い登録セッション10 秒"Expect: 100-Continue" プロセスを除いて同じリクエストを再試行-
JavaScript支払いセッションの開始10 秒同じリクエストを再試行-
Rapid API予約の作成90 秒同じリクエストを再試行すべてのエラー : affiliate_reference_id で予約を取得
JavaScript2FA チャレンジの表示10 秒同じリクエストを再試行-
JavaScriptchallenge.statusCode を待機180 ~ 1,200 秒支払いセッションの完了をリクエスト-
Rapid API支払いセッションの完了90 秒同じリクエストを再試行すべてのエラー : affiliate_reference_id で予約を取得
Rapid APIすべてのエラー : affiliate_reference_id で予約を取得30 秒同じリクエストを再試行すべてのエラー : 90 秒待って再試行し、予約の最終ステータスを API レスポンスコード 404 または 200 で確認
このページは役に立ちましたか ?
このコンテンツに改善が必要な点があれば、
サービス向上にご協力いただきありがとうございます。