ข้อจำกัดและข้อห้ามของ Refund
การเข้าใจข้อจำกัดและข้อห้ามของ refund เป็นสิ่งสำคัญสำหรับการจัดการความคาดหวังของลูกค้าและการรับประกันการดำเนินงาน refund ที่ราบรื่น คู่มือนี้ครอบคลุมกฎ ข้อจำกัด และแนวปฏิบัติที่ดีที่สุดของ refund ทั้งหมด
ภาพรวม
Refunds ใน Omise อยู่ภายใต้ข้อจ ำกัดต่างๆ ขึ้นอยู่กับ:
- สถานะ Charge: เฉพาะ charges ที่สำเร็จเท่านั้นที่สามารถ refund ได้
- ข้อจำกัดเวลา: วิธีการชำระเงินบางอย่างมีข้อจำกัดเวลา
- ข้อจำกัดจำนวน: ไม่สามารถเกินจำนวน 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 เก่ากว่าอาจมีอัตราการปฏิเสธที่สูงขึ้น
- แนะนำ: Refund ภายใน 180 วัน
เฉพาะวิธีการชำระเงิน
- บัตรเครดิต: ไม่มีข้อจำกัดเวลา
- บัตรเดบิต: ไม่มีข้อจำกัดเวลา
- Internet banking: โดยทั่วไป 90 วัน
- Mobile banking: โดยทั่วไป 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 มีอายุมากกว่า 180 วัน - refund อาจมีอัตราการปฏิเสธที่สูงขึ้น"
end
if charge_age_days > 365
warnings << "Charge มีอายุมากกว่า 1 ปี - พิจารณาการชดเชยทางเลือก"
end
# การตรวจสอบเฉพาะวิธีการชำระเงิน
case charge.source.type
when 'internet_banking'
if charge_age_days > 90
warnings << "Internet banking refunds ดีที่สุดภายใน 90 วัน"
end
when 'mobile_banking'
if charge_age_days > 90
warnings << "Mobile banking refunds ดีที่สุดภายใน 90 วัน"
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
};
}
}