BtoBの決済ソリューションの開発
決済方法の異なる事業者間の橋渡しをする決済ソリューションでテックリード、APIやJSライブラリの開発を担当
クレジットカードで支払いたい事業者とそれを受け付けていない(銀行振込で受け取りたい)事業者間の橋渡しをする決済ソリューションのプロジェクトです。
決済に利用するクレジットカードの登録・削除や決済の登録・実行のためのAPI、銀行振込を行うバッチのほか、クライアント(Webブラウザ)向けに、クレジットカードをトークン化する JavaScript 製ライブラリの設計、開発を担当しました。また、本プロジェクトではテックリードとして技術的な意思決定やサポートを行いました。
担当業務の詳細
テックリード
本プロジェクトでは API に Spring Boot (Java) を利用することのみが決まっていました。
プロジェクトが本格的に始動する前に決めておくべきことを洗い出し、バッチやクレジットカードのトークン化を行うライブラリの技術スタック、issue, PR を用いた開発の流れ、成果物のフォーマットなどを決定しました。
成果物においては、慣例では Excel で作成されていた設計書やフロー図、シーケンス図、ステートマシン図、ER 図などをマークダウンと Mermaid で作成することとしました。これにより成果物を Git 管理下に置くことができたため、更新履歴の管理のほかレビューも行いやすくなり、開発速度の向上に寄与しました。
ウェブサイトから利用されるAPIの設計
決済に利用するクレジットカードの登録・削除や決済の登録・実行など30程度のAPIの設計を担当しました。
決済関連のAPIにおいては、決済の状態(登録、オーソリ前後、3DS認証前後など)に応じて次に実行できる処理やリトライの可否など複雑な状態管理が必要でした。そこで、 XState (Stately Studio) を用いて状態遷移の可視化、検証を行い矛盾を生まないよう設計しました。
更新系のAPIについては冪等キーを用いて冪等性を担保するよう設計しました。重複するリクエストにエラーを返すのではなく、初回のリクエストと同様のレスポンスを返すよう設計しました。これはキャッシュとしても利用できるので、リクエストを受けたらなるべく早い段階でキャッシュにヒットするよう Spring Boot の Filter 部分で動作するよう設計しました。
クレジットカード情報をトークン化するJSライブラリの開発
フロントエンドで利用するクレジットカード情報をトークン化するJavaScriptライブラリの設計、開発を担当しました。
開発には TypeScript と Vite を利用しました。TypeScriptによって静的型付けの恩恵を受けつつ、Viteによって高速な開発時のプレビューや本番向けのJavaScriptファイルの作成を効率的に進めることができました。
また、このライブラリは不特定多数の顧客ウェブサイトで利用されるため、npmパッケージでの配信ではなく script タグから読み込む方式としました。これは Vite のライブラリモードを用いて実現しました。
フロント側でクレジットカード情報を暗号化するにあたり、暗号化キーはどうしても露出してしまうため、公開鍵暗号方式を採用しました。
DB設計
決済には決済の登録からクレジットカードの与信確認、3DS認証など複数のステップがあります。あるユーザーがどのステップでエラーとなったのか調査しやすいよう、一連の行動を証跡として残すように設計しました。