Account Information API

Account Information API には各顧客の詳細情報が含まれています。テンプレートサイトでは、シングルサインオン (SSO) プロトコルの一部としてこの情報を使用してユーザーのアカウントを検証します。購入やロイヤルティの利用などに使用されます。

ユーザーアカウントの詳細を取得するリクエストの一環として、エクスペディアエージェントが旅行者の一意の識別子 (たとえば、クレジットカード番号) を検証するためにこの API を使用することもできます。受け取った詳細は、旅行者のショッピングや予約を進める前に、電話で旅行者の本人確認を行うために使用されます。

追加情報については、一般的なデータとレスポンスに関するページをご覧ください。

クレジットカードの暗号化と復号化

エクスペディアでは、クレジットカード情報の暗号化と復号化に業界標準の JWE (JSON Web 暗号化) 技術を使用しています (公開鍵と秘密鍵のペアを使用した非対称暗号化)。

暗号化のユースケース

以下で暗号化を行う必要があります。

  • リクエスト : cardNumber
  • レスポンス : cardDetails

リクエストパラメーターでは、貴社が 2048 ビットの CA (認証局) 署名 RSA (Rivest Shamir Adleman) 秘密鍵証明書を設定し、エクスペディアと共有する必要があります。次に、エクスペディアでは貴社の公開鍵を使って、JWE と RSA で cardNumber フィールドを暗号化します。

レスポンスパラメーターでは、エクスペディアが 2048 ビットの CA 署名 RSA 秘密鍵を設定し、対応する公開鍵証明書を共有し、貴社と共有します。その後、貴社でエクスペディアの公開鍵を使用して、JWE と RSA で cardDetails の各要素を暗号化します。

暗号化プロセスの手順は以下のとおりです。

暗号化 (ステップ別)

ステップ 1 : 公開証明書を取得して RSA 2048 公開鍵を取得します。

  1. 256 ビット長のランダムな対象鍵 (RSK) を生成します。
  2. RSA-OAEP-256 アルゴリズムを使用し、RSA 2048 公開鍵で RSK を暗号化します。

ステップ 2 : 96 ビット長のランダム初期化ベクトル (IV) を生成します。

ステップ 3 : RSK、IV、アルゴリズム A256GCM を使用して平文データを暗号化し、暗号文と認証タグデータを作成します。

ステップ 4 : 暗号文を Base64URL でエンコードして Base64URL (JWE 暗号文) を生成します。

ステップ 5 : 認証タグ、IV、RSK、JWE ヘッダー JSON を Base64URL でエンコードして以下を生成します。

  • 認証タグデータ : Base64URL (JWE 認証タグ)
  • IV : Base64URL (JWE 初期化ベクトル)
  • RSK : Base64URL (JWE の暗号化された鍵)
  • JWE ヘッダー JSON : Base64URL (UTF8 (JWE ヘッダー))

次に、ピリオド ('.') で区切られた、Base64URL でエンコードされたパーツから成るコンパクトなフォーマットに JWE オブジェクトをシリアル化して以下を生成します。

Base64URL (UTF8) (JWE ヘッダー) || '.' || Base64URL (JWE の暗号化された鍵) || '.' || Base64URL (JWE 初期化ベクトル) || '.' || Base64URL (JWE 暗号文) || '.' || Base64URL (JWE 認証タグ)

コードサンプル

暗号化用のサンプル Java

サードパーティの JWE ライブラリを利用することで、効率的かつ迅速に JWE暗号化を実装できます。たとえば、この暗号化用 Java コードは、Nimbus JOSE+JWT ライブラリを利用して作成されました。

public String encryptWithJWE(String plainText){
    X509Certificate publicCertificate = <fetch public cert>
    //get RSA public key
    final X509EncodedKeySpec publicKeySpec = new 
    X509EncodedKeySpec(publicCertificate.getPublicKey().getEncoded());
    final KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    RSAPublicKey rsaPublicKey = (RSAPublicKey) keyFactory.generatePublic(publicKeySpec);
    //get keyID
    String keyID = certificateManager.getKid(publicCertificate);
    // Create JWE Header containing the needed metadata for encryption and decryption
    JWEHeader jweHeader = new JWEHeader.Builder(JWEAlgorithm.RSA_OAEP_256, EncryptionMethod.A256GCM)
        .type(JOSEObjectType.JWT)
        .customParam(IAT, System.currentTimeMillis())
        .keyID(keyID)
        .build();
/*

サンプル JWE ヘッダー

{
"alg":"RSA-OAEP-256",
"typ":"JWT",
"enc":"A256GCM",
"iat":<Time (in UTC) when JWE was issued, expressed in UNIX epoch time (seconds since 1 January, 1970)>,
"kid":<Key ID or subject key Identifier from the public key certificate>
}
*/
    JWEObject jweObject = new JWEObject(jweHeader, new Payload(plainText));
    RSAEncrypter encrypter = new RSAEncrypter(rsaPublicKey);
    jweObject.encrypt(encrypter);
    return jweObject.serialize();
    }

リクエスト内のカード番号の復号化

エクスペディアがリクエスト内の cardNumber を暗号化します。復号化パスは暗号化パスを逆さまにしたものです。

  1. 暗号化された JWE を受信したら、JWE の最初のセクションである JOSE ヘッダをデコードして、アルゴリズム、暗号化、keyId (alg、enc、kid) を特定する必要があります。
  2. その後、iat (issued-at : JWT が発行された時刻) を検証し、現在の時刻と 5 分以上ずれていないことを確認します (トークンは 5 分後に失効します)。
  3. 次に、秘密鍵を取得して JWE 暗号鍵を復号化します。
  4. その後、復号化された RSK、JWE 初期化ベクトル、JWE 認証タグを使用して、JWE 暗号文パラメーターを復号化し、それを検証できます。

コードサンプル

暗号化用のサンプル Java

サードパーティの JWE ライブラリを利用することで、効率的かつ迅速に JWE暗号化を実装できます。たとえば、この暗号化用 Java コードは、Nimbus JOSE+JWT ライブラリを利用して作成されました。

public String decryptJWE(String jweString) {
    PrivateKey privateKey = <fetch private key>;
    RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) privateKey;
    JWEObject jweObject = JWEObject.parse(jweString);
    JWEHeader jweHeader = jweObject.getHeader();validateJweHeader(jweHeader);
    RSADecrypter rsaDecrypter = new RSADecrypter(rsaPrivateKey);
    jweObject.decrypt(rsaDecrypter);
    return jweObject.getPayload().toString();
}

アカウント情報の取得

POST /user/v1/account でロイヤルティ会員やカード名義人のアカウント情報を取得するために、次のフィールドを使用します。

ヘッダー

フィールド説明サンプル値フィールドタイプ必須/必須ではない
partnerIdエクスペディアがが提供する、ビジネスの一意の識別子貴社のブランド文字列 (最大 20 文字)必須
Authorizationエクスペディアが権限サーバーから受信したアクセス トークン (チームで検証)標準 JSON Web トークン (JWT)文字列 (標準 JWT 長)必須ではない
Authorization2エクスペディアから送信された JSON Web トークン (JWT) (署名とクレームは貴社側で検証)標準 JWT文字列 (標準 JWT 長)必須ではない

リクエスト

フィールド説明フィールドタイプ必須/必須ではない
requestId取引リクエストの一意の識別子文字列必須
membershipId一意の顧客識別子文字列必須ではない
loyaltyAccountNumber顧客のロイヤルティアカウント番号 (別名 programAccountNumber) (これは、ロイヤルティオペレーションに membershipId 以外の識別子が必要な場合にのみ入力する必要があります)文字列必須ではない
programId顧客が参加しているロイヤルティプログラムの識別子、またはロイヤルティプログラムに関連付けられているステータス名文字列必須ではない
cardNumber顧客のクレジットカード番号 (暗号化済み)文字列必須ではない
email顧客のメールアドレス文字列必須ではない

レスポンス

フィールド説明フィールドタイプ必須/必須ではない
status取引ステータス (値 : Approved、Declined)文字列必須
requestId取引リクエストの一意の識別子 (リクエストペイロードから)文字列必須
ProgramAccountプログラムアカウントの詳細 (ネストされたフィールドについては、ProgramAccount テーブルを参照)  
languageIdサイトで表示可能な言語文字列必須ではない
channelTypeサイトが最適化されているプラットフォーム (値 : WEB、MOBILE、TABLET) 必須ではない

ProgramAccount

フィールド説明サンプル値必須/必須ではない
programId顧客が参加しているロイヤルティプログラムの識別子、またはロイヤルティプログラムに関連付けられているステータス名Aventura Gold必須
accountNameプログラム名 (programId と異なる場合)Aventura必須ではない
loyaltyAccountNumber顧客のロイヤルティアカウント番号 (別名 programAccountNumber) (これは、ロイヤルティオペレーションに membershipId 以外の識別子が必要な場合にのみ入力する必要があります)1234567必須ではない
lastFourDigitsOfCreditCard顧客が予約に使用したクレジットカードの下 4 桁0000必須ではない
loyaltyConversionRatio支払いにおける獲得ポイント率 (例 : $1 = 1 ポイント) 必須ではない
loyaltyAccountBalance顧客が獲得したロイヤルティポイントの現在の残高2003必須

ユーザー情報

フィールド説明サンプル値必須/必須ではない
userId顧客の一意識別子 (membershipId と同じ) 必須
name顧客の名、ミドルネーム、姓  
firstName顧客の名 (name の下にネスト)Bob必須
middleName顧客のミドルネーム (name の下にネスト)Robert必須ではない
lastName顧客の姓 (name の下にネスト)Jones必須
contactInfo顧客の連絡先情報 (住所、メールアドレス、電話番号など) 必須ではない
address顧客の住所 (番地、市町村、都道府県、郵便番号など、contactInfo に下にネスト)  
streetAddress顧客の番地 (address の下にネスト)123 Main St.必須ではない
city顧客の番地の市町村 (address の下にネスト)Boston必須ではない
state顧客の番地の都道府県 (address の下にネスト)MA必須ではない
country顧客の番地の国 (address の下にネスト)USA必須ではない
postalCode顧客の番地の郵便番号 (address の下にネスト)02112必須ではない
taxProvince顧客が納税する都道府県 (address の下にネスト)MA必須ではない
email顧客のメールアドレス (contactInfo の下にネスト)brjones@somewhere.com必須ではない
contactNumber顧客の電話番号 (contactInfo の下にネスト)555-555-5555必須ではない
userType顧客が単一の (プライマリ) ユーザーであるか、組織に関連付けられているか 必須ではない
dateOfBirth顧客の生年月日 必須ではない
cardDetails取引に使用されたクレジットカードの詳細 (入力された場合、ネストされた項目の一部は暗号化する必要があります) 必須ではない
cardNumber *取引に使用されたクレジットカード番号 (暗号化済み) (cardDetails の下にネスト) 必須
cardType使用されたカードの種類 (暗号化済み) (cardDetails の下にネスト) 必須
expirationDate *MM/YYYY 形式のカードの有効期限 (暗号化済み) (cardDetails の下にネスト) 必須
billingAddress取引に使用されたカードのクレジットカード登録住所 (cardDetails の下にネスト)  
firstAddressLine *クレジットカード登録住所の 1 行目 (暗号化済み) (billingAddress の下にネスト) 必須
secondAddressLineクレジットカード登録住所の 2 行目 (暗号化済み) (billingAddress の下にネスト) 必須ではない
thirdAddressLineクレジットカード登録住所の 3 行目 (暗号化済み) (billingAddress の下にネスト) 必須ではない
cityクレジットカード登録住所の市町村要素 (billingAddress の下にネスト) 必須ではない
provinceクレジットカード登録住所の都道府県要素 (billingAddress の下にネスト) 必須ではない
countryCodeクレジットカード登録住所の国要素 (billingAddress の下にネスト) 必須ではない
postalCode *クレジットカード登録住所の郵便番号要素 (暗号化済み) (billingAddress の下にネスト) 必須

注 : cardDetails フィールドのいずれかが入力されている場合、* 印のついたフィールドは必須です。これらのフィールドのデータはすべて暗号化されます。

API の詳細

クレジットカード情報なし

クレジットカード情報あり

このページは役に立ちましたか ?
このコンテンツに改善が必要な点があれば、
サービス向上にご協力いただきありがとうございます。