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.