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は、統合を一意に識別するために使用される ID です。このチュートリアルを開始する前に前提条件を満たしていれば、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. パートナー API の接続性をテストする

パートナー エコー API 接続をテストするために、Google はパートナー ホスト型エコー 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 との接続を正常に確立しました。