BLOG

ブログ

決済代行サービスVeritrans4G-MDKをDocker実行環境へ組み込む方法

こちらは、Mavs Advent Calendar2023の16日目の記事です!

🎄🎄🎄

こんにちは、タロウです。

Web決済が可能なシステム開発でDGFT社のマルチ決済ソリューションVeritrans4Gを使用してクレジット・コンビニなどの決済を可能としました。
開発を進めているバックエンド環境へ組み込むのにかなり苦戦しましたので、そんな困った点・解消方法を紹介し、開発される方のヒントとなれば嬉しいです!

動作環境

  • yarn:1.22.19
  • node:16.10.0
  • express:4.18.1
  • typescript:4.7.4

基本的Private通信を行うので、バックエンドのみとします。

マルチ決済ソリューションVeritrans4Gとは

様々な決済方法を一括して実現でき、ユーザーに多数の方法を提供することができる決済代行サービスです。
クレジットカードやコンビニ決済はもちろんですが、銀行引き落としやキャリア決済などにも対応しておりニーズに合わせた決済機能の提供が可能となります。

中でもクレジットカード決済では入力したカード情報をWebサービス側(決済代行サービスを使用する事業者側)で保持する必要がなく、より漏洩リスクを減らすことができます。
クレジットカード決済時にサーバーを通さずクライアントのみの通信でクレジットカード情報の通信を行うことができるため、サーバーログにもカード情報を残すことがないのでサービス提供者・事業者側も安心して運用することができます。

開発にあたり

公式ページから開発ガイドやMDK(Merchant Development Kit)、サンプルプログラムが公開されており情報がかなり大分め取り込みやすいです。ドキュメントもかなり見やすく整理されており開発開始する段階で情報に迷うことは少なかったと思います。

ただ・・サンプルプログラムに関しては使用の雰囲気を掴むことはできましたが、そのまま適用することはほぼできないので、よく読み解きながらお試しを繰り返すしかありませんでした。

どうしても解決しない問題はテクニカルサポート部門へ聞くこともできますが、方法がメールしかないため急いで解決する方はどうしても情報を漁る方法になるかと思います。
(メールはかなり丁寧で親身になってもらえるので、ゆとりを持った開発を。)

導入ガイドにもありますが、こちらからJavaScript版のMDK一式をダウンロードすることができます。
他にもRuby・Java・.NET・PHP8で使用することができるモジュールが展開されています。

既存プロジェクトへ導入するためには

上記からダウンロードしたモジュールを解凍後、任意のパッケージ名へ変更しバックエンド直下へ配置します。

各ソースでモジュールを参照するため、package.jsonのdependenciesへ追記し相対パスで外部モジュールを認識させます。

{
  "name": "test",
  "version": "1.0.0",
  "description": "test",
  "main": "index.js",
  "scripts": {
    ~~~
  },
  "dependencies": {
    "express": "^4.18.1",
    "tg-mdk-node": "./tgMdkNode", //ここに追加
  },
  "devDependencies": {
    ~~~
  },
  "volta": {
    "node": "16.10.0",
    "yarn": "1.22.19"
  },
  "engines": {
    "node": "16.x"
  }
}

念の為、yarn installを行い、他パッケージもインストールされるか確認しておきましょう。

ESLintの設定

ESLintを入れている場合は設定ファイルに除外設定を書きましょう。
バージョンアップ時に差分として上がってしまうと後々手間になりそうです。

{
  "root": true,
  "env": {
    "es2021": true,
    "node": true
  },
  "extends": ["standard-with-typescript", "prettier"],
  "overrides": [],
  "parser": "@typescript-eslint/parser",
  "parserOptions": {
    "ecmaVersion": "latest",
    "sourceType": "module",
    "project": "./tsconfig.json"
  },
  "plugins": ["import", "unused-imports"],
  "rules": {
    ~~~
  },
  "ignorePatterns": [
    "node_modules",
    "dist/",
    "tests/",
    "types/",
    "tgMdkNode" //ここに追加
  ]
}

Docker環境で使用するためには

今回のプロジェクトではDockerを使用して動作することを前提としているので、Dockerfileへも手を加える必要があります。

Veritrans4GのMDK自体も別に必要とするパッケージがあるためインストールしなければいけません。

大まかな順序はこのようになります。

  1. Dockerベースイメージを読み込み
  2. MDKのパッケージインストール&ビルド
  3. 本体アプリのパッケージインストール&ビルド
  4. runtime環境へコピー
  5. 起動

マルチステージビルドでの例ですがこのようなコマンドを実行します。
マルチステージビルドを使用していない場合は、本体アプリのパッケージインストール&ビルド後に起動コマンドを設定します。

FROM public.ecr.aws/docker/library/node:16-alpine as setup
WORKDIR /tmp/src
COPY --chown=node:node . .
# MDKのパッケージインストール&ビルド
RUN cd tgMdkNode && npm install --no-progress
RUN cd tgMdkNode && npm install -g rimraf
RUN cd tgMdkNode && npm run build

# 本体アプリのパッケージインストール&ビルド
COPY --chown=node:node package.json yarn.lock ./
RUN yarn install --no-progress

FROM public.ecr.aws/docker/library/node:16-alpine as build
WORKDIR /usr/src/backend
# runtime環境へコピー
COPY --from=setup /tmp/src/tgMdkNode ./tgMdkNode
COPY --from=setup /tmp/src/node_modules ./node_modules
ENV HOST 0.0.0.0
EXPOSE 3006

USER node

# 起動
CMD ["yarn", "dev"]

これで実行環境までの下準備を行うことができます。

決済処理の下準備と決済処理

動作環境まで準備ができたのでソースからMDKを使用することできます。
MDKを使用して決済を行うためには大きく3つのステップがあります。

  1. マーチャント設定
  2. トランザクション開始
  3. 決済処理

全ての決済においてこの方法でVeritrans4Gへリクエストを送り、決済を行います。

1.マーチャント設定

接続先の設定やダミーモードの設定を行います。

MDKを使用するためにはVeritrans4G自体に登録が必要になります。検証アカウントは無料で手に入るため、本番アカウントを発行する前から開発を進めることができます。
トライアル登録後に入手可能な値を使用します。

import { MerchantConfig } from 'tg-mdk-node/dist/tgMdk/MerchantConfig';

const merchantCcId = "AXXXX000000000000XXXXXXXXX";
const merchantSecretKey ="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
const dummyMode = process.env.DUMMY_MODE ? '1' : '0';

export class VeritransService {
  /**
   * マーチャント設定
   * @return transaction トランザクション
   */
  public setMerchant(): Transaction {
    // マーチャント設定
    const config = new MerchantConfig(merchantCcId, merchantSecretKey, dummyMode);
    
    ~~~~~
  }
}

new MerchantConfigの引数でアクセス情報を渡し、マーチャント設定インスタンスを生成します。

2.トランザクション開始

1.で作成したマーチャント設定インスタンスを元にトランザクションを開始します。

import * as Log4js from 'log4js';
import { MerchantConfig } from 'tg-mdk-node/dist/tgMdk/MerchantConfig';
import { Transaction } from 'tg-mdk-node/dist/tgMdk/Transaction';

const merchantCcId = "AXXXX000000000000XXXXXXXXX";
const merchantSecretKey ="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
const dummyMode = process.env.DUMMY_MODE ? '1' : '0';

export class VeritransService {
  /**
   * マーチャント設定
   * @return transaction トランザクション
   */
  public setMerchant(): Transaction {
    // マーチャント設定
    const config = new MerchantConfig(merchantCcId, merchantSecretKey, dummyMode);
    
    // ログ設定
    Log4js.configure({
      appenders: { system: { type: 'stdout' } },
      categories: { default: { appenders: ['system'], level: 'info' } },
    });
    const logger: Log4js.Logger = Log4js.getLogger('default');

    // マーチャント設定からトランザクション開始
    return new Transaction(logger, config);
  }
}

トランザクションを開始するためには、

  • マーチャント設定インスタンス
  • ロガー

の2つが必要になります。
ロガーはLog4jsを使用しトランザクションのパラメータに設定します。

3.決済処理

トランザクション開始後は任意のタイミングで決済処理(Veritransへリクエスト)を行うことができます。

import { CardAuthorizeRequestDto } from 'tg-mdk-node/dist/tgMdkDto/Card/CardAuthorizeRequestDto';
import { CardAuthorizeResponseDto } from 'tg-mdk-node/dist/tgMdkDto/Card/CardAuthorizeResponseDto';

/**
 * [クレジットカード決済]トークン決済申込
 * @param transaction トランザクション
 * @param params 与信要求電文
 * @return
 */
public async excuteCardAuthorize(params: CardAuthorizeParams): Promise<void> {
  try {
    const requestDto = new CardAuthorizeRequestDto();
     // 会員ID(ベリトランスへ登録するID)
    requestDto.accountId = params.accountId;
    // 決済ID
    requestDto.orderId = "XXXXXXXXXXXXXXXXXXXXX";
    // MDKトークン
    requestDto.token = params.token;
    // 支払い種別
    requestDto.jpo = params.jpo;
    // 決済金額
    requestDto.amount = params.amount.toString();
    // 売上フラグ(与信売上)
    requestDto.withCapture = 'true';

    // クレジット決済 与信売上 実行
    const responseDto: CardAuthorizeResponseDto = await params.transaction.execute(
      requestDto,
      CardAuthorizeResponseDto
    );

    return;
  } catch (error) {
    Log.warn(error);
    throw BadRequestException;
  }
}

クレジットカード決済処理関数を例に出します。引数のparamsへはクレジットカード決済に必要なデータが入っており、MDKが準備しているDTOに習って設定を行います。

決済ID・オーダーID

Veritrans側で決済を一意に特定するIDです。Veritransから払い出させるものではなくシステム側で発行し決済時に送る必要があります。

システム側で保持する決済データと紐付ける重要なIDとなるため、一意となるよう発行しましょう。

トークン

クレジットカードでのみ必要な情報となります。画面からクレジットカード番号を入力し支払いを行う際に、クレジットカード情報はサーバー(バックエンド)を通さずに直接Veritrans4Gに送られます。

そのレスポンスとしてクレジットカード情報を特定するためのトークンを受け取ることができるため、決済処理においてはそのトークンを使用して処理を行います。

さいごに

Dockerで稼働しているプロジェクトへVeritrans4GのMDKを適用する例の紹介でした!

このようなパターンでモジュールを使用するのは初の試みでしたので、動作するまで何回も試行錯誤でしたが動かすことができるようになりました。

同じ実装を行なっている方の少しでもハマる時間の短縮になればと思います!

RELATED ARTICLE