このガイドでは、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 日後、メッセージを破棄し、その後の再試行は行いません。
重複配信
重複配信が発生する場合があります。その可能性を排除するため、ナンスの使用をおすすめします。