1. 准备工作
前提条件
- 您已完成实现过程中的第 1 步和第 2 步。
- 您可以使用 Google App Engine 或您自己在通过 Google 配置的域中的解决方案,托管所提供的具有 TLS 终结功能的 Java 服务器。
- 您的环境中已安装 Java。
学习内容
- 如何向 Google echo API 发出有效请求,以验证连接。
- 如何接收从 Google 到合作伙伴托管的 echo API 的请求以及对其进行解密和解析。
2. 设置和要求
下载应用
下载 Java 示例代码。
应用结构概览
Java 示例代码与 Google 的 Standard Payments API 集成。示例代码项目结构包含 outbound 目录和 inbound 目录,分别用于反映从 Google 到合作伙伴的入站回显请求,以及从合作伙伴实现到 Google 的出站请求。
这两个目录都包含按层级打包的类似层次结构。三个主要层是 controller、service 和 domain。
controller软件包包含 API。service软件包负责处理业务逻辑、base64url 编码和加密。domain软件包包含 POJO。
安装依赖项
导航到项目目录并运行以下命令,以使用 Maven 封装容器安装所需的依赖项。如果您使用的是 App Engine,则可以跳过此步骤。
./mvnw install
3. 配置付款集成商账号 ID (PIAID)
付款集成商账号 ID (PIAID) 是用于唯一识别您的集成的标识符。在开始学习本教程之前,您应已满足前提条件并收到 Google 提供的 PIAID。
- 前往项目目录中的
src/main/resources/application.properties。 - 将属性
payment.integrator.account.id设置为 Google 发送给您的 PIAID。
payment.integrator.account.id={YOUR_PAYMENT_INTEGRATOR_ACCOUNT_ID}
4. 设置 Google 托管的 echo 网址
Google 托管的 echo 网址因您集成的 API 而异。访问特定集成类型的 API 参考文档,然后复制诊断回声 API 的网址。复制网址后,请继续执行后续步骤,在 Java 项目中更新该网址。
- 前往项目目录中的
src/main/resources/application.properties。 - 将属性
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并将口令添加到该文件中。

如需启用双密钥加密,请将第二个公钥添加到 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,并在请求正文中设置客户端消息。准备好向 Google 发送请求后,点击“执行”按钮。

接收回答
成功的 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 会向 Partner Hosted 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 建立连接!