欧州 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 の呼び出し前後にいくつかのステップが加わります。下の図に、この新しい予約フローを示します。
改訂された予約フローの各ステップでは、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 の呼び出しがどちらも含まれています。
予約の際に 2FA に備えていたとしても、必ずしも 2FA が必要になるとは限りません。2FA が必要かどうかは、支払いに使用されるクレジットカードの発行銀行が決定します。この決定は取引中に行われ、決定結果が Create Booking API レスポンスに示されます。
下の図に、保留と再開を使用するときに必要になる 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 呼び出しの大まかな流れは以下のとおりです。詳しくは次のセクションで解説します。
- JavaScript set-up メソッド
- Rapid Register Payment API
- JavaScript initialize session メソッド
- Rapid Book API
- JavaScript challenge メソッド
- 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_metadata
と version
の 2 つは、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": "/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_config
と payment_session_id
を、JavaScript の challenge
メソッドにパラメータとして渡す必要があります。
レスポンスには、complete_payment_session
への新しいリンクも含まれます。このリンクは、JavaScript ライブラリーの challenge
メソッドの後で使用してください。
2FA が不要な場合は予約が確定し、レスポンスには retrieve
と cancel
へのリンク、および状況に応じて 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_id
、retrieve
と cancel
へのリンク、および状況により 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.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>
script 要素の src と integrity は以下の値に設定する必要があります。
ライブラリーのバージョン | 属性 | 値 |
---|---|---|
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 と 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 ブランド | ロゴとガイダンス |
---|---|---|
Mastercard | Mastercard Identity Check | (https://brand.mastercard.com/debit/mastercard-brand-mark/downloads.html))] |
Visa | Visa Secure | [https://www.merchantsignage.visa.com/brand_guidelines |
注 : 他のカードブランドのロゴとガイダンスは、利用可能になり次第掲載します。
3DS Connector JavaScript ライブラリーのドキュメント
クラス : ThreeDSConnector
コンストラクター
new ThreeDSConnector(threeDsIFrameId, threeDsIFrameOrigin)
パラメータ :
名前 | タイプ | 説明 |
---|---|---|
threeDsIFrameOrigin | string | 3DS iframe の ID です。 |
threeDsIFrameOrigin | string | 3DS iframe のオリジンです。3DS iframe との通信時に、送信ウィンドウメッセージをターゲットにして受信メッセージを絞り込むために使用されます。 |
メソッド
setup
画面サイズや色深度など、バックエンド 3DS サービスで必要なブラウザの基本情報を収集し、支払いセッションを設定します。
メソッドのシグネチャー :
setup(setupRequest)
パラメータ :
名前 | タイプ |
---|---|
setupRequest | SetupRequest |
戻り値 :
SetupResponse
のプロミス
セッションの初期化
3DS での認証のためにセッションを初期化します。初期化の過程で、ブラウザから追加データが収集される場合があります。クレジットカード発行元から求められた場合は、カード発行元のアクセス制御サーバーがブラウザから直接データを収集できるように、3DS メソッドの URL を iframe に読み込みます。クライアントは、完了コールバックが呼び出されるのを待たずに注文を作成できます。
メソッドのシグネチャー :
initSession(initSessionRequest)
パラメータ :
名前 | タイプ |
---|---|
initSessionRequest | InitSessionRequest |
戻り値 : InitSessionResponse
のプロミス
チャレンジ
クレジットカード発行者から要求された場合に、3DS 認証サービスを読み込みます。
メソッドのシグネチャー :
challenge(challengeRequest)
パラメータ :
名前 | タイプ |
---|---|
challengeRequest | ChallengeRequest |
戻り値 : ChallengeResponse
のプロミス
クラス : SetupRequest
setup 呼び出しのリクエスト構造です。
プロパティ :
名前 | タイプ | 説明 |
---|---|---|
referenceId | string | お客様のお支払いセッションを識別するための参照 ID です。ログ作成とトレースに使用されます。アンダースコアで APIKey と Customer-Session-ID を連結して使用します。例 : [APIKey]_[SessionID] |
クラス : SetupResponse
setup 呼び出しからのレスポンスです。
プロパティ :
名前 | タイプ | 説明 |
---|---|---|
version | string | このライブラリーのバージョンです。これはライブラリーへの URL パスに表示されるバージョンと同じです。 |
encodedBrowserMetadata | string | 収集されたブラウザの詳細を含む、エンコードされたオブジェクトです。クライアントは、これを非公開データとして扱い解析せずにバックエンドの支払いサービスに渡す必要があります。 |
クラス : InitSessionRequest
initSession
メソッドのリクエスト構造です。
プロパティ :
名前 | タイプ | 説明 |
---|---|---|
paymentSessionId | string | Rapid Register Payments API によって返される一意の ID です。 |
encodedInitConfig | string | Rapid Register Payments API によって返される、初期化に必要なデータを含む config オブジェクトのエンコード済みリストです。 |
クラス : InitSessionResponse
initSession
メソッドのレスポンス構造です。
プロパティ :
名前 | タイプ | 説明 |
---|---|---|
statusCode | string | initSession 呼び出しのステータスです。 |
message | string | オプションです。失敗の理由を示します。 |
statusCode
が取り得る値 :
値 | 説明 |
---|---|
SUCCESS | 初期化が正常に完了しました。 |
SKIPPED | 初期化は行われませんでした。 |
FAILED | 初期化に失敗しました。メッセージフィールドに、失敗に関する追加情報が記載されています。 |
TIMEOUT | 制限時間内に初期化が完了しませんでした。タイムアウト時間は 10 秒です。 |
注 : すべての initSessionresponse
statusCode
値について、Rapid Book API を続けて実行します。
クラス : 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 チャレンジが正常に完了しました。 |
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 テストケース |
---|---|---|
standard | 201 – Standard Response | SUCCESS |
init_skip | 201 – Response Without encodedInitConfig | サポート対象外 |
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 |
注 : init_skip
は 3DS Connector Library.t_config
内にある各種テストケースをサポートしており、これを initSession
に渡すことで statusCode
の値を強制的に SKIPPED にできます。
予約の作成
PSD2 ワークフローでは、PSD2 対象外の予約フロー向けに Rapid 予約テストリクエストで定義されている Test ヘッダーに加えて、追加の Test ヘッダー値もサポートされます。
Test ヘッダー値によりさまざまな encodedChallengeConfig
値が返されます。これらの値を JavaScript ライブラリーの challenge
呼び出しに渡して、さまざまなテストケースをトリガーすることができます。
Test ヘッダーの値 | HTTP コードとレスポンス | initSession テストケース |
---|---|---|
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 ヘッダー値により、支払い完了および予約の確定を試行する際に発生する可能性のあるさまざまなエラーケースを発生させられます。
Test ヘッダーの値 | HTTP コードとレスポンス |
---|---|
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 の値 | テストする encodedInitConfig の値 |
---|---|
SUCCESS | W3sicHJvdmlkZXJJZCI6IDAsICJz YW5kYm94SW5pdE91dHB1dENvbmZpZyI6ICJTVUNDRVNTIn1d |
FAILED | W3sicHJvdmlkZXJJZCI6IDAsICJz YW5kYm94SW5pdE91dHB1dENvbmZpZyI6ICJGQUlMRUQifV0= |
TIMEOUT | W3sicHJvdmlkZXJJZCI6IDAsICJz YW5kYm94SW5pdE91dHB1dENvbmZpZyI6ICJUSU1FT1VUIn1d |
SKIPPED | 現時点ではサポートされていません。 |
注 : encoded_init_config
の値は、Register Payments API のサポート対象 Test ヘッダーで生成することもできます。
チャレンジ
challengeRequest encondedChallengeConfig
を変更することで、サポートされている challengeResponse statusCode
の値をテストできます。
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 |
注 : encodedInitConfig
の値は、Booking API の PSD2 フローでサポートされている Test ヘッダーで生成することもできます。
注 : iframe へのユーザー入力に基づいて SUCCESS または FAILED のチャレンジ ステータスコード値をテストする場合、challenge メソッドのレスポンスは、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 は規制に準拠するためのオプションを宿泊施設に提供しています。現在、規制の影響を受ける宿泊施設は、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 秒 | 再試行、または別の宿泊施設、客室、料金を選択 | - |
JavaScript | 3DS Connector の設定 | 10 秒 | 同じリクエストを再試行 | - |
Rapid API | 支払い登録セッション | 10 秒 | "Expect: 100-Continue" プロセスを除いて同じリクエストを再試行 | - |
JavaScript | 支払いセッションの開始 | 10 秒 | 同じリクエストを再試行 | - |
Rapid API | 予約の作成 | 90 秒 | 同じリクエストを再試行 | すべてのエラー : affiliate_reference_id で予約を取得 |
JavaScript | 2FA チャレンジの表示 | 10 秒 | 同じリクエストを再試行 | - |
JavaScript | challenge.statusCode を待機 | 180 ~ 1,200 秒 | 支払いセッションの完了をリクエスト | - |
Rapid API | 支払いセッションの完了 | 90 秒 | 同じリクエストを再試行 | すべてのエラー : affiliate_reference_id で予約を取得 |
Rapid API | すべてのエラー : affiliate_reference_id で予約を取得 | 30 秒 | 同じリクエストを再試行 | すべてのエラー : 90 秒待って再試行し、予約の最終ステータスを API レスポンスコード 404 または 200 で確認 |