メインコンテンツへスキップ

失敗とエラーシナリオのシミュレート

Omise統合でのエラーシナリオ、失敗モード、エッジケースをテストするための包括的なガイド。ネットワーク障害、支払い拒否、APIエラーをシミュレートし、堅牢なエラー処理を実装する方法を学びます。

概要

支払い統合で失敗シナリオをテストすることは、堅牢なアプリケーションを構築するために重要です。アプリケーションはエラーを正常に処理し、ユーザーに明確なフィードバックを提供し、適切な再試行ロジックを実装する必要があります。このガイドは、本番環境に移行する前にテストすべきすべての失敗シナリオをカバーしています。

失敗テストが重要な理由

  • ユーザーエクスペリエンス: 明確で有用なエラーメッセージを提供
  • データ整合性: 重複チャージとデータ破損を防止
  • システム信頼性: ネットワーク問題とタイムアウトを正常に処理
  • セキュリティ: 不正トランザクションを検出して防止
  • コンプライアンス: ペイメントカード業界の要件を満たす
  • ビジネス継続性: 部分的な障害時に運用を継続

テストする失敗タイプ

  1. 支払い拒否: カード拒否、資金不足、不正検出
  2. ネットワーク障害: 接続エラー、タイムアウト、DNS 障害
  3. API エラー: 無効なリクエスト、認証エラー、レート制限
  4. 3D Secure 失敗: 認証失敗、タイムアウト、キャンセル
  5. ウェブフック 失敗: 配信失敗、シグネチャ検証エラー
  6. システムエラー: サーバーエラー、データベース障害、統合の問題

支払い拒否シナリオ

特定の拒否理由をテスト

これらのテストカードを使用して、特定の拒否シナリオをシミュレート:

[コード例: JavaScript、Python、Ruby による拒否テスト]

ネットワーク障害シミュレーション

タイムアウトをテスト

ネットワークタイムアウトをシミュレートしてアプリケーション内で処理:

[タイムアウト処理の実装例]

3D Secure 失敗シナリオ

3DS 認証失敗をテスト

# Python - 3D Secure 失敗のテスト
import omise

omise.api_secret = 'skey_test_xxxxxxxxxx'
omise.api_version = '2019-05-29'

def test_3ds_authentication_failure():
"""3DS 認証失敗をテスト"""
try:
# 3DS 認証が失敗するカードを使用
token = omise.Token.create(
card={
'name': 'Test User',
'number': '4000000000000010', # 3DS 登録済み、認証失敗
'expiration_month': 12,
'expiration_year': 2026,
'security_code': '123'
}
)
# チャージ作成とフロー処理...

API エラーシナリオ

無効なリクエストをテスト

入力検証エラーをテストしてカバー:

[API 検証エラーの実装例]

ウェブフック 失敗シナリオ

ウェブフック 配信失敗をテスト

[ウェブフック 失敗処理の実装例]

再試行ロジックのテスト

指数バックオフを実装

// JavaScript - 指数バックオフ再試行ロジック
class RetryHandler {
constructor(options = {}) {
this.maxRetries = options.maxRetries || 3;
this.baseDelay = options.baseDelay || 1000;
this.maxDelay = options.maxDelay || 30000;
this.factor = options.factor || 2;
}

calculateDelay(attempt) {
let delay = this.baseDelay * Math.pow(this.factor, attempt);
return Math.min(delay, this.maxDelay);
}

async retry(fn, options = {}) {
const shouldRetry = options.shouldRetry || this.defaultShouldRetry;

for (let attempt = 0; attempt <= this.maxRetries; attempt++) {
try {
return await fn();
} catch (error) {
if (attempt === this.maxRetries || !shouldRetry(error)) {
throw error;
}
const delay = this.calculateDelay(attempt);
await new Promise(resolve => setTimeout(resolve, delay));
}
}
}
}

ベストプラクティス

1. すべての失敗モードをテスト

包括的なテストスイートを作成して、すべての失敗シナリオをカバー:

[包括的なテストスイート実装]

2. 適切なエラーログを実装

デバッグ用に十分なコンテキストを持つすべてのエラーをログ:

[エラーログ実装例]

3. 失敗率を監視

エラー率を追跡して異常なパターンにアラート:

[失敗率監視実装例]

4. べき等性をテスト

重複リクエストが正しく処理されることを確認:

[べき等性テスト実装]

5. 同時失敗をテスト

複数の同時失敗時のシステム処理をテスト:

[同時失敗テスト実装]

トラブルシューティング

一般的な問題

問題: 再試行によって重複チャージが発生

原因: べき等性キーを使用していない

解決策: 支払いリクエストに常にべき等性キーを使用:

const charge = await Omise.charges.create(
{
amount: 100000,
currency: 'THB',
card: token.id
},
{ 'Idempotency-Key': uniqueKey }
);

問題: ウェブフック エンドポイントがタイムアウト

原因: 同期的にウェブフックを処理している

解決策: 非同期でウェブフックを処理:

[非同期ウェブフック処理例]

FAQ

失敗したカード拒否をテストするにはどうすればよいですか?

テストカード参照セクションにリストされているテストカード番号を使用します。各カードは特定の拒否理由をトリガーします。

自動的に失敗した支払いを再試行する必要がありますか?

一時的なエラー (タイムアウト、接続障害、5xx エラー) でのみ再試行してください。永続的な失敗 (無効なカード、資金不足、不正検出) では再試行しないでください。

再試行の間隔はどのくらいにすべきですか?

1秒で開始する指数バックオフを使用し、各再試行で2倍にして、最大30秒とします。スターディング ハード 問題を防ぐためにジッターを追加してください。

関連リソース

次のステップ

  1. すべての失敗シナリオに対するエラー処理を実装
  2. 包括的なログを設定してデバッグ
  3. 指数バックオフで再試行ロジックをテスト
  4. ウェブフック 検証と失敗処理を実装
  5. テストカードですべての拒否シナリオをテスト
  6. 本番環境で失敗率を監視
  7. 異常なエラーパターンのアラートを設定
  8. チーム向けのエラー処理を文書化

ウェブフック をテストする準備ができましたか? ウェブフック テストを参照してください。

テストカードデータが必要ですか? テストカードとデータを参照してください。