デジタルウォレット
東南アジアで最も人気のあるデジタルウォレットからの支払いを受け付け、タイ、シンガポール、マレーシア、フィリピンなどの数百万人の顧客にリーチします。
概要
デジタルウォレット(e-wallet)は、顧客がスマートフォンアプリを使用して支払いを行うことができるモバイル決済方法です。これらのウォレットは東南アジアで非常に人気があり、モバイルファーストの消費者の間で高い普及率を誇ります。
デジタルウォレットを選ぶ理由
- 🚀 成長市場 - 東南アジアの消費者の60%以上がe-walletを定期的に使用
- ⚡ 即時確認 - リアルタイムの支払い検証
- 📱 モバイルファースト - スマートフォンユーザー に最適化
- 🔒 安全 - 加盟店にカード情報を共有しない
- 💰 低摩擦 - ワンタップチェックアウト体験
- 🌏 地域リーチ - 現地の支払い選好にアクセス
サポートされているデジタルウォレット
タイ 🇹🇭
| ウォレット | ユーザー | 通貨 | 返金可能 | 決済 |
|---|---|---|---|---|
| TrueMoney ウォレット | 3000万人以上 | THB | ✅ はい | 1-3日 |
| Rabbit LINE Pay | 1200万人以上 | THB | ✅ はい | 1-3日 |
| ShopeePay | 800万人以上 | THB, SGD, MYR | ✅ はい | 1-3日 |
シンガポール 🇸🇬
| ウォレット | ユーザー | 通貨 | 返金可能 | 決済 |
|---|---|---|---|---|
| GrabPay | 1億8700万人以上 | SGD, MYR, THB | ✅ はい | 1-3日 |
| ShopeePay | 800万人以上 | SGD, THB, MYR | ✅ はい | 1-3日 |
マレーシア 🇲🇾
| ウォレット | ユーザー | 通貨 | 返金可能 | 決済 |
|---|---|---|---|---|
| Touch 'n Go eWallet | 1800万人以上 | MYR | ✅ はい | 1-3日 |
| Boost | 900万人以上 | MYR | ✅ はい | 1-3日 |
| GrabPay | 1億8700万人以上 | MYR, SGD, THB | ✅ はい | 1-3日 |
| ShopeePay | 800万人以上 | MYR, SGD, THB | ✅ はい | 1-3日 |
インドネシア 🇮🇩
| ウォレット | ユーザー | 通貨 | 返金可能 | 決済 |
|---|---|---|---|---|
| DANA | 1億5000万人以上 | IDR | ✅ はい | 1-3日 |
| ShopeePay | 800万人以上 | IDR | ✅ はい | 1-3日 |
フィリピン 🇵🇭
| ウォレット | ユーザー | 通貨 | 返金可能 | 決済 |
|---|---|---|---|---|
| GCash | 8600万人以上 | PHP | ✅ はい | 1-3日 |
韓国 🇰🇷
| ウォレット | ユーザー | 通貨 | 返金可能 | 決済 |
|---|---|---|---|---|
| KakaoPay | 3000万人以上 | KRW | ✅ はい | 1-3日 |
日本 🇯🇵
| ウォレット | ユーザー | 通貨 | 返金可能 | 決済 |
|---|---|---|---|---|
| PayPay | 6000万人以上 | JPY | ✅ はい | 1-3日 |
中国 🇨🇳
| ウォレット | ユーザー | 通貨 | 返金可能 | 決済 |
|---|---|---|---|---|
| Alipay | 10億人以上 | CNY, 複数 | ✅ はい | 1-3日 |
| Alipay+ | 13億人以上 | 複数 | ✅ はい | 1-3日 |
| WeChat Pay | 13億人以上 | CNY | ✅ はい | 1-3日 |
デジタルウォレットの仕組み
一般的なフロー:
- 顧客がチェックアウト時に希望するウォレットを選択
- 加盟店がOmise APIを介してsourceとchargeを作成
- 顧客がウォレット認証ページにredirect
- ウォレットアプリが開く(モバイルでdeep link経由)
- 顧客が認証して支払いを確認
- 支払いが即座に処理される
- 顧客が加盟店サイトに戻る
- 加盟店がwebhook通知を受信
平均完了時間: 1-3分
実装の概要
基本的な統合
- Node.js
- PHP
- Python
- Ruby
const omise = require('omise')({
secretKey: 'skey_test_YOUR_SECRET_KEY'
});
// Create source for wallet payment
const source = await omise.sources.create({
type: 'grabpay', // or truemoney, shopeepay, etc.
amount: 50000, // Amount in smallest currency unit
currency: 'THB' // THB, SGD, MYR, etc.
});
// Create charge
const charge = await omise.charges.create({
amount: 50000,
currency: 'THB',
source: source.id,
return_uri: 'https://yourdomain.com/payment/callback'
});
// Redirect customer to wallet
res.redirect(charge.authorize_uri);
<?php
// Create source
$source = OmiseSource::create(array(
'type' => 'grabpay',
'amount' => 50000,
'currency' => 'THB'
));
// Create charge
$charge = OmiseCharge::create(array(
'amount' => 50000,
'currency' => 'THB',
'source' => $source['id'],
'return_uri' => 'https://yourdomain.com/payment/callback'
));
// Redirect to wallet
header('Location: ' . $charge['authorize_uri']);
?>
import omise
omise.api_secret = 'skey_test_YOUR_SECRET_KEY'
# Create source
source = omise.Source.create(
type='grabpay',
amount=50000,
currency='THB'
)
# Create charge
charge = omise.Charge.create(
amount=50000,
currency='THB',
source=source.id,
return_uri='https://yourdomain.com/payment/callback'
)
# Redirect to wallet
return redirect(charge.authorize_uri)
require 'omise'
Omise.api_key = 'skey_test_YOUR_SECRET_KEY'
# Create source
source = Omise::Source.create({
type: 'grabpay',
amount: 50000,
currency: 'THB'
})
# Create charge
charge = Omise::Charge.create({
amount: 50000,
currency: 'THB',
source: source.id,
return_uri: 'https://yourdomain.com/payment/callback'
})
# Redirect to wallet
redirect_to charge.authorize_uri
returnとwebhookの処理
// Handle return from wallet
app.get('/payment/callback', async (req, res) => {
const charge = await omise.charges.retrieve(req.query.charge_id);
if (charge.status === 'successful') {
res.redirect('/payment-success');
} else {
res.redirect('/payment-failed');
}
});
// Handle webhook (recommended)
app.post('/webhooks/omise', (req, res) => {
const event = req.body;
if (event.key === 'charge.complete') {
const charge = event.data;
if (charge.status === 'successful') {
// Process order
fulfillOrder(charge.metadata.order_id);
}
}
res.sendStatus(200);
});
比較マトリックス
| 機能 | GrabPay | TrueMoney | ShopeePay | Touch 'n Go | Boost | DANA | GCash |
|---|---|---|---|---|---|---|---|
| 地域 | SG/MY/TH | TH | 複数 | MY | MY | ID | PH |
| ユーザー | 1億8700万人以上 | 3000万人以上 | 800万人以上 | 1800万人以上 | 900万人以上 | 1億5000万人以上 | 8600万人以上 |
| 即時 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| モバイルのみ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| 返金 | 全額/部分 | 全額/部分 | 全額/部分 | 全額/部分 | 全額/部分 | 全額/部分 | 全額/部分 |
| 返金期間 | 30日 | 30日 | 30日 | 30日 | 30日 | 30日 | 30日 |
適切なウォレットの選択
市場別
タイ
- プライマリ: TrueMoney(最高の普及率)
- セカンダリ: Rabbit LINE Pay、ShopeePay
- ユースケース: すべてのeコマース、サービス
シンガポール
- プライマリ: GrabPay(配車サービスユーザー)
- セカンダリ: ShopeePay(eコマース)
- ユースケース: フードデリバリー、交通、ショッピング
マレーシア
- プライマリ: Touch 'n Go(最大のユーザーベース)
- セカンダリ: Boost、GrabPay
- ユースケース: 交通、駐車場、小売
インドネシア
- プライマリ: DANA(最大のウォレット)
- セカンダリ: ShopeePay
- ユースケース: eコマース、配車サービス、サービス
フィリピン
- プライマリ: GCash(支配的なプレーヤー)
- ユースケース: 請求書、送金、eコマース
日本
- プライマリ: PayPay(6000万人以上のユーザー)
- ユースケース: 小売、レストラン、サービス
韓国
- プライマリ: KakaoPay(Kakaoエコシステム)
- ユースケース: メッセージングプラットフォーム統合
ユースケース別
eコマース
- TrueMoney、ShopeePay、Touch 'n Go、DANA、GCash
フードデリバリー
- GrabPay、ShopeePay、TrueMoney
交通
- GrabPay、Touch 'n Go、TrueMoney
デジタルサービス
- すべてのウォレットに適している
観光と中国の顧客
- Alipay、WeChat Pay、Alipay+
一般的な実装パターン
マルチウォレットチェックアウト
// Display available wallets based on currency
function getAvailableWallets(currency, country) {
const wallets = {
'THB': ['truemoney', 'rabbit_linepay', 'shopeepay'],
'SGD': ['grabpay', 'shopeepay'],
'MYR': ['touch_n_go', 'boost', 'grabpay', 'shopeepay'],
'IDR': ['dana', 'shopeepay'],
'PHP': ['gcash'],
'JPY': ['paypay'],
'KRW': ['kakaopay']
};
return wallets[currency] || [];
}
// Create payment with selected wallet
async function createWalletPayment(walletType, amount, currency) {
const source = await omise.sources.create({
type: walletType,
amount: amount,
currency: currency
});
const charge = await omise.charges.create({
amount: amount,
currency: currency,
source: source.id,
return_uri: `${baseUrl}/payment/callback`
});
return charge.authorize_uri;
}
モバイル検出
// Check if user is on mobile
function isMobileDevice() {
return /iPhone|iPad|iPod|Android/i.test(navigator.userAgent);
}
// Show wallet options based on device
if (!isMobileDevice()) {
// Hide mobile-only wallets
document.querySelectorAll('.mobile-wallet').forEach(el => {
el.style.display = 'none';
});
}
金額の検証
// Validate amount for each wallet
const WALLET_LIMITS = {
grabpay: {
SGD: { min: 50, max: 50000 },
MYR: { min: 100, max: 150000 },
THB: { min: 2000, max: 5000000 }
},
truemoney: {
THB: { min: 2000, max: 5000000 }
},
shopeepay: {
THB: { min: 100, max: 5000000 },
SGD: { min: 10, max: 100000 },
MYR: { min: 100, max: 100000 }
}
// ... more wallets
};
function validateWalletAmount(walletType, amount, currency) {
const limits = WALLET_LIMITS[walletType]?.[currency];
if (!limits) {
return { valid: false, error: 'Wallet not available for currency' };
}
if (amount < limits.min) {
return { valid: false, error: `Minimum amount is ${limits.min}` };
}
if (amount > limits.max) {
return { valid: false, error: `Maximum amount is ${limits.max}` };
}
return { valid: true };
}