SCAおよびPSD2規制への準拠
オンラインでのクレジットカード決済に関する認証規制について理解する
概要
規制当局やカードネットワーク各社は、オンライン決済のセキュリティを強化し、消費者を不正利用から保護するため、新たな要件を導入しています。こうした規制の多くには、オンライン決済において「強固な顧客認証(SCA)」を実施することが義務付けられています。
- 欧州: 改正決済サービス指令(PSD2)では、特定の適用除外やout-of-scopeが適用される場合を除き、オンライン決済取引においてSCAの利用が義務付けられています。
- 日本: 日本のSCA要件では、オンラインでのクレジットカード取引において3D Secure(3DS)認証の使用が義務付けられていますが、一部の取引種別については例 外が認められています。
3D Secure 2(3DS 2.0)は、Rapid API内でSCA規制への準拠を実現するために採用されているソリューションです。3DS 2.0は、EMVCoおよびカード決済処理業界によって開発された技術であり、セキュリティとスムーズな決済体験のバランスを取りながら、規制への準拠を確保するソリューションです。
このページでは、Rapid APIで対応している決済方法にどのような影響があるか、また旅行者へのサービス提供においてコンプライアンスを遵守するためにどのような措置を講じることができるかについて説明しています。
コンプライアンス要件
SCAが義務付けられている国において、コンプライアンスに準拠した取引を可能にする手順は、登録販売者が誰であるか、および支払い先への支払いがどのように行われるかによって異なります。Rapid API.
貴社が登録販売業者である場合
Expedia Affiliate Collect
Expedia Affiliate Collectを利用した予約については、SCA規制の影響を受けません。Rapid APIにおいて、コンプライアンスを満たすために、決済プロセスやAPI連携の変更は必要ありません。
ただし、貴社が登録販売業者であり、SCA規制の対象となる旅行者のクレジットカード、デビットカード、またはその他の支払い手段に対して請求を行う場合は、この規制の影響を受ける可能性があります。この規制では、決済プロセスにおいて、SCA-compliantソリューションとして3DS 2.0の使用が義務付けられている可能性があります。加盟店が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を「登録加盟店(Merchant of Record)」として利用される場合は、当社のSCA対応ソリューションを導入していただく必要があります。
小売代理店またはコールセンターの担当者を通じて登録された取引は、SCA要件の適用対象外となります。これらの取引で規制に準拠するには、その予約が業者の支援を受けて行われたことの明確な証明のみが求められます。この証明には、Availability API の sales_channel フィールドを使用します。
施設 が登録販売者である場合
貴社が 施設collectをご利用の場合、この規制の影響を受ける可能性があります。「ノーショー」手数料や保証金など、旅行者が不在の状態で、施設 が旅行者のカードに請求を試みる場合があります。これらの請求は、請求の前に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の解決策は、以下の3つの明確なステップで構成されています:
- 次に、 iframe 旅行者向けの発行銀行による認証プロセスをホストするために使用される、「check-out」ページへ。統合に関するドキュメントでは、これは「3DS iframe」と呼ばれています。
- また、check-outページに、新しいclient-side JavaScriptライブラリを追加してください。このライブラリは、ブラウザデータの収集、iframeとの通信、およびiframe内でのSCAエクスペリエンスの表示に使用されます。統合に関するドキュメントでは、これは「3DSコネクタライブラリ」と呼ばれています。
- Rapid API銀行の支払者情報を受け付け、安全な認証が完了した後、予約を確定いたします。
JavaScriptとRapid APIを併用する場合、SCAを使用した予約フローでは、Booking APIが呼び出される前後に、いくつかの追加手順が追加されるようになりました。下の図に、この新しい予約フローを示します。

改訂された予約フローの各ステップでは、1 つのステップの出力に、次のステップの入力として使われるデータが含まれます。データは、ブラウザ上の JavaScript と Rapid の間で受け渡す必要があります。
注: 上記の図は、入門用として実際のAPIフローを簡略化したものです。詳細な API フローについては、統合ドキュメントを参照してください。
統合コンポーネントの詳細
ブラウザの iframe
check-outのエクスペリエンス内に配置されたiframeには、旅行者が利用しているcard-issuingの銀行が所有するURLが埋め込まれています。このURLにアクセスすると、ユーザーに認証画面が表示され、traveler-suppliedの情報がユーザーの銀行に直接転送されます。iframeは当初非表示にしておくべきですが、予約の試行後に認証が求められた際には、ページの上に重ねて表示できるようにする必要があります。
ブラウザの JavaScript ライブラリー
このライブラリは「check-out」ページに追加されており、認証プロセスをサポートするために予約時に呼び出されます。ライブラリーの API は、以下で説明する機能をサポートしています。
お客様のデバイス情報の自動収集
予約手続きを行う前に、認証のための予約準備を行うため、旅行者の端末に関する情報を収集する必要があります。その情報は、旅行者のissuing-bankに送信され、銀行がリスクを評価し、その取引に3DS 2.0認証が必要かどうかを判断し、正しく表示されるように確認するためです。3DS 2.0仕様に基づき、利用者のブラウザから以下のデータが収集されます:言語、色深度、画面の高さ、画面の幅、タイムゾーン、ユーザーエージェント、およびJavaが有効かどうか。
ブラウザのiframe内で認証画面を表示する
予約の試行後、ライブラリーを使用して iframe がオーバーレイ表示され、銀行のコンテンツが iframe に読み込まれます。認証プロセス中、銀行側のシステムは、リスク評価を行うために、旅行者の端末に関する追加情報を収集する場合があります。このプロセスは、予約を完了するために必要です。
Rapid API
Rapid API client-side # ライブラリと連携して動作するAPIが含まれています。JavaScript これらの API は、以下で解説する機能をサポートしています。
お客様と支払い情報の登録
予約手続きを行う前に、認証のための予約準備を行うため、旅行者に関する追加情報を収集する必要があります。収集されるデータには、販売サイトのお客様のアカウントやお客様の支払いに関する詳細が含まれます。このデータはその後、旅行者のissuing-bankに送信され、銀行がリスクを評価し、その取引に安全な認証が必要かどうかを判断できるようになります。Rapid Booking APIの一部である「Register Payment API」をご確認いただき、詳細をご確認ください。
支払いの完了と予約の確認
Rapid APIでの予約を試み、ブラウザ上でSCAプロセスが完了した後、Rapidをもう一度呼び出す必要があります。バックエンドでは、認証が実際に成功したことを確認し、予約を確定できるようにいたします。Rapid Booking APIの「Complete Payments」セッションをご覧いただき、詳細をご確認ください。
予約フロー
「Partner Profile Rapid Support」で3DS 2.0が有効になっている場合、Price Check APIはCreate Booking APIではなく、Register Payments APIへのリンクを返します。下の図に、お客様が予約を開始した後で必要になる API 呼び出しの流れを示します。一連の流れには、JavaScript ライブラリーの呼び出しと Rapid の呼び出しがどちらも含まれています。

予約が認証の準備段階にある場合、必ずしも認証が必要とは限りません。認証の必要性は、お支払いに使用されたクレジットカードの発行銀行によって決定されます。この判定はトランザクション中に実行され、「Create Booking」APIのレスポンスに示されます。
下の図に、保留と再開を使用するときに必要になる API 呼び出しの流れを示します。

注: 上記の図は、入門用として実際のAPIフローを簡略化したものです。詳細な API フローについては、統合ドキュメントを参照してください。
3DS 2.0対応に関する技術要件の詳細については、EMVCoの 3Dセキュアプロトコルおよび主要機能の仕様。
Rapid APIおよ び3DS 2.0統合ガイド
SCAをサポートするには、Rapid APIを、3DSコネクタと呼ばれる新しいJavaScriptライブラリと統合する必要があります。この2つを組み合わせて使用することで、「check-out」ページで3DS 2.0を表示し、予約を確定することができます。このソリューションは、Expedia Collect と Property Collect の両方の決済モデルをサポートしています。
3DS 2.0による予約をサポートするために必要なAPI呼び出しの手順を以下に概説します。詳細については、以下の各セクションで説明しています:
- JavaScript set-up メソッド
- Rapid Register Payment API
- JavaScript initialize session メソッド
- Rapid Book API
- JavaScript challenge メソッド
- Rapid Complete Payment API
この一連の処理を可能にするには、Rapid Partner Supportによって 個々のパートナープロファイルに対して3DS 2.0を有効にする必要があります。
Rapid API
パートナープロファイルで認証が有効になっている場合、3DS 2.0に対応した改訂版の予約フローを可能にするため、APIの応答内容が異なります。
可用性API
規制により認証の免除が認められる場合、APIリクエスト内の「sales_channel」フィールドの値は正確でなければなりません。この数値は、その他の多くの要素とともに、カード発行銀行によって審査され、予約時の判断材料となります。SCAの適用除外となるのは、エージェントツールのみです。これを指定するには、 sales_channel の値を agent_tool に設定します。
Price Check API
API レスポンスには、Create Booking API ではなく、Register Payments API へのリンクが含まれます。
3DS 2.0が有効になっている場合の応答例:
{
"status": "matched",
"occupancies": {
//...(example omitted for length)
},
"links": {
"payment_session": {
"method": "POST",
"href": "/v3/payment-sessions?token=QldfCGlcUAVgBDRwdWXBBL"
}
}
}Register Payments API
これは、SCAの予約フローにおける2番目のステップとなり、JavaScript setupメソッドの実行後に実行されます。
このリクエストには、non-SCAの予約フローの一部である支払い詳細に加え、認証の成功をサポートする新しいフィールドが含まれます。これらのフィールドのうち 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": "2027-02-12T11:59:00.000Z",
"create_date": "2027-09-15",
"change_date": "2027-09-17",
"password_change_date": "2027-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": "2027",
"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": "2027-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
これはSCA予約フローの4番目のステップとなり、JavaScript initSessionメソッドの実行後に実行されます。このリクエストには、SCA用の新しいフィールドは含まれません。必要な情報はすべて、Register Payment APIによって返される予約リンクのトークン内に含まれています。成功した場合、レスポンスには常に itinerary_id が含まれます。ただし、これだけでは予約が確定したとは限りません。3DS 2.0による認証が必要となる場合があるためです。
必要に応じて、応答には.も含まれますencoded_challenge_config。Register Payment API から返された encoded_challenge_config と payment_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="
}Complete Payment Session API
これはSCA予約フローの6番目のステップとなり、JavaScript challengeメソッドの実行後に実行されます。このAPIは、支払いを完了し、Rapid APIに対して、安全な認証の試行が完了したことを(成功したか否かにかかわらず)通知するために必要です。
このリクエストには、SCA用の新しいフィールドは含まれません。
このリクエストが成功した場合、レスポンスには、予約の確認情報(itinerary_id を含む)と、retrieve、cancel、および(必要に応じて)resume へのリンクが含まれます。
レスポンスの例 :
{
"itinerary_id": "8999989898988",
"links": {
"retrieve": {
"method": "GET",
"href": "/v3/itineraries/8999989898988?token=MY5S3j36cOcLfLBZjPYQ1abhfc8CqmjmFVzkk7euvWaunE57LLeDgaxm516m"
}
}
}IframeおよびJavaScriptライブラリの実装
SCA予約ワークフローを使用する場合、「check-out」ページには、新しいiframeとJavaScriptライブラリを含める必要があります。「3DS iframe」と呼ばれるこのiframeでは、以下の方法を使用して認証画面が表示されます。 3D-Secure 2.0。JavaScript ライブラリー (別名 3DS Connector ライブラリー) は、カード発行銀行への情報の転送と 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 の src には、次の 2 つの値のいずれかを設定する必要があります。
| URL タイプ | URL | 備考 |
|---|---|---|
| 本番環境 | https://static.pay.expedia.com/3ds/threeDsIframe.html | 生産認証に対応しています |
| テスト用サンドボックス | https://static.pay.expedia.com/3ds/sandboxThreeDsIframe.html | 認証のテストに対応しています |
テスト URL はテストに対応しています。このトピックについては、このドキュメント内で後ほどあらためて取り上げます。テスト中にiframeの内容を制限するには、iframeに「sandbox」属性を指定することができますが、その際、以下の動作は許可する必要があります:
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>script要素の「source」および「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 | |
| 2.0.1 | src | https://static.pay.expedia.com/3ds/2.0.1/pay-3ds-js-libs-connector.min.js |
| integrity | sha384-1ntftSOl8ZSqJ/m7qqxXTNGOx3JLbF7Uw5YX8i/ageTjgmTnUMZ3ROpxxMiUkYma |
注: 今後のバージョンが利用可能になるにつれて、ソースURLおよび整合性は変更されることになります。バージョン更新は、既存の統合に支障が生じないように行われる予定です。古いバージョンのスクリプトには、引き続きアクセスできます。
SCAでの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コネクタライブラリの一部ではありません。これらの参照は、API への情報転送をサポートするラッパーを例示するためのものです。
この例では、実行時に確定しておくべきパラメータ (referenceId など) に静的な値を使用しています。
Check-outページデザインのガイドライン
3DS認証に対応しているカードブランドによっては、そのガイドラインに従ってロゴやブランド表示を行うことが求められる場合があります。
| カードブランド | 認証ブランディング | ロゴとガイダンス |
|---|---|---|
| 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)
パラメータ :
| 名前 | タイプ | 説明 |
|---|---|---|
threeDsIFrameId | string | 3DS iframe の ID です。 |
threeDsIFrameOrigin | string | 3DS iframe のオリジンです。3DS iframe との通信時に、送信ウィンドウメッセージをターゲットにして受信メッセージを絞り込むために使用されます。 |
設定
バックエンドの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 Booking 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 APIを実行してください。
Rapid APIおよび3DS 2.0を用いたテスト
Rapid APIおよび3DSコネクタの各メソッドとの連携については、APIでサポートされている特定のシナリオに対応する入力パラメータ値を使用してテストすることができます。
Rapid API
Rapid API, をテストするには、HTTPリクエストに「test」という名前のHTTPヘッダーを追加し、そのAPIでサポートされている値のいずれかを使用して、サポートされているシナリオをテストしてください。
SCAの予約フロー内では、Rapid APIからのテスト応答を使用して、3DSコネクタライブラリのメソッドをテストすることも可能です。
支払いの登録
以下の 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コネクタ(Library.t_config)内のさまざまなテストケースが含まれており、これらをinitSession に渡すことで、statusCode の結果を「SKIPPED」に強制的に設定することができます。
予約の作成
「non-SCA」の予約フローに関する「予約テストリクエスト」で定義されているテストヘッダーに加え、SCAワークフローでは追加のテストヘッダー値がサポートされています。
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でサポートされているテストヘッダーを使用して生成することも可能です。
チャレンジ
challengeRequest encondedChallengeConfig を変更することで、サポートされている challengeResponse statusCode の値をテストできます。
| statusCode の値 | テストする encoded_Challenge_config の値 | 説明 |
|---|---|---|
| SUCCESS / FAILED | W3sicHJvdmlkZXJJZCI6IDA sICJzYW5kYm94Q2hhbGxlbmd lT3V0cHV0Q29uZmlnIjogIlNIT1cifV0 | ユーザーと iframe のやり取りなし |
| FAILED | W3sicHJvdmlkZXJJZCI6IDA sICJzYW5kYm94Q2hhbGxlbmd lT3V0cHV0Q29uZmlnIjogIkZBSUxFRCJ9XQ | ユーザーと iframe のやり取りなし |
| TIMEOUT | W3sicHJvdmlkZXJJZCI6IDA sICJzYW5kYm94Q2hhbGxlbmd lT3V0cHV0Q29uZmlnIjogIlRJTUVPVVQifV0 | |
| ERROR | W3sicHJvdmlkZXJJZCI6IDA sICJzYW5kYm94Q2hhbGxlbmdlT3V0cHV0Q29uZmlnIjogIkVSUk9SIn1d |
encodedInitConfigの値は、Booking APIのSCAフローでサポートされているテストヘッダーを使用して生成することも可能です。
注: iframeを使用したユーザー入力に基づいて、チャレンジのステータスコードの値が「SUCCESS」または「FAILED」であるかどうかをテストする場合、チャレンジメソッドのレスポンスは、iframe内のシミュレートされた認証インターフェースの完了を待ちます。
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
});3DS認証と施設の収集
施設collectでのご予約の場合、エクスペディアはクレジットカードへの請求を行いません。その代わりに、施設 に送って処理をお願いしています。宿泊施設はこの情報を使用して、チェックイン前にカードの有効性を確認できます。旅行者の方は、以下の場所で直接お支払いいただく必要があります。check-in.
ただし、お客様がチェックインできず、宿泊施設がノーショー料金を請求する場合があります。これらの請求は、旅行者が立ち会わない状態でカードへの請求が行われるため、SCA規制の影響を受ける可能性があります。
取引が影響を受ける場合、決済に失敗するか、請求が規制に準拠していない場合に宿泊施設がカードブランドからペナルティを受ける可能性があります。
宿泊施設との関係を維持し、パートナー様にサービスを提供し続けるために、Expedia Group は規制に準拠するためのオプションを宿泊施設に提供しています。影響を受けたプロパティは、Expedia Groupを活用して、そのプロパティに代わって認証を行うことができるようになりました。これにより、各物件は事業を守ることができ、Rapid APIがこれまでと同様に多様な物件を提供し続けることが可能となります。
Rapid API施設 コンテンツファイルおよび 施設 コンテンツ内に、<payment_registration_recommended=true> のフラグが設定されています。これにより、プロジェクトに 施設 が関与している可能性がある場合に、それを特定するのに役立ちます。
統合に及ぼす可能性のある影響
セキュリティ認証が必要な物件を提供したい場合は、予約プロセスで3DSに対応している必要があります。3DSに対応していない場合、card-issuingのバンクが取引に認証が必要であると判断した際、これらの物件の予約が失敗する可能性があります。
施設, Rapid APIがno-showの手数料を請求する場合、が登録販売者となります。カードの請求明細書に記載される請求項目の説明文は、施設 ではなく、お客様の組織によって決定されます。このテキストをカスタマイズするには、Rapid パートナーサポートにお問い合わせください。
カードブランドの要件およびRapid APIの導入プロセスに準拠するため、以下の場合には、Accepted Payments APIを使用して、check-out ページに processing_country を表示してください。no-show. これは、Rapid APIが登録加盟店となっているすべての取引において必要となります。また、3DSが使用され、no-showが発生した場合にも、この処理が行われることがあります。
統合への影響を軽減する方法
Rapid APIとの連携において、予約フローでのセキュアな認証がサポートされていない場合、当該宿泊施設の販売を行わないことで、予約失敗のリスクを軽減することができます。Rapid Partner Supportまでご連絡いただければ、Availability APIのレスポンスから、問題の 施設 の収集レートが削除されます。
エージェントツールをご利用の場合、 規制に基づき、当該取引はSCAの対象外となります。この証明には、Availability API の sales_channel フィールドを使用します。
エラー処理
Create Booking API と Complete Payment Session API を使用すると、予約と支払い取引が確定する場合があります。
統合では、金銭的な損失と窓口にお問い合わせいただく事態を避けるために、以下の指示に留意してください。
| 発生元 | 機能 | 推奨タイムアウト設定 | エラー修復プロセス | 必要な対応 |
|---|---|---|---|---|
| Rapid API | 支払い登録トークンの予約前料金チェック | 10 秒 | 再試行、または別の宿泊施設、客室、料金を選択 | — |
| JavaScript | 3DS Connector の設定 | 10 秒 | 同じリクエストを再試行 | — |
| Rapid API | 支払い登録セッション | 10 秒 | 「["Expect: 100-Continue"」処理を行わずに、同じリクエストを再試行してください](https://tools.ietf.org/html/rfc7231#section-6.2.1 ’Follow link’) | — |
| JavaScript | 支払いセッションの開始 | 10 秒 | 同じリクエストを再試行 | — |
| Rapid API | 予約の作成 | 90 秒 | 同じリクエストを再試行 | すべてのエラー : affiliate_reference_id で予約を取得 |
| JavaScript | 認証チャレンジを表示する | 10 秒 | 同じリクエストを再試行 | — |
| JavaScript | challenge.statusCode を待機 | 180 ~ 1,200 秒 | 支払いセッションの完了をリクエスト | — |
| Rapid API | 支払いセッションの完了 | 90 秒 | 同じリクエストを再試行 | すべてのエラー : affiliate_reference_id で予約を取得 |
| Rapid API | すべてのエラー : affiliate_reference_id で予約を取得 | 30 秒 | 同じリクエストを再試行 | すべてのエラー : 90 秒待って再試行し、予約の最終ステータスを API レスポンスコード 404 または 200 で確認 |