決済システムのテスト観点|事故る領域と確認項目

決済は、システムの中でも最も「間違いが許されない」領域です。表示崩れや軽微な不具合であれば後日の修正で済むこともありますが、決済の欠陥は二重課金・未課金・返金漏れといった金銭事故に直結します。お金の不整合はユーザーからの問い合わせやチャージバック、そしてクライアントからの信頼喪失へと一気に波及します。
この記事では、決済システムのテスト観点を領域ごとに分解し、受託開発のPMやテスト担当者が「絶対に落としてはいけない確認項目」を押さえられるように整理します。クレジットカード決済、各種キャッシュレス、外部決済代行(PSP)との連携までを対象に、現場で使えるチェックリストの形で提示します。
決済のバグは「動くかどうか」ではなく「お金が1円もずれないか」で合否が決まります。この視点の切り替えが、決済テストの出発点です。
決済システムのテスト観点が事故に直結する理由
一般的な機能テストでは「正しく動作すること」を確認しますが、決済では「お金の状態が常に正しいこと」まで担保する必要があります。ここが他機能との決定的な違いです。
決済処理は、ユーザーの操作・自社DB・外部の決済代行サービス・カード会社という複数の主体をまたいで進みます。どこか1箇所で通信が途切れたり、処理の順序が入れ替わったりすると、「ユーザーには課金されたのに自社では注文が未確定」といった食い違いが発生します。
決済とデータの不整合は、テスト環境では再現しにくく、本番で初めて表面化しやすいという厄介な性質を持ちます。だからこそ、設計段階から異常系を織り込んだテスト観点が欠かせません。
決済テストで特に注意すべき事故のパターンは、以下のように整理できます。
| 事故の種類 | 何が起きるか | ユーザー影響 | 発生しやすい原因 |
|---|---|---|---|
| 二重課金 | 同じ注文で2回課金される | 過剰請求・返金対応 | 多重送信・リトライ制御の不備 |
| 未課金 | 注文は成立したが課金されない | 売上の取りこぼし | 非同期通知の取りこぼし |
| 返金漏れ | キャンセルしても返金されない | 不当請求のクレーム | 返金処理の実装漏れ |
| 金額相違 | 表示額と請求額が異なる | 信頼失墜・返金対応 | 端数・税・割引の計算誤り |
| 整合性崩れ | 決済成功だが在庫・注文が未反映 | 出荷不能・二重出荷 | トランザクション設計の不備 |
こうした事故が厄介なのは、リリース前のテストでは正常系が問題なく通ってしまい、「決済は問題なし」と判断されがちな点です。実際の事故は、通信断・多重送信・同時実行・外部連携の遅延といった、正常系の裏側に潜む条件が重なったときに初めて表面化します。だからこそ、決済テストでは「動くこと」の確認に満足せず、異常系を体系的に洗い出す観点が求められます。
本記事では、この事故パターンを生まないための観点を、決済フローの段階ごとに掘り下げていきます。なお、ECサイト全体で事故りやすい領域を俯瞰したい場合は、ECサイト全体のテスト観点を9領域で確認する記事もあわせて参照すると、決済以外の抜け漏れも押さえられます。
決済フロー全体を段階で捉える観点
決済を「支払いボタンを押す1つの処理」として捉えると、テスト観点が粗くなります。実際の決済は複数の段階に分かれており、各段階に固有の確認項目があります。
一般的なクレジットカード決済は、大きく次の流れで進みます。用語や段階名はサービスによって異なりますが、考え方の骨格は共通しています。
- 注文確定: ユーザーが購入内容と金額を確定する
- 与信(オーソリ): カードが利用可能か、限度額内かを確認し枠を確保する
- 売上確定(キャプチャ): 実際に請求を確定させる(出荷時など後続で行う場合もある)
- 返金・キャンセル: 確定前後の取り消し、または部分的な返金を行う
与信と売上確定を分けて設計しているシステムでは、「与信は通ったが売上確定が漏れる」パターンを必ずテストしてください。与信枠だけ確保され請求が確定しないと、ユーザーには保留金が残り続け、クレームの原因になります。
段階ごとの代表的な確認項目を整理します。
| 決済段階 | 主な確認観点 | 落としやすい点 |
|---|---|---|
| 注文確定 | 金額・数量・在庫の確定タイミング | 確定後に金額が変わらないか |
| 与信 | 限度額・有効期限・カード種別 | 与信のみで完了扱いにしていないか |
| 売上確定 | 与信からの確定漏れ・期限切れ | 確定期限を超過していないか |
| 返金 | 全額・部分・多重返金の防止 | 返金上限を超えて返金できないか |
決済段階を明確に分けて観点を洗い出すこと自体が、抜け漏れ防止の第一歩です。観点の洗い出しを体系的に進めたい場合は、テスト観点の洗い出し手順を解説した記事で観点表の作り方を確認しておくと、決済以外の機能にも応用できます。
二重決済・多重送信・冪等性の確認項目
決済で最も避けたい事故のひとつが二重課金です。原因の多くは「同じ決済リクエストが複数回サーバーに届く」ことにあります。
二重送信は、ユーザーの操作だけでなく、通信やシステムの都合でも発生します。想定すべきトリガーを列挙します。
- 支払いボタンの連打・ダブルクリック
- 通信が遅く、ユーザーがブラウザを再読み込みする
- ネットワーク断でクライアントが自動リトライする
- 決済代行からの応答が遅延し、タイムアウト後に再送する
これらは「ユーザーが悪い操作をした」のではなく、正常な利用の中で普通に起こるものとしてテストすべきです。
冪等性(べきとうせい)の考え方
こうした多重リクエスト対策の中心となる考え方が冪等性です。冪等性とは、一般に「同じ操作を複数回実行しても、結果が1回実行したときと変わらない」性質を指します。決済では、同じ注文に対する重複リクエストが来ても課金は1回だけに保たれる、という設計が求められます。
冪等性を担保する代表的な手法として、リクエストごとに一意のキー(冪等キー/注文IDなど)を付与し、サーバー側で「そのキーの処理は済んでいるか」を判定する方法が広く使われます。テストでは、この仕組みが実際に効いているかを確認します。
冪等性まわりの確認項目は次のとおりです。
- 同一の冪等キーで2回リクエストしても、課金は1回に留まるか
- 1回目の処理中(応答前)に2回目が来た場合の挙動は正しいか
- 冪等キーが付与されていないリクエストを検知・拒否できるか
- キーの有効期間や再利用時の扱いが仕様どおりか
具体的なテストシナリオとしては、次のような操作を意図的に再現します。決済リクエスト送信直後に、応答が返る前にブラウザの戻る操作や再送信を行い、それでも課金が1回に留まるかを確認します。あるいは、決済APIに対して同じ冪等キーで連続してリクエストを投げ、2回目以降が新たな課金を生まないことを検証します。
二重決済のテストは「連打してみる」だけでは不十分で、応答遅延やネットワーク断を模擬した状態での重複リクエストまで再現して初めて意味を持ちます。
二重決済は、金額の境界条件と組み合わせると検出漏れが起きやすい領域でもあります。境界値の考え方を決済金額に応用する際は、境界値分析でテストケースを作る手順の記事が、限度額や最小・最大金額の設計に役立ちます。
金額・通貨・端数・税・割引の計算観点
決済の正しさは、最終的に「請求される金額が1円もずれないこと」に集約されます。金額計算は一見単純に見えて、税・端数・割引・クーポンが絡むと途端に複雑になります。
Lee Copeland『はじめて学ぶソフトウェアのテスト技法』でも、境界には多くの欠陥が潜むと指摘されています。決済金額はまさに境界が事故を生みやすい領域です。金額の下限・上限、限度額ちょうど、0円や1円といった値は必ず観点に含めてください。
金額計算で確認すべき観点を整理します。
| 観点 | 確認内容 | 事故例 |
|---|---|---|
| 端数処理 | 切り捨て・切り上げ・四捨五入の統一 | 消費税の端数が表示と請求でずれる |
| 割引・クーポン | 複数割引の併用順序・上限 | 割引後にマイナス金額になる |
| 税計算 | 税込・税抜・軽減税率の扱い | 内税と外税の二重計算 |
| 通貨 | 通貨単位・小数桁数の扱い | 円と外貨で桁処理が異なる |
| 合計整合 | 明細合計と請求額の一致 | 明細と総額が1円ずれる |
表示金額・カートの合計・決済代行に送る金額・最終請求額の4つが完全に一致することを、必ず突き合わせて確認してください。どこか1箇所でも計算タイミングや丸め方が異なると、金額相違の事故になります。
特に割引やクーポンは、単独では正しくても組み合わせで破綻しがちです。以下のような境界的な組み合わせをテストケースに含めます。
- 割引後の金額が0円・1円になるケース
- 併用不可のクーポンを同時適用しようとするケース
- 割引率と割引額(定率と定額)が混在するケース
- 決済後にクーポンが失効している状態でのキャンセル・返金
端数処理は、システム内の計算箇所によって丸め方が異なると事故につながります。たとえば、商品単位で税を計算して丸めるのか、合計に対して一括で税を計算して丸めるのかで、最終金額が1円変わることがあります。どちらの方式を採用するかを仕様で明確にし、その方式どおりに全画面・全処理が統一されているかを確認してください。
外貨や複数通貨を扱う場合は、通貨ごとの小数桁数の違いにも注意が必要です。日本円のように小数を持たない通貨と、小数第2位まで扱う通貨を同じロジックで処理すると、桁のずれや丸め誤差が発生します。対象通貨ごとに、代表的な金額でのテストケースを用意しておくと安全です。
外部決済代行(PSP)連携のテスト観点
多くのシステムは、カード情報を自社で直接扱わず、外部の決済代行サービス(PSP: Payment Service Provider)を利用します。この連携部分は、決済システムのテスト観点の中でも特に事故が起きやすい領域です。
外部サービスとの連携は、自社側の実装だけでは完結しません。通信の遅延・切断、非同期の通知、サンドボックス環境の制約など、外部要因を織り込んだテストが必要になります。
サンドボックス環境とテストカードの利用
PSPは通常、本番とは別のテスト用(サンドボックス)環境と、動作確認用のテストカード番号を提供します。テストでは、本番の決済網に実際の請求を発生させないよう、必ずこの環境を使います。
本番のカード番号や本番環境で決済テストを行わないことは、決済テストの大前提です。テストデータと本番データの取り違えは、実際の金銭事故になり得ます。
Webhook・非同期通知の取りこぼし
決済結果は、ユーザーの画面遷移とは別に、PSPからサーバーへ非同期で通知(Webhook等)される場合があります。ここで通知を取りこぼすと、「ユーザーには課金されたのに自社では未確定」という不整合が生まれます。
非同期通知まわりで確認すべき観点は次のとおりです。
- 通知が遅延して届いた場合でも正しく処理されるか
- 同じ通知が複数回届いた場合に二重処理しないか(冪等性)
- 通知が届かなかった場合に、突合や再取得の仕組みがあるか
- 想定外の通知(不正・改ざん)を検証・拒否できるか
タイムアウト・通信断・突合
外部連携では、応答が返らないケースを必ず想定します。「リクエストは送ったが応答が来ない」状態は、課金済みか未課金かが自社からは分からない、最も危険な状態です。
| 異常パターン | あるべき挙動 | 確認ポイント |
|---|---|---|
| 応答タイムアウト | 状態を確定せず保留にする | 勝手に成功・失敗と断定しないか |
| 通信断(送信後) | 後で状態を照会し突合する | 二重課金せず再確認できるか |
| 遅延応答 | 遅れて届いても正しく反映 | 二重処理にならないか |
| 通知の欠落 | 定期突合で検知・補正 | 未確定注文を検知できるか |
決済代行との連携では、「成功」「失敗」に加えて「不明(未確定)」という第3の状態を必ず設計・テストしてください。この状態を持たないシステムは、通信断のときに必ず事故ります。
外部システムをまたぐ検証では、テスト環境の作り込みも重要になります。PSPのサンドボックスは、本番と挙動が完全一致しない場合があります。たとえば、本番でしか発生しない特定のカードエラーや、サンドボックスでは即時に返る通知が本番では遅延する、といった差分です。
そのため、サンドボックスでの確認に加えて、本番リリース後の初回決済を少額の実取引で慎重に確認する運用を組み込むことをおすすめします。テスト環境で通ったからといって、本番の外部連携が同じ挙動をするとは限らないためです。
失敗系と返金・キャンセルの確認項目
決済テストでは、正常に支払いが完了するケースよりも、失敗系のほうが観点が多く、事故も多いのが実情です。カードが使えない理由は多岐にわたり、それぞれで正しいエラー処理が求められます。
決済失敗(失敗系)の観点
まず、決済が失敗する代表的なケースを網羅します。それぞれで、ユーザーに適切なメッセージが出て、かつ課金や在庫が中途半端に残らないことを確認します。
- カード残高不足・限度額超過
- カードの有効期限切れ・無効なカード番号
- セキュリティコード(CVV)の相違
- 本人認証(3Dセキュア等)の失敗・中断
- カード会社側での利用拒否
本人認証について補足すると、3Dセキュアは一般に、決済時にカード発行会社側で本人確認を行い、なりすまし利用を抑止する仕組みです。テストでは、認証成功だけでなく、認証の中断・離脱・タイムアウト時に注文と課金がどうなるかを必ず確認します。
失敗系で最も危険なのは、「決済は失敗したのに注文だけ成立している」あるいはその逆の状態です。成功と失敗の状態が、注文・在庫・課金の全てで一貫していることを確認してください。
失敗系のエラー処理は、それ自体が独立した設計テーマです。エラー時の挙動を体系的に設計したい場合は、エラーハンドリングテストの設計と実践を解説した記事が、決済以外の異常系にも応用できます。
返金・キャンセル・部分返金の観点
返金は「決済の逆処理」ですが、単純な巻き戻しではありません。特に部分返金は計算と状態管理が絡み、事故が起きやすい領域です。
| 観点 | 確認内容 | 落としやすい点 |
|---|---|---|
| 全額返金 | 決済額と同額を正しく返金 | 手数料や端数の扱い |
| 部分返金 | 一部数量・一部金額の返金 | 返金合計が決済額を超えないか |
| 多重返金防止 | 同じ取引を二重返金しない | 返金の冪等性 |
| 期限・状態 | 売上確定前後で処理が異なる | 確定前はキャンセル、確定後は返金か |
| 在庫連動 | 返金時の在庫戻し | 在庫が戻らない/二重で戻る |
部分返金では、複数回の返金合計が元の決済額を超えないことを、境界値を含めて確認します。「9,000円の決済に対し、5,000円と5,000円の返金を試みる」ような超過ケースは、必ずテストケースに入れてください。
返金の観点では、タイミングによる処理の違いも押さえます。売上確定前であれば与信の取り消し(オーソリキャンセル)で済む一方、確定後は返金処理が必要になり、ユーザーへの入金反映までに日数がかかる場合があります。テストでは、確定前・確定後それぞれで正しい経路の処理が呼ばれるか、そしてユーザーに表示される状態(返金中・返金完了など)が実際の処理状況と一致するかを確認してください。表示と実態がずれると、「返金されていない」という問い合わせにつながります。
整合性とセキュリティの確認項目
決済処理の最後の砦が、データの整合性とセキュリティです。ここが崩れると、金銭事故だけでなく情報漏えいという重大インシデントにつながります。
決済とDB・在庫の整合性
決済が成功したのに注文が保存されない、あるいは在庫が引き当てられない、といった不整合は、トランザクション設計の不備から生まれます。
整合性の観点で確認すべき項目は次のとおりです。
- 決済成功と注文確定・在庫引き当てが一貫して行われるか
- 途中で処理が失敗したとき、中途半端な状態が残らないか
- 同時に複数の注文が来たとき(同時実行)に二重計上しないか
- 決済結果と自社DBを定期的に突合する仕組みがあるか
決済・注文・在庫は「全部成功」か「全部取り消し」のどちらかに揃える設計が原則です。どれか1つだけが成立する状態を、テストで意図的に作り出して検証します。
同時実行の観点は特に見落とされがちです。在庫が残り1点の商品に対し、複数のユーザーがほぼ同時に決済へ進んだ場合、両方の決済が成立して在庫がマイナスになる、といった事故が起こり得ます。負荷をかけた状態や、意図的に同時リクエストを発生させた状態で、在庫の引き当てが正しく排他制御されているかを確認してください。
また、処理の途中で障害が起きたケースの検証も欠かせません。決済は成功したがその直後にサーバーがエラーで落ち、注文保存だけが行われなかった、という状況を模擬し、後続の突合処理で未確定の決済を検知・補正できるかを確認します。障害注入のように意図的に失敗を起こすテストは手間がかかりますが、金銭事故の予防効果は大きい領域です。
カード情報を保持しない設計とPCI DSS
セキュリティ面では、そもそもカード情報を自社で保持しない設計が基本方針になります。カード番号を自社サーバーに通さず、PSPの画面やトークンを介して扱うことで、漏えいリスクと管理負担を大きく下げられます。
カード会員データを扱う場合の国際的なセキュリティ基準として、PCI DSS(Payment Card Industry Data Security Standard)が知られています。詳細な要件はPCI Security Standards Councilの公式サイトで公開されています。自社が準拠対象かどうかも含め、要件は一次情報で確認することをおすすめします。
Webアプリ全般のセキュリティ観点については、IPAが公開する安全なウェブサイトの作り方(IPA)が、SQLインジェクションやセッション管理など決済画面にも関わる基礎を体系的にまとめています。
セキュリティ観点の確認項目を整理します。
- カード番号・セキュリティコードを自社に保存・ログ出力していないか
- 通信が暗号化され、決済情報が平文で流れないか
- 金額や商品IDをクライアント側で改ざんできない設計か
- 権限のないユーザーが他人の決済・返金を実行できないか
特に「金額や商品IDをクライアント側で改ざんできないか」は、決済特有の重要観点です。フォームの送信値や通信内容を書き換え、100円の商品を1円で購入できてしまう、といった脆弱性は決済システムで致命的です。サーバー側で金額を再計算・再検証する設計になっているかを、必ずテストで確認します。
また、認可の観点も見落とせません。ログイン中のユーザーAが、パラメータを書き換えてユーザーBの注文をキャンセル・返金できてしまう、といった権限の抜けは、金銭事故と情報漏えいの両方につながります。他人の取引IDを指定した操作が確実に拒否されることを確認してください。
決済システムのテスト観点を実務に落とし込む
ここまでの観点を、実務で使えるチェックリストにまとめます。決済システムのテスト観点は数が多く、抜け漏れが金銭事故に直結するため、テスト設計時に一覧で確認できる形にしておくことが重要です。
領域別チェックリスト
| 領域 | 主要チェック項目 | 優先度 |
|---|---|---|
| 決済フロー | 与信〜売上確定〜返金の各段階を網羅したか | 高 |
| 二重決済 | 冪等性で二重課金を防げるか | 高 |
| 金額計算 | 表示・カート・PSP・請求の金額が一致するか | 高 |
| PSP連携 | 通信断・タイムアウトで未確定を扱えるか | 高 |
| 失敗系 | 各エラーで状態が一貫しているか | 高 |
| 返金 | 部分返金・多重返金を正しく制御できるか | 高 |
| 整合性 | 決済・注文・在庫が揃って成立/取消されるか | 高 |
| セキュリティ | カード情報を保持せず改ざんも防げるか | 高 |
決済テストでは「正常に払えること」より、通信断・多重送信・返金といった異常系を潰しきることに工数を厚く配分してください。正常系は1回通れば安定しますが、異常系は組み合わせが多く、事故はそこから生まれます。
月曜から始める3ステップ
観点が多く感じられても、着手の順序はシンプルです。
- ステップ1: 自社の決済フローを段階(与信・売上確定・返金)で図示し、段階ごとに観点を洗い出す
- ステップ2: 二重決済・通信断・失敗系・返金の異常系を、テストケースとして先に固める
- ステップ3: 表示金額から最終請求額までの金額突合を、境界値を含めて検証する
決済の不具合は、本番で発覚するとクライアントの信頼を一気に損ないます。万一の本番障害への備えと初動については、本番バグからクライアントの信頼を守る予防と初動の記事も参考にしてください。
決済システムのテスト観点に関するよくある質問
最後に、現場でよく挙がる疑問を整理します。
正常系と異常系、どちらを優先すべきですか
決済では異常系を優先します。正常に支払いが完了するケースは組み合わせが少なく、一度通れば安定しやすい一方、二重送信・通信断・失敗系・返金といった異常系は組み合わせが多く、事故のほとんどがここから生まれます。限られた工数は異常系に厚く配分してください。
本番のカードでテストしてもよいですか
避けてください。PSPが提供するサンドボックス環境とテストカードを使うのが原則です。本番カードや本番環境での確認は、実際の請求を発生させ、金銭事故のリスクを生みます。どうしても本番確認が必要な場合は、少額の実取引に限定し、返金までを含めて手順化しておきます。
冪等性はどこまでテストすればよいですか
「同じ操作を繰り返しても結果が1回分に保たれる」ことを、決済・返金の両方で確認します。同一キーでの重複リクエスト、処理中の再送、非同期通知の重複到達の3パターンを最低限カバーしてください。
決済テストの観点はどう洗い出せばよいですか
決済フローを段階(与信・売上確定・返金)に分解し、段階ごとに正常系・異常系・境界値の観点を出すのが基本です。自社サービス固有の決済手段や業務ルールがある場合は、それらを観点表に追記して網羅性を高めます。
決済のように事故が許されない領域は、限られた人員だけで観点を出し切るのが難しい場合もあります。決済システムのテスト観点の網羅性に不安がある、あるいはテスト設計を客観的に見直したいという方は、テスト体制の見直しについて相談するところから始めてみてください。第三者の視点を入れることで、自社だけでは気づきにくい観点の抜け漏れを補えます。
決済は、システムの信頼性が最も問われる領域です。本記事のチェックリストを土台に、自社の決済フローに固有の観点を足し込みながら、金銭事故ゼロのリリースを目指しましょう。
次に読むならこの記事
テストの手戻りを減らしたい方へ
テスト仕様書のExcelテンプレートを無料で配布しています。自社で整備する場合も、外部に任せる場合も、まずは型を持つところから。



