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

1. 准备工作

前提条件

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

学习内容

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

2. 设置和要求

下载应用程序

下载 Java 示例代码

应用结构概览

Java 示例代码集成了 Google 的标准付款 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 Output 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,并在请求正文中设置客户端消息。如果您已准备好向 Google 发送请求,请点击“执行”按钮。

通过 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 建立连接!