保存と削除にコールバックを使用する

このガイドでは、Google Pay API for Passes でコールバックを使用する方法について説明します。保存と削除のたびに、Google では、事前に構成したクラスレベルの HTTPS エンドポイントのパートナーにコールバックし、ユーザーによる保存 / 削除に関するデータと署名を渡します。

前提条件

操作を始める前に、次の前提条件を確認してください。

  • POST リクエストを処理する HTTPS エンドポイントを起動します。このエンドポイントは一般公開する必要があります。
  • クラスごとにコールバック エンドポイントをプログラムで更新します。REST API でクラス別の callbackOptions プロパティをご確認ください。
  • (推奨)Tink ライブラリを使用して署名の検証を行います。

コールバックの実装

ユーザーがオブジェクトに対して保存や削除を行うたびに、Google では販売店にコールバックを行い、クラスごとの URL に対する保存または削除に関する詳細情報を提供します。販売店は、公開鍵を使用してメッセージの信頼性を確認する必要があります。メッセージの信頼性が確認されると、ダウンストリーム操作でコールバックを使用できるようになります。

署名の検証

HTTPS エンドポイントを実装するときに、Tink ライブラリを使用してメッセージの署名を検証することをおすすめします。Tink ライブラリPaymentMethodTokenRecipient ユーティリティにより、署名が自動的に検証され、検証に成功すると実際のメッセージが返されます。

次の例では、Tink ライブラリを使用して PaymentMethodTokenRecipient を実装しています。

private static final String PUBLIC_KEY_URL = "https://pay.google.com/gp/m/issuer/keys". // Public key URL provided by Google.
private static final String SENDER_ID = "GooglePayPasses". // Constant.

private static final String RECIPIENT_ID = "ISSUER_ID". // Replace ISSUER_ID with your issuer id.

private static final String PROTOCOL = "ECv2SigningOnly".
Private static final GooglePaymentsPublicKeysManager keysManager = new
                       GooglePaymentsPublicKeysManager.Builder()
                      .setKeysUrl(PUBLIC_KEY_URL)
                      .build();

public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
    try {
      // Extract signed message with signature from POST request body.
      String signedMessage = CharStreams.toString(request.getReader());
      recipient =
          new PaymentMethodTokenRecipient.Builder()
              .protocolVersion(PROTOCOL)
              .fetchSenderVerifyingKeysWith(keysManager)
              .senderId(SENDER_ID)
              .recipientId(RECIPIENT_ID)
              .build();

      String serializedJsonMessage = recipient.unseal(signedMessage);
      // Use serializedJsonMessage to extract the details.
    } catch (Exception e) {
       // …
    }
}

想定されるメッセージ形式

メッセージ形式はシリアル化された JSON 文字列で、次のプロパティが設定されています。

ID 説明
classId

完全修飾のクラス ID。次の形式を使用します。


<issuer_id.class_id>
objectId

完全修飾のオブジェクト ID。次の形式を使用します。


<issuer_id.object_id>
expTimeMillis 有効期限。EPOCH からの時間をミリ秒単位で指定します。有効期限が過ぎると、メッセージは無効とみなされます。
eventType DELETE の場合は "del"、SAVE の場合 "save" になります。
nonce 重複配信を追跡するナンス。

Google サーバーからのリクエストの処理

以下に、コールバック エンドポイントに送信されるリクエストのヘッダーに含まれる主な項目を示します。

  • User-Agent: Google-Valuables
  • Content-Type: application/json

リクエストを拒否しないようにサーバーを適切に構成します。たとえば、robots.txt で次のように設定します。

User-agent: Google-Valuables
Disallow:

再試行

コールバックはベスト エフォート方式です。一時的な障害の場合、Google は 3 日間メッセージの配信を試みます。3 日後、メッセージを破棄し、その後の再試行は行いません。

重複配信

重複配信が発生する場合があります。その可能性を排除するため、ナンスの使用をおすすめします。