1. 導入
SaaSプロダクトや業務システムを開発・運用する際、ユーザーから「クレジットカード決済は可能か?」という問い合わせを受けることは非常に多いです。特に、レガシーなプランと最新のプランが混在している環境では、ユーザーが現在契約しているプランに応じて決済手段を出し分けるロジックが必要です。本記事では、この「プランに基づく決済手段の判定」を自動化し、ユーザー体験を損なわないための実装アプローチを解説します。
2. 基礎知識
決済手段を判定するためには、まず「プラン情報(Plan Type)」を正しく取得する必要があります。SaaSにおいては、データベース上のフラグ(例: `is_legacy_plan`)や、決済代行サービス(Stripeなど)から取得するサブスクリプションIDをキーにして判定を行うのが一般的です。今回は、プランの型によって利用可能な決済手段を定義するロジックを実装します。
3. 実装/解決策
決済可能な手段をハードコーディングせず、プランごとの設定(コンフィグ)として分離させるのがポイントです。これにより、今後「Discover」や「Diners Club」が利用不可になった際や、逆に新しい決済手段が増えた際にも、コードを改修することなく設定変更だけで対応可能になります。
4. サンプルプログラム
以下は、Pythonを用いたプラン判定ロジックのサンプルです。
決済手段の定義
実務ではDBや設定ファイルから読み込むことを推奨します
PLAN_CONFIG = {
“NEW_PLAN”: {
“allow_credit_card”: True,
“cards”: [“Visa”, “MasterCard”, “American Express”, “JCB”, “Discover”, “Diners Club”],
“allow_bank_transfer”: True
},
“CLASSIC_PLAN”: {
“allow_credit_card”: False,
“cards”: [],
“allow_bank_transfer”: True,
“allow_direct_debit”: True
}
}
def get_available_payment_methods(plan_name):
# プランが存在しない場合の例外処理
config = PLAN_CONFIG.get(plan_name)
if not config:
return {“error”: “不明なプランです。管理者にお問い合わせください。”}
# 判定ロジック
methods = []
if config[“allow_credit_card”]:
methods.append(f”クレジットカード: {‘, ‘.join(config[‘cards’])}”)
if config[“allow_bank_transfer”]:
methods.append(“銀行振込”)
if config.get(“allow_direct_debit”):
methods.append(“口座振替”)
return {“plan”: plan_name, “available_methods”: methods}
実行確認
print(get_available_payment_methods(“NEW_PLAN”))
print(get_available_payment_methods(“CLASSIC_PLAN”))
5. 応用・注意点
現場で役立つ補足として、以下の点に注意してください。
決済手段変更時のステータス同期:
ユーザーがプラン変更を行った瞬間、決済手段のバリデーションを即座に再評価する必要があります。キャッシュが残っていると「旧プランでは使えていたクレジットカードが新プランでは使えない(またはその逆)」といった不整合が発生し、決済エラーの原因となります。
エラーハンドリングの重要性:
クレジットカードが拒否された場合、単純に「決済不可」と表示するのではなく、なぜその手段が使えないのか(例:プランの制限か、カード期限切れか)を明確にUI/UXで伝えることが、問い合わせ削減の鍵となります。また、決済代行側のAPIから返されるエラーコードをログに詳細に出力し、Sentryなどの監視ツールで追跡できるようにしておきましょう。

コメント