ภาพรวม Balance & Transactions
Balance ในบัญชี Omise ของคุณแสดงถึงเงินทุนที่มีอยู่ในบัญชี คู่มือนี้อ ธิบายวิธีตรวจสอบ balance, ทำความเข้าใจประเภท balance ต่างๆ และจัดการเงินทุนอย่างมีประสิทธิภาพ
ภาพรวม
การทำความเข้าใจ balance ในบัญชีมีความสำคัญสำหรับ:
- การวางแผน Transfer: การรู้จำนวนเงินที่พร้อมใช้งานสำหรับการจ่ายเงิน
- การจัดการกระแสเงินสด: การติดตามเงินเข้าและเงินออก
- Reconciliation: การจับคู่ transaction กับเงินฝากธนาคาร
- การวางแผนทางการเงิน: การคาดการณ์เงินทุนที่พร้อมใช้งาน
- การตัดสินใจเชิงปฏิบัติการ: การวางแผน refund และ transfer
แนวคิดหลัก
- Total Balance: เงินทุนทั้งหมดในบัญชีของค ุณ (available + pending)
- Available Balance: เงินทุนที่พร้อมใช้งานทันที
- Pending Balance: เงินทุนที่รอ settlement หรือการประมวลผล
- Transferable Balance: จำนวนเงินที่สามารถโอนได้หลังหักค่าธรรมเนียม
- Currency: Balance ที่ติดตามตามสกุลเงิน
การตรวจสอบ Balance
ดึง Balance ปัจจุบัน
- Node.js
- Python
- Ruby
- PHP
- Go
const omise = require('omise')({
secretKey: 'skey_test_123456789',
});
// Get current balance
async function getBalance() {
try {
const balance = await omise.balance.retrieve();
console.log('Balance Information:');
console.log('------------------');
console.log(`Total: ${balance.total / 100} ${balance.currency.toUpperCase()}`);
console.log(`Available: ${balance.available / 100} ${balance.currency.toUpperCase()}`);
console.log(`Currency: ${balance.currency.toUpperCase()}`);
console.log(`Livemode: ${balance.livemode}`);
return balance;
} catch (error) {
console.error('Failed to retrieve balance:', error.message);
throw error;
}
}
// Get detailed balance breakdown
async function getBalanceBreakdown() {
const balance = await omise.balance.retrieve();
const pending = balance.total - balance.available;
return {
total: balance.total,
available: balance.available,
pending: pending,
currency: balance.currency,
breakdown: {
total_formatted: `${balance.total / 100} ${balance.currency.toUpperCase()}`,
available_formatted: `${balance.available / 100} ${balance.currency.toUpperCase()}`,
pending_formatted: `${pending / 100} ${balance.currency.toUpperCase()}`
}
};
}
// Check if sufficient balance for operation
async function hasSufficientBalance(requiredAmount) {
const balance = await omise.balance.retrieve();
return {
sufficient: balance.available >= requiredAmount,
available: balance.available,
required: requiredAmount,
shortfall: Math.max(0, requiredAmount - balance.available)
};
}
// Example usage
getBalance();
getBalanceBreakdown().then(breakdown => console.log(breakdown));
hasSufficientBalance(100000).then(result => {
if (result.sufficient) {
console.log('✓ Sufficient balance');
} else {
console.log(`✗ Insufficient balance. Short by ${result.shortfall / 100}`);
}
});
import omise
omise.api_secret = 'skey_test_123456789'
def get_balance():
"""Get current account balance"""
try:
balance = omise.Balance.retrieve()
print("Balance Information:")
print("------------------")
print(f"Total: {balance.total / 100} {balance.currency.upper()}")
print(f"Available: {balance.available / 100} {balance.currency.upper()}")
print(f"Currency: {balance.currency.upper()}")
print(f"Livemode: {balance.livemode}")
return balance
except omise.errors.BaseError as e:
print(f"Failed to retrieve balance: {str(e)}")
raise
def get_balance_breakdown():
"""Get detailed balance breakdown"""
balance = omise.Balance.retrieve()
pending = balance.total - balance.available
return {
'total': balance.total,
'available': balance.available,
'pending': pending,
'currency': balance.currency,
'breakdown': {
'total_formatted': f"{balance.total / 100:.2f} {balance.currency.upper()}",
'available_formatted': f"{balance.available / 100:.2f} {balance.currency.upper()}",
'pending_formatted': f"{pending / 100:.2f} {balance.currency.upper()}"
}
}
def has_sufficient_balance(required_amount):
"""Check if sufficient balance for operation"""
balance = omise.Balance.retrieve()
return {
'sufficient': balance.available >= required_amount,
'available': balance.available,
'required': required_amount,
'shortfall': max(0, required_amount - balance.available)
}
def format_balance_display(balance):
"""Format balance for display"""
pending = balance.total - balance.available
print("\n" + "="*50)
print("ACCOUNT BALANCE")
print("="*50)
print(f"Total Balance: {balance.total / 100:>12,.2f} {balance.currency.upper()}")
print(f"Available: {balance.available / 100:>12,.2f} {balance.currency.upper()}")
print(f"Pending: {pending / 100:>12,.2f} {balance.currency.upper()}")
print("="*50)
# Example usage
balance = get_balance()
format_balance_display(balance)
breakdown = get_balance_breakdown()
print(f"\nDetailed Breakdown: {breakdown}")
result = has_sufficient_balance(100000)
if result['sufficient']:
print("✓ Sufficient balance")
else:
print(f"✗ Insufficient balance. Short by {result['shortfall'] / 100:.2f}")
require 'omise'
Omise.api_key = 'skey_test_123456789'
# Get current balance
def get_balance
begin
balance = Omise::Balance.retrieve
puts "Balance Information:"
puts "------------------"
puts "Total: #{balance.total / 100.0} #{balance.currency.upcase}"
puts "Available: #{balance.available / 100.0} #{balance.currency.upcase}"
puts "Currency: #{balance.currency.upcase}"
puts "Livemode: #{balance.livemode}"
balance
rescue Omise::Error => e
puts "Failed to retrieve balance: #{e.message}"
raise
end
end
# Get detailed balance breakdown
def get_balance_breakdown
balance = Omise::Balance.retrieve
pending = balance.total - balance.available
{
total: balance.total,
available: balance.available,
pending: pending,
currency: balance.currency,
breakdown: {
total_formatted: "#{balance.total / 100.0} #{balance.currency.upcase}",
available_formatted: "#{balance.available / 100.0} #{balance.currency.upcase}",
pending_formatted: "#{pending / 100.0} #{balance.currency.upcase}"
}
}
end
# Check sufficient balance
def has_sufficient_balance?(required_amount)
balance = Omise::Balance.retrieve
{
sufficient: balance.available >= required_amount,
available: balance.available,
required: required_amount,
shortfall: [0, required_amount - balance.available].max
}
end
# Format balance display
def format_balance_display(balance)
pending = balance.total - balance.available
puts "\n#{'='*50}"
puts "ACCOUNT BALANCE"
puts "="*50
puts "Total Balance: %12.2f %s" % [balance.total / 100.0, balance.currency.upcase]
puts "Available: %12.2f %s" % [balance.available / 100.0, balance.currency.upcase]
puts "Pending: %12.2f %s" % [pending / 100.0, balance.currency.upcase]
puts "="*50
end
# Example usage
balance = get_balance
format_balance_display(balance)
breakdown = get_balance_breakdown
puts "\nDetailed Breakdown: #{breakdown}"
result = has_sufficient_balance?(100000)
if result[:sufficient]
puts "✓ Sufficient balance"
else
puts "✗ Insufficient balance. Short by #{result[:shortfall] / 100.0}"
end
<?php
require_once 'vendor/autoload.php';
define('OMISE_SECRET_KEY', 'skey_test_123456789');
// Get current balance
function getBalance() {
try {
$balance = OmiseBalance::retrieve();
echo "Balance Information:\n";
echo "------------------\n";
echo "Total: " . ($balance['total'] / 100) . " " . strtoupper($balance['currency']) . "\n";
echo "Available: " . ($balance['available'] / 100) . " " . strtoupper($balance['currency']) . "\n";
echo "Currency: " . strtoupper($balance['currency']) . "\n";
echo "Livemode: " . ($balance['livemode'] ? 'true' : 'false') . "\n";
return $balance;
} catch (Exception $e) {
echo "Failed to retrieve balance: {$e->getMessage()}\n";
throw $e;
}
}
// Get detailed balance breakdown
function getBalanceBreakdown() {
$balance = OmiseBalance::retrieve();
$pending = $balance['total'] - $balance['available'];
return [
'total' => $balance['total'],
'available' => $balance['available'],
'pending' => $pending,
'currency' => $balance['currency'],
'breakdown' => [
'total_formatted' => number_format($balance['total'] / 100, 2) . ' ' . strtoupper($balance['currency']),
'available_formatted' => number_format($balance['available'] / 100, 2) . ' ' . strtoupper($balance['currency']),
'pending_formatted' => number_format($pending / 100, 2) . ' ' . strtoupper($balance['currency'])
]
];
}
// Check sufficient balance
function hasSufficientBalance($requiredAmount) {
$balance = OmiseBalance::retrieve();
return [
'sufficient' => $balance['available'] >= $requiredAmount,
'available' => $balance['available'],
'required' => $requiredAmount,
'shortfall' => max(0, $requiredAmount - $balance['available'])
];
}
// Format balance display
function formatBalanceDisplay($balance) {
$pending = $balance['total'] - $balance['available'];
echo "\n" . str_repeat('=', 50) . "\n";
echo "ACCOUNT BALANCE\n";
echo str_repeat('=', 50) . "\n";
printf("Total Balance: %15s %s\n", number_format($balance['total'] / 100, 2), strtoupper($balance['currency']));
printf("Available: %15s %s\n", number_format($balance['available'] / 100, 2), strtoupper($balance['currency']));
printf("Pending: %15s %s\n", number_format($pending / 100, 2), strtoupper($balance['currency']));
echo str_repeat('=', 50) . "\n";
}
// Example usage
$balance = getBalance();
formatBalanceDisplay($balance);
$breakdown = getBalanceBreakdown();
print_r($breakdown);
$result = hasSufficientBalance(100000);
if ($result['sufficient']) {
echo "✓ Sufficient balance\n";
} else {
echo "✗ Insufficient balance. Short by " . ($result['shortfall'] / 100) . "\n";
}
?>
package main
import (
"fmt"
"log"
"github.com/omise/omise-go"
"github.com/omise/omise-go/operations"
)
const secretKey = "skey_test_123456789"
// GetBalance retrieves the current account balance
func GetBalance() (*omise.Balance, error) {
client, err := omise.NewClient(secretKey, "")
if err != nil {
return nil, fmt.Errorf("failed to create client: %w", err)
}
balance := &omise.Balance{}
err = client.Do(balance, &operations.RetrieveBalance{})
if err != nil {
return nil, fmt.Errorf("failed to retrieve balance: %w", err)
}
fmt.Println("Balance Information:")
fmt.Println("------------------")
fmt.Printf("Total: %.2f %s\n", float64(balance.Total)/100, balance.Currency)
fmt.Printf("Available: %.2f %s\n", float64(balance.Available)/100, balance.Currency)
fmt.Printf("Currency: %s\n", balance.Currency)
fmt.Printf("Livemode: %v\n", balance.Livemode)
return balance, nil
}
// BalanceBreakdown represents detailed balance information
type BalanceBreakdown struct {
Total int64
Available int64
Pending int64
Currency string
Breakdown map[string]string
}
// GetBalanceBreakdown returns detailed balance breakdown
func GetBalanceBreakdown() (*BalanceBreakdown, error) {
client, err := omise.NewClient(secretKey, "")
if err != nil {
return nil, err
}
balance := &omise.Balance{}
err = client.Do(balance, &operations.RetrieveBalance{})
if err != nil {
return nil, err
}
pending := balance.Total - balance.Available
return &BalanceBreakdown{
Total: balance.Total,
Available: balance.Available,
Pending: pending,
Currency: balance.Currency,
Breakdown: map[string]string{
"total_formatted": fmt.Sprintf("%.2f %s", float64(balance.Total)/100, balance.Currency),
"available_formatted": fmt.Sprintf("%.2f %s", float64(balance.Available)/100, balance.Currency),
"pending_formatted": fmt.Sprintf("%.2f %s", float64(pending)/100, balance.Currency),
},
}, nil
}
// SufficientBalanceResult represents balance check result
type SufficientBalanceResult struct {
Sufficient bool
Available int64
Required int64
Shortfall int64
}
// HasSufficientBalance checks if sufficient balance is available
func HasSufficientBalance(requiredAmount int64) (*SufficientBalanceResult, error) {
client, err := omise.NewClient(secretKey, "")
if err != nil {
return nil, err
}
balance := &omise.Balance{}
err = client.Do(balance, &operations.RetrieveBalance{})
if err != nil {
return nil, err
}
shortfall := int64(0)
if balance.Available < requiredAmount {
shortfall = requiredAmount - balance.Available
}
return &SufficientBalanceResult{
Sufficient: balance.Available >= requiredAmount,
Available: balance.Available,
Required: requiredAmount,
Shortfall: shortfall,
}, nil
}
// FormatBalanceDisplay formats balance for display
func FormatBalanceDisplay(balance *omise.Balance) {
pending := balance.Total - balance.Available
fmt.Println("\n==================================================")
fmt.Println("ACCOUNT BALANCE")
fmt.Println("==================================================")
fmt.Printf("Total Balance: %15.2f %s\n", float64(balance.Total)/100, balance.Currency)
fmt.Printf("Available: %15.2f %s\n", float64(balance.Available)/100, balance.Currency)
fmt.Printf("Pending: %15.2f %s\n", float64(pending)/100, balance.Currency)
fmt.Println("==================================================")
}
func main() {
// Example usage
balance, err := GetBalance()
if err != nil {
log.Fatalf("Failed to get balance: %v", err)
}
FormatBalanceDisplay(balance)
breakdown, err := GetBalanceBreakdown()
if err != nil {
log.Fatalf("Failed to get breakdown: %v", err)
}
fmt.Printf("\nDetailed Breakdown: %+v\n", breakdown)
result, err := HasSufficientBalance(100000)
if err != nil {
log.Fatalf("Failed to check balance: %v", err)
}
if result.Sufficient {
fmt.Println("✓ Sufficient balance")
} else {
fmt.Printf("✗ Insufficient balance. Short by %.2f\n", float64(result.Shortfall)/100)
}
}
API Response
{
"object": "balance",
"livemode": false,
"location": "/balance",
"available": 500000,
"total": 750000,
"currency": "thb"
}
ทำความเข้าใจประเภท Balance
Available Balance กับ Total Balance
// Available Balance: พร้อมใช้งานทันที
// Total Balance: Available + Pending เงินทุน
function explainBalance(balance) {
const pending = balance.total - balance.available;
console.log('Balance Explanation:');
console.log(`Total Balance: ${balance.total / 100} ${balance.currency.toUpperCase()}`);
console.log(` ├─ Available: ${balance.available / 100} (พร้อมใช้งาน)`);
console.log(` └─ Pending: ${pending / 100} (กำลังประมวลผล)`);
console.log('\nสิ่งที่คุณสามารถทำได้:');
console.log(` • สร้าง transfer ได้สูงสุด: ${balance.available / 100}`);
console.log(` • สร้าง refund ได้สูงสุด: ${balance.available / 100}`);
console.log(` • Pending จะกลายเป็น available หลัง settlement`);
}
Pending Balance
Pending balance ประกอบด้วย:
- Charge ล่าสุดที่รอ settlement
- Refund ที่กำลังประมวลผล
- Transfer ที่กำลังประมวลผล
- Charge ที่มีข้อพิพาทค้างอยู่
def analyze_pending_balance():
"""Analyze why funds are pending"""
balance = omise.Balance.retrieve()
pending = balance.total - balance.available
if pending > 0:
print(f"Pending Balance: {pending / 100:.2f} {balance.currency.upper()}")
print("\nสาเหตุที่เป็นไปได้ของเงินทุนที่ pending:")
print(" • Charge ล่าสุดที่รอ settlement (1-2 วัน)")
print(" • Refund ที่กำลังประมวลผล")
print(" • Transfer ที่กำลังดำเนินการ")
print(" • Transaction ที่มีข้อพิพาทค้างอยู่")
print("\nเงินทุนเหล่านี้จะกลายเป็น available หลัง settlement")
else:
print("ไม่มีเงินทุน pending ทั้งหมด balance พร้อมใช้งาน")
การตรวจสอบ Balance
การตรวจสอบแบบเรียลไทม์
class BalanceMonitor {
constructor(thresholds) {
this.thresholds = thresholds || {
low: 100000, // 1,000 THB
critical: 50000 // 500 THB
};
}
async checkBalance() {
const balance = await omise.balance.retrieve();
const status = {
current: balance.available,
status: this.getBalanceStatus(balance.available),
alerts: []
};
if (balance.available <= this.thresholds.critical) {
status.alerts.push({
level: 'critical',
message: `Critical: Balance at ${balance.available / 100} ${balance.currency.toUpperCase()}`
});
await this.notifyCriticalBalance(balance);
} else if (balance.available <= this.thresholds.low) {
status.alerts.push({
level: 'warning',
message: `Warning: Low balance at ${balance.available / 100} ${balance.currency.toUpperCase()}`
});
await this.notifyLowBalance(balance);
}
return status;
}
getBalanceStatus(available) {
if (available <= this.thresholds.critical) return 'critical';
if (available <= this.thresholds.low) return 'low';
return 'healthy';
}
async notifyCriticalBalance(balance) {
console.log('🚨 CRITICAL: Balance very low!');
// Send urgent notification
}
async notifyLowBalance(balance) {
console.log('⚠️ WARNING: Balance is low');
// Send warning notification
}
}
// Usage
const monitor = new BalanceMonitor({
low: 100000,
critical: 50000
});
setInterval(async () => {
const status = await monitor.checkBalance();
console.log('Balance Status:', status.status);
}, 3600000); // Check every hour
กรณีการใช้งานทั่วไป
1. การตรวจสอบ Balance ก่อนการดำเนินการ
class BalanceGuard:
def __init__(self, buffer_amount=0):
self.buffer_amount = buffer_amount
def can_perform_operation(self, operation_type, amount):
"""Check if operation can be performed"""
balance = omise.Balance.retrieve()
# Calculate required amount based on operation
if operation_type == 'transfer':
# Transfer + fee
required = amount + 2500 # 25 THB fee
elif operation_type == 'refund':
required = amount
else:
required = amount
# Add buffer
required += self.buffer_amount
if balance.available < required:
return {
'allowed': False,
'reason': 'insufficient_balance',
'available': balance.available,
'required': required,
'shortfall': required - balance.available
}
return {
'allowed': True,
'available': balance.available,
'required': required,
'remaining_after': balance.available - required
}
# Usage
guard = BalanceGuard(buffer_amount=10000) # Keep 100 THB buffer
check = guard.can_perform_operation('transfer', 100000)
if check['allowed']:
print(f"✓ สามารถดำเนินการได้ จะเหลือ {check['remaining_after']/100:.2f}")
else:
print(f"✗ ไม่สามารถดำเนินการได้ ขาด {check['shortfall']/100:.2f}")
2. รายงาน Balance รายวัน
class DailyBalanceReport
def generate_report
balance = Omise::Balance.retrieve
report = {
date: Date.today.to_s,
balance: {
total: balance.total,
available: balance.available,
pending: balance.total - balance.available,
currency: balance.currency
},
formatted: format_balance(balance),
status: assess_balance_health(balance),
recommendations: get_recommendations(balance)
}
print_report(report)
save_report(report)
report
end
def format_balance(balance)
{
total: "#{balance.total / 100.0} #{balance.currency.upcase}",
available: "#{balance.available / 100.0} #{balance.currency.upcase}",
pending: "#{(balance.total - balance.available) / 100.0} #{balance.currency.upcase}"
}
end
def assess_balance_health(balance)
case balance.available
when 0..50000
'critical'
when 50001..100000
'low'
when 100001..500000
'moderate'
else
'healthy'
end
end
def get_recommendations(balance)
recommendations = []
if balance.available < 100000
recommendations << "พิจารณาเพิ่มเงินทุน"
end
pending = balance.total - balance.available
if pending > balance.available * 2
recommendations << "Pending balance สูง - ตรวจสอบ settlement"
end
recommendations
end
def print_report(report)
puts "\n#{'='*50}"
puts "รายงาน BALANCE รายวัน - #{report[:date]}"
puts "="*50
puts "Total: #{report[:formatted][:total]}"
puts "Available: #{report[:formatted][:available]}"
puts "Pending: #{report[:formatted][:pending]}"
puts "Status: #{report[:status].upcase}"
unless report[:recommendations].empty?
puts "\nคำแนะนำ:"
report[:recommendations].each { |r| puts " • #{r}" }
end
puts "="*50
end
def save_report(report)
# Save to file or database
File.open('balance_reports.log', 'a') do |f|
f.puts JSON.generate(report)
end
end
end
แนวทางปฏิบัติที่ดีที่สุด
1. ตรวจสอบ Balance ก่อนการดำเนินการเสมอ
async function safeOperation(operationType, amount) {
const balance = await omise.balance.retrieve();
// Calculate required amount
let required = amount;
if (operationType === 'transfer') {
required += 2500; // Add transfer fee
}
// Check balance
if (balance.available < required) {
throw new Error(`Insufficient balance: need ${required}, have ${balance.available}`);
}
// Proceed with operation
console.log(`✓ Sufficient balance. Proceeding with ${operationType}`);
return true;
}
2. ตรวจสอบ Balance อย่างสม่ำเสมอ
import schedule
import time
def monitor_balance():
"""Scheduled balance monitoring"""
balance = omise.Balance.retrieve()
if balance.available < 50000:
send_alert(f"Critical: Balance at {balance.available/100:.2f}")
elif balance.available < 100000:
send_notification(f"Warning: Low balance at {balance.available/100:.2f}")
# Run every hour
schedule.every().hour.do(monitor_balance)
while True:
schedule.run_pending()
time.sleep(60)
3. รักษาจำนวนเงินสำรอง
function maintainBalanceBuffer($operationAmount, $bufferAmount = 10000) {
$balance = OmiseBalance::retrieve();
$required = $operationAmount + $bufferAmount;
if ($balance['available'] < $required) {
throw new Exception("Insufficient balance including buffer");
}
echo "✓ Sufficient balance with buffer maintained\n";
return true;
}
คำถามที่พบบ่อย
ความแตกต่างระหว่าง available balance และ total balance คืออะไร?
Available balance คือจำนวนเงินที่คุณสามารถใช้ได้ทันทีสำหรับ transfer และ refund Total balance รวมทั้ง available และ pending เงินทุน (charge ที่รอ settlement, refund ที่กำลังประมวลผล ฯลฯ)
Pending balance จะกลายเป็น available ใช้เวลานานแค่ไหน?
โดยทั่วไป 1-2 วันทำการ เวลาที่แน่นอนขึ้นอยู่กับตารางเวลา settlement และประเภทของ transaction
ฉันสามารถใช้ pending balance สำหรับ transfer ได้หรือไม่?
ไม่ได้ มีเพียง available balance เท่านั้นที่สามารถใช้สำหรับ transfer และ refund เงินทุน pending ต้อง settle ก่อน
ทำไม available balance ของฉันถึงน้อยกว่าที่คาดไว้?
สาเหตุทั่วไป:
- Transfer ล่าสุดที่ถูกหักจาก balance
- Refund ที่ประมวลผลแล้ว
- Pending settlement ที่ยังไม่ cleared
- ความต้องการสำรอง (ถ้ามี)
- ข้อพิพาทที่กักเก็บเงินทุน
ฉันควรตรวจสอบ balance ของฉันบ่อยแค่ไหน?
สำหรับธุรกิจที่มี transaction ปริมาณสูง ให้ตรวจสอบก่อนการดำเนินการสำคัญแต่ละครั้ง ใช้การตรวจสอบอัตโนมัติเพื่อแจ้งเตือนเมื่อ balance ลดลงต่ำกว่าเกณฑ์