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

1. Zanim zaczniesz

Wymagania wstępne

  • Udało Ci się wykonać kroki 1 i 2 procesu implementacji.
  • Możesz hostować serwer Java z zakończeniem TLS, korzystając z Google App Engine lub własnego rozwiązania w domenie skonfigurowanej w Google.
  • W Twoim środowisku jest zainstalowana aplikacja Java.

Czego się nauczysz

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

2. Konfiguracja i wymagania

Pobierz aplikację

Pobierz przykładowy kod Java.

Omówienie struktury aplikacji

Przykładowy kod w Javie jest zintegrowany ze standardowymi interfejsami API płatności Google. Przykładowa struktura projektu z kodem zawiera katalog outbound oraz katalog inbound odzwierciedlający przychodzące żądanie echa od Google do partnera i żądanie wychodzące z implementacji partnerów do Google.

Oba te katalogi zawierają podobną hierarchię uporządkowania 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 POJO.

Zainstaluj zależności

Przejdź do katalogu projektu i uruchom to polecenie, aby zainstalować wymagane zależności za pomocą opakowania Maven. Jeśli korzystasz z App Engine, możesz pominąć ten krok.

./mvnw install

3. Konfigurowanie identyfikatora konta integratora płatności (PIAID)

Identyfikator konta integratora płatności (PIAID) to identyfikator używany do jednoznacznej identyfikacji Twoich integracji. Twój identyfikator PIAID powinien być przesłany przez Google. Musisz spełnić wymagania wstępne przed rozpoczęciem tego samouczka.

  1. Przejdź do src/main/resources/application.properties w katalogu projektu.
  2. W polu właściwości payment.integrator.account.id ustaw identyfikator PIAID otrzymany od Google.
payment.integrator.account.id={YOUR_PAYMENT_INTEGRATOR_ACCOUNT_ID}

4. Ustaw adres URL echa hostowanego przez Google

Adres URL echo hostowany przez Google różni się w zależności od interfejsu API, z którym przeprowadzasz integrację. Zapoznaj się z dokumentacją interfejsu API dotyczącą konkretnego typu integracji i skopiuj adres URL interfejsu API diagnostyki echo. Po skopiowaniu adresu URL przejdź do kolejnych kroków, 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. Dodaj klucze PGP

Jak pokazano poniżej, dodaj klucze PGP, aby włączyć szyfrowanie PGP.

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

Dodawanie kluczy PGP

Aby włączyć szyfrowanie przy użyciu 2 kluczy, dodaj do publicKey2.gpg drugi klucz publiczny, dodaj drugi klucz prywatny do domeny privateKey2.gpg i dodaj drugie hasło do konta passphrase.txt. Po dodaniu drugiego klucza usuń znacznik komentarza z wierszy kodu odpowiedzialnych za wczytywanie drugiej pary kluczy w KeyConfig.addPrivateKeyAndPassphrase(...) i KeyConfig.addPublicKeys(...).

Świetnie, możesz już uruchomić aplikację.

6. Uruchamianie aplikacji

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

  $ ./mvnw spring-boot:run

Jeśli używasz wstępnie skonfigurowanej instancji App Engine, uruchom to polecenie.

$ gcloud app deploy

Domyślnie serwer nasłuchuje na porcie 8080. Aby wyświetlić interfejs Open API Swagger, przejdź pod adres URL poniżej.

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

7. Testowanie połączenia wychodzącego interfejsu API Google Standard Payments

Gdy aplikacja jest już uruchomiona, czas przetestować połączenie z interfejsem API Google echo.

Do uruchomienia poniższego polecenia w celu zainicjowania połączenia z Twojej instancji przykładowej aplikacji do serwerów Google możesz użyć interfejsu użytkownika Swagger lub interfejsu wiersza poleceń. Przykładowy interfejs API echo 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

Wyślij żądanie w interfejsie Swagger

Aby wysłać żądanie za pomocą interfejsu Swagger, przejdź do https://{APPLICATION_HOST}/swagger-ui i ustaw wiadomość klienta w treści żądania. Aby wysłać żądanie do Google, kliknij przycisk „Wykonaj”.

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

Otrzymywanie 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 z serwera, więc teraz sprawdźmy, jak to działa.

Tworzenie żądania

createEchoRequestWithMessage w OutboundEchoService 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!"
}

kodowanie 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, a także kodowanie base64url. Poniższa metoda koduje żądanie i wykonuje szyfrowanie przy użyciu klucza publicznego Google.

String encryptedMessage = pgpEncryptor.encrypt(jsonEchoRequestMessage);

Wyślij żądanie POST

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

postStandardPaymentsEchoApi(encryptedMessage)

Odszyfrowanie i dekodowanie odpowiedzi w standardzie base64url oraz zwrócenie odpowiedzi

Pomyślna odpowiedź Google jest zakodowana i zaszyfrowana w standardzie base64url, więc zanim zostanie zwrócona w postaci tekstu jawnego, musi zostać odkodowana i odszyfrowana. Metoda decrypt base64url dekoduje i odszyfrowuje odpowiedź.

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

Wysyłanie odpowiedzi

Odpowiedź jest zwracana z kodem stanu odpowiedzi HTTP 202.

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

8. Testowanie połączeń interfejsu Inbound API

Aby przetestować połączenie przychodzącego echa przez interfejs API, Google wyśle żądanie do tego interfejsu API. 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ługiwane przez serwer, więc teraz sprawdźmy, jak to działa.

Dekodowanie i odszyfrowywanie żądania za pomocą Base64url

Po otrzymaniu żądania PgpEncryptor.java wywołuje metodę decrypt, która dekoduje i odszyfrowuje żądanie w standardzie base64url.

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 pomyślnym odczytaniu przychodzącego żądania echo 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 i szyfrowanie odpowiedzi za pomocą Base64url,

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

pgpEncryptor.encrypt(echoResponseString)

Wysyłanie odpowiedzi

Odpowiedź jest zwracana z kodem stanu odpowiedzi HTTP 202.

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

9. Gratulacje!

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