1. 准备工作
这是一个自助式 Codelab,将逐步介绍如何与 Stanadard Payments API 建立连接。
前提条件
- 您已完成实现流程的第 1 步和第 2 步。
- 您可以使用 Google App Engine 或您自己的解决方案,在通过 Google 配置的网域中托管所提供的具有 TLS 终止功能的 Node.js 服务器。
- 您的环境中已安装 Node.js。
学习内容
- 如何通过向 Google Standard Payments echo API 发出有效请求来验证连接。
- 如何接收、解密和解析从 Google 向 Partner Hosted Echo API 发出的请求。
2. 设置和要求
下载应用
下载 Node.js 示例代码。
安装依赖项
导航到项目目录并运行以下命令以安装所需的依赖项。如果您使用的是 App Engine,可以跳过此步骤。
npm install
3. 配置付款集成商账号 ID (PIAID)
付款集成商账号 ID (PIAID
) 是用于唯一标识您的集成的标识符。在开始学习本教程之前,您应该已经完成了所有前提条件而从 Google 收到 PIAID。
- 前往项目目录中的
server.js
文件。 - 将变量
PIAID
设置为 Google 发送给您的 PIAID。
const PIAID = '{PAYMENT_INTEGRATOR_ACCOUNT_ID}';
4. 添加 PGP 密钥
在项目结构中创建以下文件,并添加您的 PGP 密钥以启用 PGP 加密。
- 创建一个名为
public.key
的文件,并将 ASCII 封装的公钥添加到该文件中。 - 创建一个名为
private.key
的文件,并将 ASCII 封装的私钥添加到该文件中。 - 创建一个名为
passphrase.txt
的文件,并将密钥密码添加到该文件中。
太好了,您已准备就绪,可以运行应用了!
5. 运行应用
如需启动应用,请执行以下命令。
$ node server.js Server listening on port 8080...
如果您运行的是预配置的 App Engine 实例,请改为运行以下命令。
$ gcloud app deploy
默认情况下,服务器将监听端口 8080。
6. 测试 Google Standard Payments API 连接
现在,该应用已在运行,接下来可以测试与 Google Standard Payments echo API 的连接了。
运行以下命令,从示例应用的实例向 Google 服务器发起调用。示例应用 echo API 接受明文形式的 POST 请求。收到请求后,系统会向 Google 托管的 API 发送后续请求。
$ curl -X POST -H 'Content-Type: text/plain' -d 'Hello from Little Bear' https://{HOSTNAME}/echo
成功的 API 请求将导致来自 Google 的以下响应。
{ "responseHeader":{ "responseTimestamp":"1606710026723" }, "clientMessage":"Hello from Little Bear", "serverMessage":"Server message." }
详细路线
现在,您的服务器已成功发送请求,下面我们来了解一下其工作原理。
构建请求
bodyHelpers.js
中的 buildEchoRequestBody
会构建发送到 Google API 的 echo
请求。
const message = bodyHelpers.buildEchoRequestBody(req.body);
生成的请求包含 clientMessage
以及几个默认值字段。
{
"requestHeader":{
"protocolVersion":{
"major":1,
"minor":0,
"revision":0
},
"requestId":"ddfe0fd0-ffdc-4fcf-991a-f0611ec83970",
"requestTimestamp":"1606715389040"
},
"clientMessage":"Hello from Little Bear"
}
加密请求
所有请求都经过加密和 base64url 编码。在此示例中,crypto.js
包含可为您执行加密和解密的辅助方法。crypto.encrypt
方法使用 Google 的公钥执行加密。
const encrypted = await crypto.encrypt(message);
发送采用 base64url 编码的 POST 请求
加密消息是使用 base64url 包编码的 base64url 格式,并使用 axios 通过 POST 请求发送。
const response = await axios.post(ECHO_URL, base64url(encrypted), AXIOS_CONFIG);
解密并返回响应
Google 的成功响应是采用 base64url 编码和加密的,因此也需要对其进行解码和解密,然后才能以明文形式返回。
const encryptedMessage = base64url.toBuffer(response.data);
const decryptedResponse = await crypto.decrypt(encryptedMessage);
res.status(200);
res.send(decryptedResponse);
7. 测试 Partner API 连接
为了测试合作伙伴 echo API 连接性,Google 会向合作伙伴托管的 echo API 发送请求。
准备就绪后,请与您的 Google 联系人合作,以触发来自 Google 的此请求。
当您能够读取来自 Google 的入站 echo 请求并通过有效的 echo 响应进行响应时,echo 测试就完成了。
详细路线
现在,您的服务器已成功接收并处理了请求,下面我们来回顾一下其工作方式。
对请求进行 Base64url 解码
收到请求后,您首先需要对其进行 base64url 解码。
const encryptedRequest = base64url.toBuffer(req.body);
解密请求
对请求进行 base64url 解码后,您需要对其进行解密。
const decryptedRequest = await crypto.decrypt(encryptedRequest);
接收请求
解码和解密后,Google 发送了类似于以下内容的消息载荷。
{ "requestHeader": { "protocolVersion": { "major": 1 }, "requestId": "G1MQ0YERJ0Q7LPM", "requestTimestamp": { "epochMillis":1481899949606 }, "paymentIntegratorAccountId": "abcdef123456" }, "clientMessage": "echo Me" }
构建响应
成功读取入站 echo 请求后,您就可以构建响应了。
clientMessage = JSON.parse(decryptedRequest).clientMessage;
responseBody = bodyHelpers.buildEchoResponseBody(clientMessage);
响应包括来自 Google 的消息,以及来自服务器的时间戳和消息。
{ "responseHeader": { "responseTimestamp": { "epochMillis":1481899950236 } }, "clientMessage": "echo Me", "serverMessage": "Debug ID 12345" }
对响应进行加密和 base64 编码
生成响应消息后,您就可以对其进行加密和 base64url 编码了。
encryptedResponse = await crypto.encrypt(responseBody);
const encodedResponse = base64url(encryptedResponse);
返回响应
最后,您就可以发送 POST 响应了。
res.send(encodedResponse);
8. 恭喜!
在此 Codelab 中,您已成功与 Echo API 建立连接!