メインコンテンツへスキップ

Mobile Banking

顧客のモバイルバンキングアプリから直接決済を受け付け、シームレスなディープリンク、即時確認、完全な返金サポートを提供します。

概要

Mobile Bankingを使用すると、顧客は銀行のモバイルアプリで直接決済を承認できます。チェックアウト時に銀行を選択すると、バンキングアプリが自動的に開き、認証、承認を行い、サイトに戻ります - すべて30〜90秒以内に完了します。

主な機能:

  • 高速 - 30〜90秒の完了時間
  • 📱 モバイルファースト - シームレスなアプリ体験
  • 迅速な確認 - ほぼリアルタイムの決済検証(通常数秒以内)
  • 🔄 返金サポート - 全額および一部返金
  • 🔒 セキュア - 銀行レベルのセキュリティ
  • 💰 高額制限 - カード制限よりも高額

対応銀行

タイ 🇹🇭

銀行ユーザー数ソースタイプ返金可能決済
SCB (Siam Commercial Bank)1,200万+mobile_banking_scb✅ あり1-3日
Kasikornbank (K-Bank)1,000万+mobile_banking_kbank✅ あり1-3日
Bangkok Bank (BBL)600万+mobile_banking_bbl✅ あり1-3日
Krungsri (BAY)400万+mobile_banking_bay✅ あり1-3日
Krungthai Bank (KTB)500万+mobile_banking_ktb✅ あり1-3日

シンガポール 🇸🇬

銀行ソースタイプ返金可能決済
OCBC Bankmobile_banking_ocbc✅ あり1-3日

通貨: THB(タイ)、SGD(シンガポール) 最小金額: ฿1 / $0.01 最大金額: ฿2,000,000 / $500,000+(銀行により異なる)

Mobile Bankingの仕組み

顧客体験:

  1. リストから銀行を選択
  2. バンキングアプリが自動的に開く
  3. 未認証の場合はログイン
  4. 決済詳細を確認
  5. 生体認証/PINで確認(5秒)
  6. 確認画面を表示
  7. マーチャントサイトに戻る

合計時間: 30〜90秒

実装

ステップ1: Mobile Bankingソースを作成

const omise = require('omise')({
secretKey: 'skey_test_YOUR_SECRET_KEY'
});

// 顧客がSCBを選択
const source = await omise.sources.create({
type: 'mobile_banking_scb',
amount: 100000, // ฿1,000
currency: 'THB'
});

ステップ2: チャージを作成してリダイレクト

const charge = await omise.charges.create({
amount: 100000,
currency: 'THB',
source: source.id,
return_uri: 'https://yourdomain.com/payment/callback',
metadata: {
order_id: 'ORD-12345'
}
});

// バンキングアプリにリダイレクト
res.redirect(charge.authorize_uri);

ステップ3: 戻りとWebhookを処理

// 顧客がここに戻る
app.get('/payment/callback', async (req, res) => {
const charge = await omise.charges.retrieve(req.query.charge_id);

if (charge.status === 'successful') {
res.redirect('/success');
} else {
res.redirect('/failed');
}
});

// サーバーサイド処理用のWebhook
app.post('/webhooks/omise', (req, res) => {
const event = req.body;

if (event.key === 'charge.complete') {
const charge = event.data;
// 注文を処理
fulfillOrder(charge.metadata.order_id);
}

res.sendStatus(200);
});

完全な実装

const express = require('express');
const omise = require('omise')({
secretKey: process.env.OMISE_SECRET_KEY
});

const app = express();
app.use(express.json());

// 利用可能な銀行
const BANKS = {
scb: { name: 'SCB', type: 'mobile_banking_scb' },
kbank: { name: 'Kasikornbank', type: 'mobile_banking_kbank' },
bbl: { name: 'Bangkok Bank', type: 'mobile_banking_bbl' },
bay: { name: 'Krungsri', type: 'mobile_banking_bay' },
ktb: { name: 'Krungthai', type: 'mobile_banking_ktb' }
};

// 決済を作成
app.post('/checkout/mobile-banking', async (req, res) => {
try {
const { bank_code, amount, order_id } = req.body;
const bank = BANKS[bank_code];

if (!bank) {
return res.status(400).json({ error: 'Invalid bank' });
}

// ソースを作成
const source = await omise.sources.create({
type: bank.type,
amount: amount,
currency: 'THB'
});

// チャージを作成
const charge = await omise.charges.create({
amount: amount,
currency: 'THB',
source: source.id,
return_uri: `${process.env.BASE_URL}/payment/callback`,
metadata: { order_id }
});

res.json({
authorize_uri: charge.authorize_uri,
charge_id: charge.id
});

} catch (error) {
res.status(500).json({ error: error.message });
}
});

app.listen(3000);

銀行選択UI

<div class="mobile-banking-selector">
<h3>เลือกธนาคาร (銀行を選択)</h3>

<div class="bank-grid">
<button class="bank-button" data-bank="scb">
<img src="/banks/scb.svg" alt="SCB">
<span>SCB</span>
</button>

<button class="bank-button" data-bank="kbank">
<img src="/banks/kbank.svg" alt="Kasikornbank">
<span>Kasikornbank</span>
</button>

<button class="bank-button" data-bank="bbl">
<img src="/banks/bbl.svg" alt="Bangkok Bank">
<span>Bangkok Bank</span>
</button>

<button class="bank-button" data-bank="bay">
<img src="/banks/bay.svg" alt="Krungsri">
<span>Krungsri</span>
</button>

<button class="bank-button" data-bank="ktb">
<img src="/banks/ktb.svg" alt="Krungthai">
<span>Krungthai</span>
</button>
</div>
</div>

<style>
.bank-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
gap: 16px;
margin-top: 20px;
}

.bank-button {
display: flex;
flex-direction: column;
align-items: center;
padding: 20px;
border: 2px solid #e0e0e0;
border-radius: 12px;
background: white;
cursor: pointer;
transition: all 0.2s;
}

.bank-button:hover {
border-color: #1890ff;
box-shadow: 0 4px 12px rgba(0,0,0,0.1);
}

.bank-button img {
width: 60px;
height: 60px;
margin-bottom: 12px;
}
</style>

<script>
document.querySelectorAll('.bank-button').forEach(button => {
button.addEventListener('click', async () => {
const bankCode = button.dataset.bank;

const response = await fetch('/checkout/mobile-banking', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
bank_code: bankCode,
amount: 100000,
order_id: 'ORD-12345'
})
});

const data = await response.json();
window.location = data.authorize_uri;
});
});
</script>

返金サポート

すべてのモバイルバンキング決済は、全額および一部返金をサポートしています:

// 全額返金
const refund = await omise.charges.refund('chrg_test_...', {
amount: 100000
});

// 一部返金
const partialRefund = await omise.charges.refund('chrg_test_...', {
amount: 50000
});

ベストプラクティス

1. モバイル専用検出

function isMobileDevice() {
return /iPhone|iPad|iPod|Android/i.test(navigator.userAgent);
}

if (!isMobileDevice()) {
showMessage('モバイルバンキングにはモバイルデバイスが必要です。');
showAlternativePaymentMethods();
}

2. 銀行ロゴアセット

公式の銀行ロゴを使用(60x60pxまたは120x120px):

  • SCB: 紫色のロゴ
  • Kasikornbank: 緑色の「K」ロゴ
  • Bangkok Bank: 青色のロゴ
  • Krungsri: 黄色のロゴ
  • Krungthai: 青/赤のロゴ

3. 手順を表示

<div class="instructions">
<h4>วิธีชำระเงิน (支払い方法):</h4>
<ol>
<li>เลือกธนาคารของคุณ (銀行を選択)</li>
<li>แอพธนาคารจะเปิดอัตโนมัติ (バンキングアプリが自動的に開く)</li>
<li>ยืนยันการชำระเงิน (決済を確認)</li>
<li>กลับมาที่หน้าเว็บ (ウェブサイトに戻る)</li>
</ol>
</div>

4. ディープリンク失敗の処理

function openBankingApp(authorizeUri) {
window.location = authorizeUri;

// アプリが開かない場合のフォールバック
setTimeout(() => {
if (!document.hidden) {
showMessage('แอพธนาคารไม่เปิด? ลองอัปเดทแอพหรือติดตั้งใหม่');
showAlternatives();
}
}, 3000);
}

5. タイムアウト処理

// モバイルバンキングは10分後に期限切れ
const TIMEOUT = 10 * 60 * 1000;

setTimeout(() => {
if (!paymentCompleted) {
showMessage('決済が期限切れになりました。もう一度お試しください。');
}
}, TIMEOUT);

よくある問題

問題: バンキングアプリが開かない

原因: アプリがインストールされていないか、古いバージョン

解決策:

  • アプリダウンロードリンクを表示
  • インターネットバンキングの代替案を提供
  • 明確なエラーメッセージを表示

問題: 決済タイムアウト

原因: 顧客が10分以内に完了しなかった

解決策:

  • 明確なタイムアウトメッセージを表示
  • 新しいチャージで再試行を許可
  • 期限切れのチャージを再利用しない

問題: 間違った銀行口座

原因: 顧客が複数の口座を持っている

解決策:

  • 顧客がバンキングアプリで口座を選択
  • マーチャント側から制御不可
  • リダイレクト前に銀行名を明確に表示

FAQ

モバイルバンキング決済とは何ですか?

モバイルバンキング決済により、顧客は銀行のモバイルアプリで直接決済を承認できます。アプリが自動的に開き、顧客が認証し、承認します - すべて30〜90秒で完了します。

どの銀行がサポートされていますか?

タイ: SCB、Kasikornbank、Bangkok Bank、Krungsri、Krungthai シンガポール: OCBC

さらに多くの銀行が近日公開予定です。

デスクトップで動作しますか?

いいえ、モバイルバンキングには銀行のモバイルアプリが必要です。デスクトップユーザーには以下を提供してください:

  • インターネットバンキング
  • QR決済
  • クレジットカード
モバイルバンキング決済を返金できますか?

はい!モバイルバンキングは、インターネットバンキングとは異なり、全額および一部返金をサポートしています。

決済にはどのくらい時間がかかりますか?

決済タイミングは契約により異なります*、加盟店契約と銀行によって異なります。

取引制限は何ですか?

制限は銀行と顧客の口座タイプによって異なります:

  • 最小: ฿1(THB)
  • 最大: 1取引あたり฿2,000,000+

クレジットカードの制限よりもはるかに高額です。

*決済タイミングは、加盟店契約と決済方法によって異なります。具体的な決済スケジュールについては、Omise加盟店ダッシュボードをご確認ください。

関連リソース

次のステップ

  1. 対象銀行を選択
  2. 銀行選択UIを実装
  3. 選択した銀行でソースを作成
  4. リダイレクトとWebhookを処理
  5. 実際のモバイルデバイスでテスト
  6. 本番環境に移行

統合の準備はできましたか? 銀行を選択してください: