Refundの制限と制約
Refundの制限と制約を理解することは、お客様の期待を管理し、スムーズな返金操作を確保するために重要です。このガイドは、すべての返金ルール、制約、ベストプラクティスをカバーします。
概要
OmiseのRefundsは、以下に基づくさまざまな制限の対象となります:
- Chargeステータス: 成功したchargesのみ返金可能
- 時間制約: 一部の決済方法には時間制限がある
- 金額制限: 元のcharge金額を超えることはできない
- 残高要件: アカウント残高が十分である必要がある
- 決済方法: 異なる方法には異なるルールがある
- 通貨: Refundsは元の通貨を使用する必要がある
- ネットワークルール: カードネットワークと銀行のポリシーが適用される
一般的な制限
Chargeステータス要件
| Chargeステータス | Refund可能? | 備考 |
|---|---|---|
successful | はい | 標準的なrefundシナリオ |
pending | いいえ | chargeが完了するまで待機 |
failed | いいえ | 資金がキャプチャされていない |
expired | いいえ | chargeが完了しなかった |
reversed | いいえ | すでに取り消された |
async function checkRefundEligibility(chargeId) {
const charge = await omise.charges.retrieve(chargeId);
if (charge.status !== 'successful') {
return {
eligible: false,
reason: `Charge status is ${charge.status}, must be successful`
};
}
if (charge.refunded) {
return {
eligible: false,
reason: 'Charge has already been fully refunded'
};
}
const remaining = charge.amount - charge.refunded_amount;
if (remaining === 0) {
return {
eligible: false,
reason: 'No remaining balance to refund'
};
}
return {
eligible: true,
remaining: remaining,
currency: charge.currency
};
}
金額の制限
最大Refund金額
- 元のcharge金額を超えることはできない
- すべてのrefundsの合計がcharge金額を超えることはできない
- 既存のrefundsを考慮する必要がある
最小Refund金額
- 通貨による
- THB: 20サタン(0.20 THB)最小
- USD: 1セント最小
- JPY: 1円最小
def validate_refund_amount(charge_id, refund_amount):
"""制限に対してrefund金額を検証"""
charge = omise.Charge.retrieve(charge_id)
# 最小金額を確認(通貨固有)
minimums = {
'thb': 20, # 0.20 THB
'usd': 1, # 0.01 USD
'jpy': 1, # 1 JPY
'sgd': 1, # 0.01 SGD
'eur': 1 # 0.01 EUR
}
min_amount = minimums.get(charge.currency.lower(), 1)
if refund_amount < min_amount:
raise ValueError(f"Refund amount below minimum of {min_amount} {charge.currency}")
# 最大金額を確認
remaining = charge.amount - charge.refunded_amount
if refund_amount > remaining:
raise ValueError(
f"Refund amount {refund_amount} exceeds remaining balance {remaining}"
)
return True
時間制限
一般的なタイムライン
- ほとんどのrefundsに厳密な時間制限はない
- 古いrefundsは却下率が高くなる可能性がある
- 推奨: 180日以内にrefund
決済方法固有
- クレジットカード: 時間制限なし
- デビットカード: 時間制限なし
- インターネットバンキング: 通常90日
- モバイルバンキング: 通常90日
- E-wallets: プロバイダーによって異なる
def check_refund_timing(charge_id)
charge = Omise::Charge.retrieve(charge_id)
charge_age_days = (Time.now - Time.at(charge.created)) / 86400
warnings = []
# 年齢ベースの警告を確認
if charge_age_days > 180
warnings << "Charge is more than 180 days old - refund may have higher decline rate"
end
if charge_age_days > 365
warnings << "Charge is more than 1 year old - consider alternative compensation"
end
# 決 済方法固有のチェック
case charge.source.type
when 'internet_banking'
if charge_age_days > 90
warnings << "Internet banking refunds are best within 90 days"
end
when 'mobile_banking'
if charge_age_days > 90
warnings << "Mobile banking refunds are best within 90 days"
end
end
{
charge_age_days: charge_age_days.round(1),
warnings: warnings,
recommended: charge_age_days <= 180
}
end
残高要件
残高不足
RefundsにはOmiseアカウントに十分な残高が必要です:
async function checkRefundBalance(chargeId, refundAmount) {
try {
// アカウント残高を取得
const balance = await omise.balance.retrieve();
// charge詳細を取得
const charge = await omise.charges.retrieve(chargeId);
// 十分な残高があるかを確認
if (balance.available < refundAmount) {
return {
canRefund: false,
reason: 'insufficient_balance',
available: balance.available,
required: refundAmount,
shortfall: refundAmount - balance.available,
nextSettlement: await getNextSettlementDate()
};
}
return {
canRefund: true,
available: balance.available,
afterRefund: balance.available - refundAmount
};
} catch (error) {
return {
canRefund: false,
reason: 'error',
error: error.message
};
}
}