Jak nawiązać połączenie z interfejsami API Google w języku Java

1. Zanim zaczniesz

Wymagania wstępne

  • Masz ukończone kroki 1 i 2 procesu implementacji.
  • Możesz hostować serwer Java z zakończeniem protokołu TLS, używając Google App Engine lub własnego rozwiązania w domenie skonfigurowanej w Google.
  • W środowisku jest zainstalowana aplikacja Java.

Czego się nauczysz

  • Jak weryfikować połączenie, wysyłając prawidłowe żądanie do interfejsu API obsługującego test echa w Google.
  • Jak odbierać, odszyfrowywać i analizować żądanie od Google do interfejsu API echo hostowanego przez partnera.

2. Konfiguracja i wymagania

Pobierz aplikację

Pobierz przykładowy kod w Javie.

Omówienie struktury aplikacji

Przykładowy kod w Javie integruje się z interfejsami API Google Standard Payments. Przykładowa struktura projektu kodu zawiera katalog outbound oraz katalog inbound odzwierciedlający przychodzące żądanie echo wysyłane przez Google do partnera i żądanie wychodzące z implementacji partnera do Google.

Oba te katalogi zawierają podobną hierarchię pakowania według warstwy. Trzy główne warstwy to controller, service i domain.

  • Pakiet controller zawiera interfejsy API.
  • Pakiet service odpowiada za logikę biznesową, kodowanie base64url i szyfrowanie.
  • Pakiet domain zawiera obiekty POJO.

Zainstaluj zależności

Aby zainstalować wymagane zależności za pomocą oprogramowania Maven Wrapper, otwórz katalog projektu i uruchom podane niżej polecenie. Jeśli korzystasz z App Engine, możesz pominąć ten krok.

./mvnw install

3. Konfigurowanie identyfikatora konta integratora płatności

Identyfikator konta integratora płatności (PIAID) to identyfikator używany do jednoznacznego oznaczania integracji. Przed rozpoczęciem tego samouczka powinien dotrzeć do Ciebie ten identyfikator od Google, jeśli udało Ci się spełnić wymagania wstępne.

  1. W katalogu projektu przejdź do folderu src/main/resources/application.properties.
  2. W usługi payment.integrator.account.id wpisz identyfikator konta integratora płatności, który został Ci wysłany przez Google.
payment.integrator.account.id={YOUR_PAYMENT_INTEGRATOR_ACCOUNT_ID}

4. Ustaw adres URL echa hostowanego przez Google

Adres URL interfejsu API hostowanego przez Google echo różni się w zależności od tego, z którym interfejsem API chcesz się integrować. Otwórz dokumentację interfejsu API dla konkretnego typu integracji i skopiuj adres URL interfejsu API echo diagnostycznego. Po skopiowaniu adresu URL wykonaj dalsze czynności, aby zaktualizować go w projekcie Java.

  1. Przejdź do src/main/resources/application.properties w katalogu projektu.
  2. Ustaw właściwość API_SERVICE_NAME zgodnie z dokumentacją dla deweloperów.
google.hosted.echo.url=vgw.googleapis.com/gsp/{API_SERVICE_NAME}/echo/

5. Dodawanie kluczy PGP

Aby włączyć szyfrowanie PGP, dodaj klucze PGP, jak pokazano poniżej.

  • Otwórz plik src/resources/publicKey1.gpg i dodaj do niego klucz publiczny w opakowaniu ASCII.
  • Przejdź do src/resources/privateKey1.gpg i dodaj do pliku klucz prywatny w osłonie ASCII.
  • Przejdź do src/resources/passphrase1.txt i dodaj do pliku tajne hasło.

Dodawanie kluczy PGP

Aby włączyć szyfrowanie przy użyciu 2 kluczy, dodaj drugi klucz publiczny do publicKey2.gpg dodaj drugi klucz prywatny do privateKey2.gpg, a drugie hasło do passphrase.txt. Po dodaniu drugich kluczy odkomentuj odkomentowane wiersze kodu, które są odpowiedzialne za wczytywanie drugiej pary kluczy w funkcjach KeyConfig.addPrivateKeyAndPassphrase(...)KeyConfig.addPublicKeys(...).

Świetnie, wszystko gotowe do uruchomienia aplikacji.

6. Uruchamianie aplikacji

Aby uruchomić aplikację, wykonaj poniższe polecenie.

  $ ./mvnw spring-boot:run

Jeśli używasz domyślnie skonfigurowanej instancji App Engine, zamiast tego uruchom to polecenie:

$ gcloud app deploy

Domyślnie serwer nasłuchuje na porcie 8080. Aby wyświetlić interfejs Swagger interfejsu Open API, otwórz adres URL poniżej.

https://{APPLICATION_HOST}/swagger-ui.html

7. Testowanie połączenia wychodzącego interfejsu API płatności Google Standard

Po uruchomieniu aplikacji czas przetestować połączenie z interfejsem API Google echo.

Aby nawiązać połączenie między Twoją instancją przykładowej aplikacji a serwerami Google, możesz użyć Swagger UI lub interfejsu wiersza poleceń. Interfejs API obsługujący test echa przykładowej aplikacji akceptuje żądanie POST w formie tekstu jawnego. Po otrzymaniu żądania kolejne żądanie jest wysyłane do interfejsu API hostowanego przez Google.

Wysyłanie żądania za pomocą wiersza poleceń

Przed wykonaniem polecenia zastąp HOSTNAME nazwą hosta serwera.

  $ curl -X POST -H 'Content-Type: text/plain' -d 'Hello from Partner Bank!' https://{HOSTNAME}/echo

Wysyłanie żądania w interfejsie Swagger UI

Aby wysłać żądanie za pomocą interfejsu Swagger UI, otwórz stronę https://{APPLICATION_HOST}/swagger-ui i ustaw wiadomość klienta w treści żądania. Kliknij przycisk „Wykonaj”, , gdy wszystko będzie gotowe do wysłania żądania do Google.

Przesyłanie żądania GSP Echo za pomocą Swagger

Otrzymanie odpowiedzi

Pomyślne żądanie do interfejsu API spowoduje wyświetlenie takiej odpowiedzi od Google.

{
   "responseHeader":{
      "responseTimestamp":"1606710026723"
   },
   "clientMessage":"Hello from  Bank Little Bear!",
   "serverMessage":"Server message."
}

Krok po kroku

Żądanie zostało już wysłane przez serwer, więc teraz sprawdźmy, jak to działa.

Tworzenie żądania

createEchoRequestWithMessageOutboundEchoService tworzy żądanie echo wysłane do interfejsu API Google.

String jsonEchoRequestMessage = objectMapper.writeValueAsString(createEchoRequestWithMessage(message));

Wygenerowane żądanie zawiera clientMessage oraz kilka domyślnych pól wartości.

{
   "requestHeader":{
      "protocolVersion":{
         "major":1,
         "minor":0,
         "revision":0
      },
      "requestId":"ddfe0fd0-ffdc-4fcf-991a-f0611ec83970",
      "requestTimestamp":"1606715389040"
   },
   "clientMessage":"Hello from Bank Little Bear!"
}

Szyfrowanie i szyfrowanie żądania w Base64url

Wszystkie żądania są zaszyfrowane i zakodowane w base64url. W tym przykładzie PgpEncryptor.java zawiera metody pomocnicze, które wykonują szyfrowanie i odszyfrowywanie oraz kodowanie base64url. Poniższa metoda koduje żądanie i szyfruje za pomocą klucza publicznego Google.

String encryptedMessage = pgpEncryptor.encrypt(jsonEchoRequestMessage);

Wysyłanie żądania POST

Zaszyfrowana wiadomość jest wysyłana za pomocą żądania POST.

postStandardPaymentsEchoApi(encryptedMessage)

Odszyfrowanie i dekodowanie odpowiedzi za pomocą base64url oraz zwrócenie odpowiedzi

Prawidłowa odpowiedź Google jest zakodowana i zaszyfrowana w base64url, więc przed zwróceniem w postaci zwykłego tekstu musi zostać odkodowana i odszyfrowana. Metoda decrypt base64url dekoduje i odszyfrowuje odpowiedź.

String decryptedData =
     pgpEncryptor.decrypt(postStandardPaymentsEchoApi(encryptedMessage).getBody());

Zwracanie odpowiedzi

Odpowiedź jest zwracana z kodem stanu odpowiedzi HTTP 202.

return new ResponseEntity<>(decryptedData, HttpStatus.ACCEPTED);

8. Testowanie połączenia z interfejsem Inbound API

Aby przetestować łączność z interfejsem API obsługującym test echa przychodzącego, Google wyśle żądanie do hostowanego przez partnera interfejsu API obsługującego test echa. Gdy wszystko będzie gotowe, skontaktuj się z osobą kontaktową w Google, aby aktywować to żądanie z Google.

Test echa jest zakończony, gdy możesz odczytać przychodzące żądanie echa od Google i odpowiedzieć za pomocą prawidłowej odpowiedzi echa.

Krok po kroku

Żądanie zostało już odebrane i obsłużone przez serwer, więc teraz sprawdźmy, jak to działa.

Dekodowanie i odszyfrowanie żądania za pomocą base64url

Po otrzymaniu żądania PgpEncryptor.java wywoła decrypt, który zdekoduje je za pomocą base64url i odszyfruje.

String decryptedRequest = pgpEncryptor.decrypt(echoRequest);

Odbieranie żądania

Z Google został wysłany ładunek wiadomości, który po zdekodowaniu i odszyfrowaniu jest podobny do tego:

{
  "requestHeader": {
    "protocolVersion": {
      "major": 1
    },
    "requestId": "G1MQ0YERJ0Q7LPM",
    "requestTimestamp": {
      "epochMillis":1481899949606
    },
    "paymentIntegratorAccountId": "abcdef123456"
  },
  "clientMessage": "echo Me"
}

Tworzenie odpowiedzi

Po odczytaniu przychodzącego żądania echa możesz utworzyć odpowiedź.

private EchoResponse convertEchoRequestStringToEchoResponse(String decryptedRequest);

Odpowiedź zawiera wiadomość od Google, a także sygnaturę czasową i wiadomość z serwera.

{
  "responseHeader": {
    "responseTimestamp": {
      "epochMillis":1481899950236
    }
  },
  "clientMessage": "echo Me",
  "serverMessage": "Debug ID 12345"
}

Kodowanie odpowiedzi w formacie base64url i jej szyfrowanie

Wszystkie żądania są szyfrowane i zakodowane w standardzie base64url, więc funkcja PgpEncryptor.java wywołuje metodę encrypt, aby zakodować i zaszyfrować żądanie.

pgpEncryptor.encrypt(echoResponseString)

Zwracanie odpowiedzi

Odpowiedź jest zwracana z kodem stanu odpowiedzi HTTP 202.

return new ResponseEntity<>(pgpEncryptor.encrypt(echoResponseString), HttpStatus.ACCEPTED);

9. Gratulacje!

Dzięki temu ćwiczeniu w Codelabs udało Ci się nawiązać połączenie z interfejsem Payments API.