如何在 Java 中与 Google API 建立连接

1. 准备工作

前提条件

  • 您已完成实现流程的第 1 步和第 2 步。
  • 您可以使用 Google App Engine 或在通过 Google 配置的网域中使用您自己的解决方案来托管所提供的具有 TLS 终止功能的 Java 服务器。
  • 您的环境中已安装 Java

学习内容

  • 如何通过向 Google echo API 发出有效请求来验证连接。
  • 如何接收、解密和解析从 Google 发送到 Partner Hosted echo API 的请求。

2. 设置和要求

下载应用

下载 Java 示例代码

应用结构概览

Java 示例代码集成了 Google 的 Standard Payments API。示例代码项目结构包含一个 outbound 目录和一个 inbound 目录,以反映 Google 向合作伙伴发送的入站 echo 请求以及合作伙伴实现向 Google 发出的出站请求。

这两个目录包含类似的分层打包层次结构。三个主要层是 controllerservicedomain

  • controller 软件包中包含相关 API。
  • service 软件包负责业务逻辑、base64url 编码和加密。
  • domain 软件包中包含 POJO。

安装依赖项

导航到项目目录并运行以下命令,以使用 Maven 封装容器安装所需的依赖项。如果您使用的是 App Engine,可以跳过此步骤。

./mvnw install

3. 配置付款集成商账号 ID (PIAID)

付款集成商账号 ID (PIAID) 是用于唯一标识您的集成的标识符。在开始学习本教程之前,您应该已经完成了所有前提条件而从 Google 收到 PIAID。

  1. 前往项目目录中的 src/main/resources/application.properties
  2. 将属性 payment.integrator.account.id 设置为 Google 发送给您的 PIAID。
payment.integrator.account.id={YOUR_PAYMENT_INTEGRATOR_ACCOUNT_ID}

4. 设置 Google 托管的 echo 网址

Google 托管的 echo 网址因您要集成的 API 而异。请访问与您的具体集成类型对应的 API 参考文档,并复制 Diagnostics echo API 的网址。复制网址后,请继续执行后续步骤,以在 Java 项目中更新该网址。

  1. 前往项目目录中的 src/main/resources/application.properties
  2. 请将属性 API_SERVICE_NAME 设置为与开发者文档中找到的值一致。
google.hosted.echo.url=vgw.googleapis.com/gsp/{API_SERVICE_NAME}/echo/

5. 添加 PGP 密钥

如下所示,添加您的 PGP 密钥以启用 PGP 加密。

  • 前往 src/resources/publicKey1.gpg,然后将 ASCII 封装的公钥添加到该文件中。
  • 转到 src/resources/privateKey1.gpg,然后将 ASCII 封装的私钥添加到该文件中。
  • 前往 src/resources/passphrase1.txt,然后将密码添加到该文件中。

添加 PGP 密钥

如需启用双密钥加密,请将第二个公钥添加到 publicKey2.gpg,将第二个私钥添加到 privateKey2.gpg,并将第二个口令添加到 passphrase.txt。添加第二个键后,取消注释掉 KeyConfig.addPrivateKeyAndPassphrase(...)KeyConfig.addPublicKeys(...) 中负责加载第二对键的代码行。

太好了,您已准备就绪,可以运行应用了!

6. 运行应用

如需启动应用,请执行以下命令。

  $ ./mvnw spring-boot:run

如果您运行的是预配置的 App Engine 实例,请改为运行以下命令。

$ gcloud app deploy

默认情况下,服务器将监听端口 8080。如需查看 Open API Swagger 界面,请前往以下网址。

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

7. 测试 Google Standard Payments Outbound API 连接

现在应用正在运行,可以测试与 Google echo API 的连接了。

可以使用 Swagger 界面或 CLI 运行以下命令,以从示例应用的实例向 Google 服务器发起调用。示例应用 echo API 接受明文形式的 POST 请求。收到请求后,系统会向 Google 托管的 API 发送后续请求。

通过命令行发送请求

在执行命令之前,请将 HOSTNAME 替换为您的服务器主机的名称。

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

在 Swagger 界面中发送请求

如需使用 Swagger 界面发送请求,请转到 https://{APPLICATION_HOST}/swagger-ui,并在请求正文中设置客户端消息。点击“执行”按钮。

通过 Swagger 提交 GSP Echo 请求

接收响应

成功的 API 请求将导致来自 Google 的以下响应。

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

详细路线

现在,您的服务器已成功发送请求,下面我们来了解一下其工作原理。

构建请求

OutboundEchoService 中的 createEchoRequestWithMessage 会构建发送到 Google API 的 echo 请求。

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

生成的请求包含 clientMessage 以及几个默认值字段。

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

对请求进行 Base64url 编码和加密

所有请求都经过加密和 base64url 编码。在此示例中,PgpEncryptor.java 包含可为您执行加密、解密以及 base64url 编码的辅助方法。以下方法会对请求进行编码并使用 Google 的公钥执行加密。

String encryptedMessage = pgpEncryptor.encrypt(jsonEchoRequestMessage);

发送 POST 请求

加密邮件通过 POST 请求发送。

postStandardPaymentsEchoApi(encryptedMessage)

对响应进行解密和 base64url 解码并返回响应

Google 的成功响应是采用 base64url 编码和加密的,因此也需要对其进行解码和解密,然后才能以明文形式返回。decrypt 方法 base64url 对响应进行解码和解密。

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

返回响应

该响应将返回 202 HTTP 响应状态代码。

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

8. 测试入站 API 连接

为了测试入站 echo API 连接,Google 会向合作伙伴托管的 echo API 发送请求。准备就绪后,请与您的 Google 联系人合作,以触发来自 Google 的此请求。

当您能够读取来自 Google 的入站 echo 请求并通过有效的 echo 响应进行响应时,echo 测试就完成了。

详细路线

现在,您的服务器已成功接收并处理了请求,下面我们来回顾一下其工作方式。

对请求进行 Base64url 解码和解密

收到请求后,PgpEncryptor.java 将调用 decrypt,以对请求进行 base64url 解码和解密。

String decryptedRequest = pgpEncryptor.decrypt(echoRequest);

接收请求

解码和解密后,Google 发送了类似于以下内容的消息载荷。

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

构建响应

成功读取入站 echo 请求后,您就可以构建响应了。

private EchoResponse convertEchoRequestStringToEchoResponse(String decryptedRequest);

响应包括来自 Google 的消息,以及来自服务器的时间戳和消息。

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

对响应执行 Base64url 编码和加密

由于所有请求都经过加密并采用 base64url 编码,因此 PgpEncryptor.java 会调用 encrypt 对请求进行 base64url 编码和加密。

pgpEncryptor.encrypt(echoResponseString)

返回响应

该响应将返回 202 HTTP 响应状态代码。

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

9. 恭喜!

在此 Codelab 中,您已成功与 Payments API 建立连接!