本指南說明如何透過 Google Pay API for Passes 使用回呼。每當使用者儲存及刪除項目時,Google 都會在預先設定的類別層級 HTTPS 端點上,透過簽名和使用者儲存/刪除項目的相關資料回呼合作夥伴。
先決條件
在開始之前,請先詳閱以下先決條件:
- 設定負責處理 POST 要求的 HTTPS 端點。請注意,這個端點必須設為公開端點。
- 透過程式按類別更新回呼端點。請參閱 REST API 說明文件中
callbackOptions
屬性 (按類別) 的相關說明。 - (建議) 使用 Tink 程式庫驗證簽名。
執行回呼
每當使用者儲存或刪除物件時,Google 都會對商家進行回呼,並透過各類別網址提供儲存或刪除作業的詳細資料。商家必須先運用公開金鑰驗證訊息的真實性,一旦回呼作業能夠驗證訊息,即可將回呼用於下游作業。
驗證簽名
導入 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 經過序列化而產生的字串,當中包含以下屬性:
識別碼 | 說明 |
---|---|
classId |
完全符合規定的類別 ID,所用格式如下: <issuer_id.class_id> |
objectId |
完全符合規定的物件 ID,所用格式如下: <issuer_id.object_id> |
expTimeMillis |
自紀元起算的到期時間 (以毫秒為單位)。到期時間屆滿之後,系統就會將訊息視為無效。 |
eventType |
可以是代表刪除的「del」或代表儲存的「save」。 |
nonce |
隨機值,可用於追蹤任何重複的訊息傳送作業。 |
處理 Google 伺服器發出的要求
傳送至您回呼端點的要求包含多個欄位,以下列出要求標頭的主要欄位:
- User-Agent:Google-Valuables
- Content-Type: application/json
請為您的伺服器選用合適的設定,以免伺服器拒絕要求。舉例來說,您可能需要在 robots.txt 中設定下列值:
User-agent: Google-Valuables Disallow:
重試
回呼會儘可能履行您的要求。如果發生暫時性失敗,Google 會持續傳送訊息三天。三天之後,系統會捨棄該則訊息,日後也不會再重試這項作業。
重複傳送訊息
在某些情況下,系統可能會重複傳送訊息。因此,建議您使用 nonce 來排除重複傳送的情形。