如何在 Node.js 中与 Payments API 建立连接

1. 准备工作

这是一个自助式 Codelab,它将介绍如何与 Stanadard Payments API 建立连接。

前提条件

  • 您已完成实施流程的第 1 步和第 2 步。
  • 您可以在通过 Google 配置的网域中使用 Google App Engine 或您自己的解决方案来托管所提供的具有 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。

  1. 找到项目目录中的 server.js 文件。
  2. 将变量 PIAID 设置为 Google 发送给您的 PIAID。
const PIAID = '{PAYMENT_INTEGRATOR_ACCOUNT_ID}';

4. 添加 PGP 密钥

在项目结构中创建以下文件并添加您的 PGP 密钥以启用 PGP 加密。

  • 创建一个名为 public.key 的文件,并将 ASCII 封装的公钥添加到该文件中。
  • 创建一个名为 private.key 的文件,并将 ASCII 封装的私钥添加到该文件中。
  • 创建一个名为 passphrase.txt 的文件,并将密码添加到该文件中。

添加 PGP 密钥

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

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 将向 Partner Hosted 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 建立连接!