All requests to Google Pay APIs must be authorized by an authenticated user. Your application must include the following code to authorize the Omnichannel API.

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.FileContent;
import com.google.api.client.http.GenericUrl;
import com.google.api.client.http.HttpContent;
import com.google.api.client.http.HttpRequest;
import com.google.api.client.http.HttpRequestFactory;
import com.google.api.client.http.HttpResponse;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.common.io.CharStreams;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.security.GeneralSecurityException;
import java.util.Collections;

public class OauthClient {
  private static final String JWT_PATH = "service-account-key.json";
  private static final String API_SCOPE = "https://www.googleapis.com/auth/nbupaymentsmerchants";
  private static final String POST_JSON = "initiate.json";
  private static final String API_URL =  
                    "https://nbupayments.googleapis.com/v1/merchantPayments:initiate";
  public static final Charset UTF8 = Charset.forName("UTF-8");
  public static final int HTTP_TIMEOUT_MS = 10000;

  public static void main(String args[]) {
    HttpTransport httpTransport;
    HttpRequestFactory httpRequestFactory;
    try {
      httpTransport = GoogleNetHttpTransport.newTrustedTransport();
      GoogleCredential credential = getGoogleCredential(httpTransport);
      httpRequestFactory = httpTransport.createRequestFactory(credential);

      doPostApplication(httpRequestFactory);
    } catch (IOException | GeneralSecurityException e) {
      System.out.println("Error in posting data.");
    }
  }

  /** Creates a {@link HttpContent} from the json file. */
  private static HttpContent getContent() {
    return new FileContent("application/json", new File(POST_JSON));
  }

  /** Creates a new credential using the service account json file and Oauth scope. */
  private static GoogleCredential getGoogleCredential(HttpTransport httpTransport)
      throws FileNotFoundException, IOException {
    return GoogleCredential.fromStream(
            new FileInputStream(new File(JWT_PATH)),
            httpTransport,
            JacksonFactory.getDefaultInstance())
        .createScoped(Collections.singleton(API_SCOPE));
  }

  /** Gets the specification of an application from the Google servers. */
  private static void doPostApplication(HttpRequestFactory requestFactory) throws IOException {
    GenericUrl url = new GenericUrl(API_URL);
    HttpRequest httpRequest = requestFactory.buildPostRequest(url, getContent());
    doHttpRequest(httpRequest);
  }

  /** Executes HTTP request against the API and prints response. */
  private static void doHttpRequest(HttpRequest httpRequest) throws IOException {
    // Set read timeout.
    httpRequest.setReadTimeout(HTTP_TIMEOUT_MS).setThrowExceptionOnExecuteError(false);
    HttpResponse httpResponse = httpRequest.execute();
    System.out.println("Status code: " + httpResponse.getStatusCode());
    String responseContent = inputStreamToString(httpResponse.getContent());

    // Parse and print formatted response.
    JsonObject response = new JsonParser().parse(responseContent).getAsJsonObject();
    System.out.println("response: " + response);
  }

  /** Reads input stream contents using the UTF-8 charset into a string. */
  private static String inputStreamToString(InputStream in) throws IOException {
    return CharStreams.toString(new InputStreamReader(in, UTF8));
  }
}

Maven dependencies

To make your code work, you must add the following Maven dependencies while building the app.

<dependencies>
    <dependency>
      <groupId>com.google.api-client</groupId>
      <artifactId>google-api-client</artifactId>
      <version>1.22.0</version>
    </dependency>
    <dependency>
      <groupId>com.google.http-client</groupId>
      <artifactId>google-http-client</artifactId>
      <version>1.22.0</version>
    </dependency>
    <dependency>
      <groupId>com.google.http-client</groupId>
      <artifactId>google-http-client-jackson</artifactId>
      <version>1.22.0</version>
    </dependency>
    <dependency>
      <groupId>com.google.code.gson</groupId>
      <artifactId>gson</artifactId>
      <version>2.8.0</version>
    </dependency>
  </dependencies>

Oauth 2.0 References

  • Google API client libraries - Java

  • https://developers.google.com/identity/protocols/OAuth2#serviceaccount

  • https://developers.google.com/identity/protocols/OAuth2ServiceAccount

The following client libraries integrate with popular frameworks, which makes implementing OAuth 2.0 simpler.

  • Google-api-client
  • Google-http-java-client