べき等性
重複した課金、顧客、その他のリソースを作成せずに、APIリクエストを安全に再試行します。べき等キーを使用して信頼性の高い決済連携を構築する方法を学びます。
概要
ネットワークの問題、タイムアウト、サーバーエラーにより、APIリクエストが失敗したり、結果が不明確になることがあります。べき等性により、重複操作を心配することなく、リクエストを安全に再試行できます。Idempotency-Keyヘッダーを提供することで、Omiseは同じリクエストが複数回送信されても同じ結果を生成することを保証します。
クイックスタート
- POST/PATCHリクエストに
Idempotency-Keyヘッダーを追加 - 操作ごとに一意のキーを使用(UUID推奨)
- 同じキーは同じ結果を返す(24時間キャッシュ)
- 課金作成とお金の操作に不可欠
- ネットワーク問題時の重複決済を防止
べき等性とは
べき等性とは、操作を複数回実行しても同じ結果が得られることを意味します。決済処理では、これは非常に重要です:
べき等性なしの場合
1. 課金リクエストを送信 → ネットワークタイムアウト
2. 成功した?不明。再試行する?
3. 再試行 → 重複課金!顧客に二重請求 💥
べき等性ありの場合
1. べき等キー付きで課金を送信 → ネットワークタイムアウト
2. 同じキーで再試行 → 同じ結果を返す
3. 重複課金なし ✅
べき等性の仕組み
- リクエストを送信
Idempotency-Keyヘッダー付き - Omiseが処理 し、結果を保存
- 24時間以内に同じキーで再試行すると:
- Omiseはキャッシュされた結果を返す
- 新しい操作は実行されない
- 同じレスポンスステータスコードとボディ
フロー例
# 最初のリクエスト(ネットワークタイムアウト)
curl https://api.omise.co/charges \
-X POST \
-u skey_test_...: \
-H "Idempotency-Key: 550e8400-e29b-41d4-a716-446655440000" \
-d "amount=100000" \
-d "currency=thb" \
-d "card=tokn_test_..."
# レスポンス: (タイムアウト - 成功したか不明)
# 同じキーで再試行
curl https://api.omise.co/charges \
-X POST \
-u skey_test_...: \
-H "Idempotency-Key: 550e8400-e29b-41d4-a716-446655440000" \
-d "amount=100000" \
-d "currency=thb" \
-d "card=tokn_test_..."
# レスポンス: 元の課金を返す(新しいものではない)
いつべき等性を使用するか
常に使用すべき場合:
✅ 課金の作成
POST /charges
最も重要 - 重複決済を防止
✅ 顧客の作成
POST /customers
重複した顧客レコードを防止
✅ 返金の作成
POST /charges/:id/refunds
重複した返金を防止
✅ 振込の作成
POST /transfers
重複した支払いを防止
✅ 受取人の作成
POST /recipients
重複した受取人レコードを防止
✅ すべてのPOSTリクエスト リソースを作成するすべてのPOSTリクエストにべき等キーを使用
✅ PATCHリクエスト 更新もべき等性で安全に再試行可能
不要な場合:
❌ GETリクエスト データの読み取りは既にべき等(副作用なし)
❌ DELETEリクエスト 削除は自然にべき等(2回削除 = 同じ結果)
Idempotency-Keyヘッダー
ヘッダー形式
Idempotency-Key: <一意の文字列>