Node.js で Payments API との接続を確立する方法

1. 始める前に

このセルフガイドの Codelab では、Standard Payments API との接続を確立する方法を順を追って説明します。

前提条件

  • 実装プロセスのステップ 1 と 2 を完了している。
  • Google を使用して構成したドメインで Google App Engine または独自のソリューションを使用することにより、提供されている Node.js サーバーと TLS 終端をホストすることが可能である。
  • 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 Armour 形式の公開鍵をファイルに追加します。
  • private.key という名前のファイルを作成し、このファイルに ASCII Armour 形式の秘密鍵を追加します。
  • 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.jsbuildEchoRequestBody は、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 からの受信エコー リクエストを読み取り、有効なエコー レスポンスを返せば、エコーテストは完了です。

段階的

リクエストが正常に受信され、サーバーで処理されるようになったので、次はその動作を確認しましょう。

リクエストを 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 との接続を正常に確立しました。