外部決済サービスを利用した開発の反省と改善 #devio2021

DevelopersIO 2021 Decadeで「外部決済サービスを利用した開発の反省と改善」というテーマでビデオセッションを公開しました。 Stripe などの外部決済サービスを使って決済系の開発をする上での注意点や、どう改善できるかについて話しました。
2021.10.12

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

概要

DevelopersIO 2021 Decade で「外部決済サービスを利用した開発の反省と改善」というテーマでビデオセッションを公開しました。

Stripe などの外部決済サービスを使って決済系の開発をする上での注意点や、どう改善できるかについて話しました。

動画

スライド

話したこと

  • 外部の決済代行サービスを利用した開発の反省
  • その反省を踏まえた改善方法

登場人物

今日はなす事の登場人物

  • 外部決済サービス
    • 決済の与信や売上などの処理を代行する 3rd party サービス (stripe など)
  • クライアント
    • 外部決済サービスを利用するシステム(ECサイトなど)
  • 利用者
    • クライアントシステムを利用するエンドユーザー

[参考] prismatix 決済サービス

参考までに、私の事業部で開発・運用している EC / CRM プラットフォーム prismatix の決済サービスに関する紹介です。

prismatix の決済サービスは、外部の各種決済代行サービスの仕様を吸収し、統合したインターフェースを提供しています。 EC サイトなどのクライアントが prismatix が提供するインターフェースを利用することで様々な外部決済サービスに対応できます。

今日話すことはクライアント視点です

このセッションでお話することは、上記 prismatix の決済サービスので得た知見から「クライアント」の視点で反省点や改善を述べます。

外部決済サービスを利用してわかったこと

外部決済サービスを利用してわかったこと

外部決済サービスは 「想定外のレスポンスを返す」 ことがあります。

  • 外部決済サービスの障害によるエラー
  • レスポンスを受け取るまでに時間かかる

などが考えられます。

1. 外部決済サービスとの通信でタイムアウトした場合の例

外部決済サービスとの通信でタイムアウトした場合の例

  1. クライアントの利用者が注文確定の操作をする
  2. クライアントから外部決済サービスへ取引リクエストする
  3. 外部決済サービスの処理が時間かかっていて、レスポンスが返ってこない
  4. クライアントはタイムアウトと判断し注文確定処理を中断。利用者にもエラーで注文できなかったことを返す
  5. ただし、外部決済サービス側の取引処理は継続していて、最終的に成立
  6. クライアントと外部決済サービスの状態に不整合が生じる

この例の場合、最悪のケースとして利用者から見ると 「注文成立してないのに取引は成立してるのでその請求が来る」 という体験が生まれてしまいます。

2.リリース作業で起こりうる問題

よくあるCI・CDフロー

「用意したテストがすべて成功しないとリリースが出来ない」仕組みは要注意です。 外部決済サービスのテスト環境が障害などの想定しないレスポンスを返してテスト失敗することがあります。

外部決済サービスを利用するテストが失敗

テストが失敗すると、この場合ビルドから先に進まずリリースが出来ません。

もし新しいバージョンのリリース予定がある場合、その予定までに外部決済サービス側が復旧する保証はありません。 本来予定しているスケジュールで機能提供できない事態も考えられます。

反省点まとめ

反省

外部決済サービスは 「何らかの想定しないレスポンスを返す」 という前提で利用しましょう。

では、どう改善するか

反省しました。ではどう改善すればよいか。 prismatix 決済サービスが現在も取り組んでいる改善についてこれからお話します。

  • 突合、補填の仕組みを作る
  • 外部決済サービスに接続するテストを伴うリリースフローの見直し

突合する

突合とは

突合とは、ここではクライアントと外部決済サービスの状態を比較することを指します。突合を行うことで、クライアントと外部決済サービスの状態に不整合が生じていればその検知ができます。

補填

補填

その取引の状態を合わせることを、ここでは補填と呼んでいます。

たとえば例に上げた図の場合、クライアント側はすでに注文不成立とみなしているため、外部決済サービスの取引をキャンセルしています。クライアントと外部決済サービス双方で「取引が成立していない」状態を合わせています。

外部決済サービスとの通信でタイムアウトした場合の例

突合・補填の対応を含めた例

突合・補填の対応を適切に入れることで、決済代行サービスが予期せぬレスポンスを返しても注文取引ステータスの整合性を担保できます。

リリースフローのテストに関する対策

リリースフローの改善

リリースフローの改善案として、外部決済サービスに依存するテストはビルドとは別のプロセスで実施します。

外部決済サービスに依存するテストが落ちたら

もし外部決済サービスに依存するテストが落ちた場合、

  • 外部決済サービスの一時的な不調であること
  • プロダクトを直す必要がないこと

上記は明確にする必要があります。問題ないと判断できれば、テストやビルドを再実行せずにリリースを実施できます。

まとめ

まとめ

  • 外部決済サービスは「想定しないレスポンス」を返すことがあります
  • 突合の仕組みを使って、不整合状態を検知し、必要に応じて補填しましょう
  • 外部決済サービスに起因してリリースに影響あるなら、リリースフローを見直しましょう

prismatix について補足

prismatix 決済サービスの開発で得た知見をもとに今回お話させていただきました。決済サービスについては昨年私が登壇した資料と動画がありますので以下のブログを合わせてご参照ください。

prismatix 自体がどのようなプロダクトかについては DevelopersIO 2021 Decade Day6 2021/10/14(木) 14:35から早川が説明します。ぜひご視聴ください。

また、共に改善や新たな価値提供をしていただける仲間も引き続き募集しております。弊社募集要項 の prismatix 事業部の内容をご確認ください。