This is an auto-generated translation

APIの設定

このセクションでは、APIとの統合を成功させるための重要なステップについて説明します。Webhooks経由でプッシュイベントを受信したい場合も、エンドポイントからデータをプルしたい場合も、弊社にお任せください。

  • プッシュAPI: TAAPやWhite Label Templateパートナーに最適なプッシュイベントは、ほぼリアルタイムのアップデートをシステムに直接配信します。サブスクリプションの設定、認証の管理、再試行の処理方法について説明します。
  • プルAPI: ホワイトレーベルテンプレートパートナーのために設計され、必要なときにデータを要求することができます。安全なアクセスのためのトークンベースの認証の設定について説明します。

以下のガイダンスに従って、スムーズな統合と安全なデータ転送を実現してください。

プッシュ型配信

TAAPまたはWhite Label Templateのパートナーで、旅程データにご興味のある方は、こちらをご覧ください。プッシュイベントはWebhook経由で配信され、お客様が指定したURLにHTTP POST メッセージとして送信されます。

イベントの受信を開始するには、イベント タイプを購読し、エクスペディアを送信者として認証する必要があります。

購読とイベント

Subscriptions APIを使用すると、プッシュ型配信サービスで受信したいイベントを作成および管理できます。現在、旅程更新イベントの購読を作成および管理することができます。

APIクライアントIDとシークレットが必要です。

サブスクリプション API へのアクセス

すべてのAPIリクエストに、あなたのビジネスに固有のアクセストークンを含めます。HTTPベーシック認証の仕組みを使って、API認証情報を使ってこのトークンをリクエストします。

  1. トークンのエンドポイントに、APIクライアントIDとsecretをBase64エンコードした文字列を含むAuthorizationヘッダを追加しますhttps://analytics.ean.com/*/v1/oauth/token。URLの* を、パートナーシップに応じて、template またはtaap に置き換えてください。
  2. トークン・エンドポイントは、以降のAPIリクエストで使用するアクセストークンを返します。詳細については、Subscriptions API 詳細 を参照してください。
  3. 今後のAPIエンドポイントリクエストにアクセストークンの値を含めます。

初期認証ヘッダの例

Authorization: Basic base64.b64encode({client-id}:{client-secret})

トークン・リクエストの例

securitySchemes:
  oauth:
    type: oauth2
    flows:
      clientCredentials:
        tokenUrl: https://analytics.ean.com/taap/v1/oauth/token

認証済み認可ヘッダの例

Authorization: Bearer {access-token}

サブスクリプションの管理

Subscription API で認証されると、既存のサブスクリプションのリストを作成したり、新しいサブスクリプションを作成したり、適用されなくなったサブスクリプションを削除したりするなど、サブスクリプションを管理できます。

サブスクリプションの作成

サブスクリプションを作成する際に指定する必要があります:

  • イベントを受信するエンドポイントURL。
  • サブスクライブするイベントのタイプ。パートナーシップのインジケータも含みます:taap.itinerary.change またはtemplate.itinerary.change

注意:複数のサブスクリプションを作成できますが、サブスクリプションが重複すると、イベントの配信が重複します。これを避けるには、新しいサブスクリプションを作成する前に、既存のサブスクリプションをリストアップしてください。

サブスクリプションが作成されると、イベント配信に含まれるHMAC(ハッシュベースのメッセージ認証コード)を検証するための一意のシークレットキーを受け取ります。

Information

重要

秘密鍵を受け取ったら、セキュリティ上の理由から、必ず安全なファイルに保存してください。

サブスクリプションを一覧表示または削除するには、それぞれHTTP GET /subscriptions またはHTTP DELETE /subscriptions/{subscription_id} エンドポイントを使用します。有効なトークンを使用する必要があります。

詳細については、Subscriptions API 詳細 を参照してください。

エクスペディアを送信者として認証

私たちは、あなたが提供するエンドポイントにプッシュイベントを送信し、各イベントは認可ヘッダにHMAC署名を含みます。安全で信頼できるデータ伝送を保証するために、私たちが提供する共有秘密を使ってこの署名を検証する必要があります。

認証ヘッダーの例

"authorization": "MAC ts='1731524372777',nonce='f88e57ed-aaf5-4edd-8e58-9105817fb4cb',bodyhash='8YLHy71r5dx3PQjdcOkRuVYXaakjhbJSROEnlreQEIA=',mac='bDxvx41INtDxtkbZwTmAMADZGiFl6/xyXC1lE5ixPuY='"

ステップ 1: バリデーションの設定

これらのHMAC構成設定をプッシュAPIエンドポイントに追加します:

hmac.validator.sharedSecretKey={mySecretKey}
hmac.validator.endpoint=https:{//example.com}
hmac.validator.methodType=POST

ステップ 2: バリデーションモジュールの追加

このパブリック・クラス・コードをエンドポイントに追加することで、HMAC署名を検証します:

@Component
public class HmacValidator {
    private static final String HMAC_SHA256 = "HmacSHA256";
    private static final String DEFAULT_PORT = "443";
    private final String sharedSecretKey;
    private final String endpoint;
    private final String methodType;

    // Constructor for initialization
    public HmacValidator(@Value("${hmac.validator.sharedSecretKey}") String sharedSecretKey,
                         @Value("${hmac.validator.endpoint}") String endpoint,
                         @Value("${hmac.validator.methodType:POST}") String methodType) {
        this.sharedSecretKey = sharedSecretKey;
        this.endpoint = endpoint;
        this.methodType = methodType; // Default to POST if not provided
    }

    public boolean validate(String signature) {
        //Validation logic here
    }
}

ステップ3:検証ロジックの実装

署名検証のロジックは以下のステップに従います:

  1. 認可ヘッダーを解析してコンポーネントを抽出します。
  2. 抽出されたコンポーネントとsharedSecretKey を使用してHMAC署名を生成します。
  3. 生成された署名を認可ヘッダーの署名と比較します。

コードサンプル

// Validate the signature
    public boolean validate(String signature) {
        Map<String, String> components = parseSignature(signature);
        if (components == null || components.isEmpty()) {
            return false; // Invalid format or empty signature
        }

        String generatedHmacSignature = generateHmacSignature(components);
        System.out.println("Generated HMAC Signature: " + generatedHmacSignature);
        System.out.println("Received HMAC Signature: " + components.get("mac"));
        return generatedHmacSignature.equals(components.get("mac"));
    }

    // Parse the signature into its components
    private Map<String, String> parseSignature(String signature) {
        // Define the pattern for each key-value pair in the format "key='value'"
        Pattern pattern = Pattern.compile("([a-zA-Z]+)='([^']*)'");
        Matcher matcher = pattern.matcher(signature);

        // Store results in a map
        Map<String, String> components = new HashMap<>();

        // Extract each key-value pair
        while (matcher.find()) {
            components.put(matcher.group(1), matcher.group(2));
        }
        return components;
    }

    // Generate the HMAC signature using components
    public String generateHmacSignature(Map<String, String> components) {
        try {
            URL url = new URL(endpoint);
            String signature = String.format("%s/n%s/n%s/n%s/n%s/n%s/n%s/n",
                    components.get("ts"),
                    components.get("nonce"),
                    methodType.toUpperCase(),
                    url.getPath(),
                    url.getHost(),
                    url.getPort() == -1 ? DEFAULT_PORT : String.valueOf(url.getPort()),
                    components.get("bodyhash"));

            return calculateHMAC(signature);
        } catch (Exception e) {
            throw new RuntimeException("Failed to generate HMAC signature", e);
        }
    }

    // Calculate the HMAC from the signature string
    private String calculateHMAC(String signature) {
        try {
            Mac mac = Mac.getInstance(HMAC_SHA256);
            SecretKeySpec secretKeySpec = new SecretKeySpec(sharedSecretKey.getBytes(StandardCharsets.UTF_8), HMAC_SHA256);
            mac.init(secretKeySpec);
            byte[] hmacBytes = mac.doFinal(signature.getBytes(StandardCharsets.UTF_8));
            return bytesToBase64(hmacBytes);
        } catch (Exception e) {
            throw new RuntimeException("Failed to calculate HMAC", e);
        }
    }

    // Convert byte array to Base64 string
    private String bytesToBase64(byte[] bytes) {
        return Base64.getEncoder().encodeToString(bytes);
    }
}

イベント失敗のリトライ

イベントが失敗した場合、システムは7日間にわたり指数バックオフパターンを使用して再試行します。失敗した場合は再試行します:

  • 200以外のHTTPステータスコード
  • タイムアウト
  • エンドポイントからの例外

購読APIの詳細

Subscriptions API の詳細については、OpenAPI 仕様をダウンロードしてください。




プル型デリバリー

ホワイトレーベルのテンプレートサイトをお持ちの場合、使用しているAPIに応じて、旅程やロイヤリティ獲得データのプル型配信を実装することができます。

Loyalty EarnおよびItinerariesエンドポイントにアクセスするには、APIクライアントIDとシークレットが必要です。すべてのAPIリクエストに、あなたのビジネスに固有のアクセストークンを含めます。HTTPベーシック認証の仕組みを使って、API認証情報を使ってこのトークンをリクエストします。

  1. トークン・エンドポイントhttps://analytics.ean.com/template/v1/oauth/token に、API クライアント ID とシークレットを Base64 エンコードした文字列を含む Authorization ヘッダーを追加します。
  2. トークン・エンドポイントは、以降のAPIリクエストで使用するアクセストークンを返します。詳細については、OpenAPI仕様を参照してください。
  3. 今後のAPIエンドポイントリクエストにアクセストークンの値を含めます。

初期認証ヘッダの例

Authorization: Basic base64.b64encode({client-id}:{client-secret})

トークン・リクエストの例

securitySchemes:
    oauth:
      type: oauth2
      flows:
        clientCredentials:
          tokenUrl: https://analytics.ean.com/template/v1/oauth/token

認証済み認可ヘッダの例

Authorization: Bearer {token}

トークンを受け取ったら、Loyalty EarnまたはItinerariesエンドポイントに対してリクエストを開始できます。

Information

重要

すべてのパートナーに安定した保守可能なサービスを提供するため、すべてのAPIコールにレート制限 を適用しています。当社のシステムは異常な API トラフィックを監視し、システム自体を保護するためのアクションを自動的に実行します。API 呼び出しに変更を加えたり、API アクセスのパフォーマンス テストを実施したりする前に、エクスペディアの営業担当者と計画を確認してください。

サービスをリクエストする際には、APIのバージョンを指定する必要があります。ダウンロード可能なOpenAPI仕様ファイルの一番上にあるservers.url 。これは常に、あなたがテストしているAPIサービスのバージョン番号と一致します。

URLはこの構造に従ってください:

https://analytics.ean.com/[product]/[API version]/[path]

パスを置き換えることでエンドポイントを切り替えることができますが、OpenAPI仕様で規定されているプロトコル、ドメイン指定、製品、APIバージョン番号は必ず保持してください。

エンドポイントの例

https://analytics.ean.com/template/v1/loyalty/earn/last_update
https://analytics.ean.com/template/v1/itineraries

データスコープとAPIコンフィギュレーションを調べるには、APIデリバリーのスキーマを参照してください:
旅程API配信
ロイヤルティ獲得API配信

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