Zapisywanie i usuwanie z użyciem wywołań zwrotnych

Ten przewodnik wyjaśnia, jak używać wywołań zwrotnych w Google Pay API for Passes. W przypadku każdego zapisanego i usuniętego obiektu wartościowego Google wysyła do partnerów wywołanie zwrotne do domyślnie skonfigurowanego punktu końcowego HTTPS na poziomie klasy. Zawiera ono informacje o wykonaniu przez użytkownika operacji zapisu/usunięcia i podpis.

Wymagania wstępne

Zanim zaczniesz,sprawdź, czy spełnione są wymagania wstępne:

  • Utworzony został punkt końcowy HTTPS, który obsługuje żądania POST. Musi on być publicznie dostępny.
  • Automatycznie zaktualizowano punkt końcowy wywołania zwrotnego każdej klasy. Właściwość callbackOptions każdej klasy znajdziesz w opisie interfejsu API REST.
  • (Zalecane) Zweryfikowano podpisy za pomocą biblioteki Tink.

Wdrażanie wywołań zwrotnych

Za każdym razem, gdy użytkownik zapisuje lub usuwa obiekt, Google wysyła do sprzedawców wywołania zwrotne z informacjami o zapisie lub usunięciu adresu URL klasy. Sprzedawca musi najpierw zweryfikować autentyczność wiadomości za pomocą kluczy publicznych. Jeżeli wywołania zwrotne mogą zweryfikować wiadomość, można ich używać do operacji przesyłania danych do klienta.

Weryfikacja podpisu

Podczas wdrażania punktu końcowego HTTPS zalecamy, aby zweryfikować podpis wiadomości za pomocą biblioteki Tink. Biblioteka Tink udostępnia PaymentMethodTokenRecipient – narzędzie, które automatycznie weryfikuje podpis, a gdy weryfikacja się powiedzie, zwraca wiadomość.

Poniższy przykład pokazuje, jak wdrożyć PaymentMethodTokenRecipient za pomocą biblioteki Tink:

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) {
       // …
    }
}

Oczekiwany format wiadomości

Wiadomość jest w formacie JSON zserializowanym do ciągu tekstowego i zawiera poniższe właściwości:

Identyfikator Opis
classId

W pełni kwalifikowany identyfikator klasy. Używa tego formatu:


<issuer_id.class_id>
objectId

W pełni kwalifikowany identyfikator obiektu. Używa tego formatu:


<issuer_id.object_id>
expTimeMillis Termin ważności w milisekundach od początku epoki. Po upływie tego terminu wiadomość powinna być traktowana jak nieprawidłowa.
eventType Może mieć wartość „del” (usunięcie) lub „save” (zapis).
nonce Identyfikator jednorazowy monitorujący wiadomości dostarczone wiele razy.

Obsługa żądania z serwera Google

Poniższa lista zawiera najważniejsze pola nagłówka żądania, które jest wysyłane do punktu końcowego wywołania zwrotnego:

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

Skonfiguruj serwer tak, aby nie odrzucał tych żądań. Możesz na przykład ustawić w pliku robots.txt poniższe wartości:

User-agent: Google-Valuables
Disallow:

Ponowne próby

Wywołania zwrotne są wykonywane zgodnie z zasadą najlepszych starań. Na wypadek przejściowych problemów Google próbuje dostarczyć wiadomość przez trzy dni. Po tym czasie wiadomość zostaje odrzucona i nie jest już ponownie wysyłana.

Wiadomości dostarczane wiele razy

Czasami wiadomości mogą być dostarczane więcej niż raz. Aby usunąć duplikaty, zalecamy użycie identyfikatora jednorazowego.