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

GCash

フィリピンNo.1デジタルウォレットGCashから支払いを受け付けます。8600万人以上のユーザーを持ち、同国で最も広く利用されているキャッシュレス決済手段です。

概要

ユーザー統計

ユーザー数は概算であり、公開されている情報に基づいています。実際のアクティブユーザー数は異なる場合があります。

GCashはフィリピンで主要なモバイルウォレットで、Mynt(Globe Fintech Innovations)が運営しています。フィリピン人にとって、請求書の支払いや送金からeコマースやピアツーピア送金まで、あらゆる用途で利用される決済手段です。

主な特徴:

  • 市場リーダー - フィリピン全土で8600万人以上のユーザー
  • 迅速な確認 - ほぼリアルタイムの支払い確認(通常数秒以内)
  • 高い信頼性 - Globe TelecomとAnt Groupの支援
  • 広範な採用 - オンラインショッパーの60%以上が利用
  • 多用途 - 請求書、ショッピング、送金、投資
  • 低摩擦 - 迅速なMPIN認証

サポート地域

地域通貨最小金額最大金額月次制限
フィリピンPHP₱1.00₱100,000可変*

*月次制限は顧客のGCashアカウント確認レベルによって異なります

確認レベル別のアカウント制限

確認レベルウォレット制限1取引あたり月次制限
未確認₱100,000₱8,000₱100,000
半確認済み (電話 + ID)₱100,000₱50,000₱100,000
完全確認済み (KYC完了)₱500,000₱100,000₱500,000
GSave/GInvest (銀行機能)無制限₱100,000無制限

仕組み

顧客体験:

  1. 顧客がチェックアウトでGCashを選択
  2. GCash認証ページにリダイレクト
  3. GCashアプリが自動的に開く(モバイルでのディープリンク)
  4. 顧客が支払い詳細を確認
  5. 4桁のMPINを入力して確認
  6. 加盟店サイトに戻る
  7. GCashからSMS確認を受信

一般的な完了時間: 30〜60秒

支払いフローの例

モバイル支払いフロー:

Mobile Payment Flow

シームレスなモバイルウォレット体験:

  • ❶ GCashを選択 - 顧客がモバイルチェックアウトでGCashをタップ
  • ❷ アプリリダイレクト - ディープリンクが自動的にGCashアプリを開く
  • ❸ 支払いを確認 - 取引詳細が表示される(加盟店、金額)
  • ❹ 認証 - 4桁のMPINを入力して承認
  • ❺ 支払い処理 - GCashウォレットから資金が引き落とされる
  • ❻ SMS確認 - 取引確認テキストを受信
  • ❼ 加盟店に戻る - 加盟店の成功ページにリダイレクト

デスクトップ支払いフロー:

Desktop Payment Flow

デスクトップ用のQRコードスキャン:

  • ❶ GCashを選択 - 顧客がデスクトップでGCash支払いを選択
  • ❷ QR生成 - システムが一意のGCash支払いQRコードを作成
  • ❸ QR表示 - 支払い詳細とともに画面にQRコードが表示される
  • ❹ GCashアプリを開く - 顧客がモバイルデバイスでGCashを起動
  • ❺ QRスキャン - アプリ内スキャナーを使用してQRコードをキャプチャ
  • ❻ 詳細を確認 - 支払い金額と加盟店名が表示される
  • ❼ MPINを入力 - 4桁のモバイルPINで認証
  • ❽ 確認 - タップして支払いを承認
  • ❾ 成功 - デスクトップに確認が表示され、支払い完了

実装

ステップ1: GCashソースを作成

curl https://api.omise.co/sources \
-u skey_test_YOUR_SECRET_KEY: \
-d "type=gcash" \
-d "amount=50000" \
-d "currency=PHP"

レスポンス:

{
"object": "source",
"id": "src_test_5rt6s9vah5lkvi1rh9c",
"type": "gcash",
"flow": "redirect",
"amount": 50000,
"currency": "PHP"
}

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

app.post('/checkout/gcash', async (req, res) => {
try {
const { amount, order_id, customer_email, customer_mobile } = req.body;

// 金額を検証
if (amount < 100) { // ₱1.00最小
return res.status(400).json({
error: 'Minimum amount is ₱1.00'
});
}

if (amount > 10000000) { // ₱100,000最大
return res.status(400).json({
error: 'Maximum amount is ₱100,000'
});
}

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

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

// GCashにリダイレクト
res.redirect(charge.authorize_uri);

} catch (error) {
console.error('GCash error:', error);
res.status(500).json({ error: error.message });
}
});

ステップ3: リターンコールバックを処理

app.get('/payment/callback', async (req, res) => {
try {
const chargeId = req.query.charge_id;
const charge = await omise.charges.retrieve(chargeId);

if (charge.status === 'successful') {
await processOrder(charge.metadata.order_id);
res.redirect(`/order-success?order=${charge.metadata.order_id}`);
} else if (charge.status === 'failed') {
res.redirect(`/payment-failed?reason=${charge.failure_message}`);
} else {
res.redirect('/payment-pending');
}
} catch (error) {
res.redirect('/payment-error');
}
});

ステップ4: Webhookを処理

app.post('/webhooks/omise', async (req, res) => {
const event = req.body;

if (event.key === 'charge.complete') {
const charge = event.data;

if (charge.source.type === 'gcash') {
if (charge.status === 'successful') {
await fulfillOrder(charge.metadata.order_id);
await sendSMSConfirmation(charge.metadata.customer_mobile);
} else if (charge.status === 'failed') {
await handleFailedPayment(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());

// GCash設定
const GCASH_CONFIG = {
currency: 'PHP',
minAmount: 100, // ₱1.00
maxAmount: 10000000, // ₱100,000
displayName: 'GCash',
timeout: 15 * 60 * 1000 // 15分
};

// GCash支払いを作成
app.post('/checkout/gcash', async (req, res) => {
try {
const { amount, order_id, customer_email, customer_mobile, customer_name } = req.body;

// 通貨を検証
if (req.body.currency && req.body.currency !== 'PHP') {
return res.status(400).json({
error: 'GCash only supports PHP currency'
});
}

// 金額を検証
if (amount < GCASH_CONFIG.minAmount) {
return res.status(400).json({
error: `Minimum amount is ₱${GCASH_CONFIG.minAmount / 100}`
});
}

if (amount > GCASH_CONFIG.maxAmount) {
return res.status(400).json({
error: `Maximum amount is ₱${GCASH_CONFIG.maxAmount / 100}`
});
}

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

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

// トラッキングのためにログ記録
console.log(`GCash payment initiated: ${charge.id} for order ${order_id}`);

// 認証URLを返す
res.json({
authorize_uri: charge.authorize_uri,
charge_id: charge.id
});

} catch (error) {
console.error('GCash error:', error);
res.status(500).json({ error: error.message });
}
});

// 支払いコールバック
app.get('/payment/callback', async (req, res) => {
try {
const charge = await omise.charges.retrieve(req.query.charge_id);

if (charge.status === 'successful') {
res.redirect(`/order-confirmation?order=${charge.metadata.order_id}`);
} else {
res.redirect(`/payment-failed?charge=${req.query.charge_id}`);
}
} catch (error) {
res.redirect('/payment-error');
}
});

// Webhookハンドラ
app.post('/webhooks/omise', async (req, res) => {
const event = req.body;

if (event.key === 'charge.complete' && event.data.source.type === 'gcash') {
const charge = event.data;

if (charge.status === 'successful') {
await fulfillOrder(charge.metadata.order_id);
await sendReceipt(charge.metadata.customer_email, charge);
console.log(`GCash payment successful: ${charge.id}`);
} else {
await cancelOrder(charge.metadata.order_id);
console.log(`GCash payment failed: ${charge.id}`);
}
}

res.sendStatus(200);
});

app.listen(3000);

返金サポート

GCashは180日以内全額および一部返金をサポートします:

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

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

console.log('Refund status:', fullRefund.status);
返金処理

返金は5〜7営業日以内に顧客のGCashウォレットに処理されます。

一般的な問題とトラブルシューティング

問題: 顧客がGCashアプリを持っていない

原因: 顧客がGCashを選択したがアプリがインストールされていない

解決策:

// アプリ要件とダウンロードリンクを表示
function checkGCashApp() {
const isMobile = /iPhone|iPad|iPod|Android/i.test(navigator.userAgent);

if (!isMobile) {
alert('GCash is only available on mobile devices.');
return false;
}

// アプリリンクを表示
const isAndroid = /Android/i.test(navigator.userAgent);
const appLink = isAndroid
? 'https://play.google.com/store/apps/details?id=com.globe.gcash.android'
: 'https://apps.apple.com/ph/app/gcash/id520020791';

showMessage(`GCash app required. <a href="${appLink}">Download here</a>`);
return true;
}

問題: 残高不足

エラー: 支払い拒否 - 資金不足

解決策:

if (charge.failure_code === 'insufficient_balance') {
showMessage(
'Kulang ang GCash balance. Mag-cash in muna o gumamit ng ibang payment method.'
);
showCashInOptions();
}

問題: 取引制限超過

エラー: 取引がアカウント制限を超えています

解決策:

if (charge.failure_code === 'transaction_limit_exceeded') {
showMessage(
'Lumampas sa limit ng iyong GCash account. ' +
'I-verify ang account o gumamit ng ibang payment method.'
);
showVerificationLink();
}

問題: 支払いタイムアウト

原因: 顧客が15分以内に支払いを完了しなかった

解決策:

const TIMEOUT = 15 * 60 * 1000;

setTimeout(() => {
if (!paymentCompleted) {
showMessage('Nag-timeout ang payment. Subukan ulit.');
enableRetry();
}
}, TIMEOUT);

ベストプラクティス

1. フィリピノ語/タガログ語で表示

<div class="gcash-payment">
<h3>Magbayad gamit ang GCash</h3>
<div class="instructions">
<ol>
<li>Siguruhing nakainstall ang GCash app</li>
<li>May sapat na balance sa GCash wallet</li>
<li>Ide-redirect ka sa GCash app</li>
<li>I-enter ang iyong 4-digit MPIN</li>
</ol>
</div>
<p class="help-text">
Wala pang GCash?
<a href="https://www.gcash.com" target="_blank">Mag-register dito</a>
</p>
</div>

2. モバイル専用検出

function validateGCashPayment() {
const userAgent = navigator.userAgent;
const isMobile = /Android|iPhone|iPad|iPod/i.test(userAgent);

if (!isMobile) {
return {
valid: false,
message: 'GCash ay available lang sa mobile devices'
};
}

return { valid: true };
}

3. ディープリンクの処理

function openGCashApp(authorizeUri) {
// GCashにリダイレクト
window.location = authorizeUri;

// アプリが開かない場合のフォールバック
setTimeout(() => {
if (!document.hidden) {
showInstallPrompt();
}
}, 2500);
}

function showInstallPrompt() {
const isAndroid = /Android/i.test(navigator.userAgent);
const downloadUrl = isAndroid
? 'https://play.google.com/store/apps/details?id=com.globe.gcash.android'
: 'https://apps.apple.com/ph/app/gcash/id520020791';

if (confirm('GCash app hindi nakainstall. I-download ngayon?')) {
window.location = downloadUrl;
}
}

4. 金額のフォーマット

function formatPHP(amount) {
return new Intl.NumberFormat('en-PH', {
style: 'currency',
currency: 'PHP',
minimumFractionDigits: 2,
maximumFractionDigits: 2
}).format(amount / 100);
}

// 使用法
const displayAmount = formatPHP(50000); // "₱500.00"

5. キャッシュインオプションを表示

<div class="gcash-cash-in">
<h4>Paano mag-cash in sa GCash:</h4>
<ul>
<li><strong>Bank Transfer</strong> - BPI, BDO, UnionBank, etc.</li>
<li><strong>7-Eleven</strong> - CLiQQ Kiosk</li>
<li><strong>Remittance</strong> - Cebuana, M Lhuillier, Palawan</li>
<li><strong>Online Banking</strong> - Instapay, PESONet</li>
<li><strong>GCash Padala</strong> - Bayad Centers nationwide</li>
</ul>
</div>

テスト

テスト認証情報

Omiseテストモード認証情報を使用:

  • Secret Key: skey_test_YOUR_SECRET_KEY
  • Public Key: pkey_test_YOUR_PUBLIC_KEY

テスト金額

金額 (PHP)期待される結果
100 - 99999Success
100000Insufficient balance
100001Transaction declined

テストフロー

  1. テスト認証情報でチャージを作成
  2. 上記のテスト金額を使用
  3. GCashテスト環境で支払いを完了
  4. Webhookを受信したことを確認
  5. チャージステータスを確認

FAQ

GCashとは何ですか?

GCashはフィリピンの主要なモバイルウォレットで、8600万人以上のユーザーを持っています。Mynt(Globe Fintech Innovations)が運営し、フィリピンで最も広く使用されているキャッシュレス決済手段です。

顧客はGCashアカウントが必要ですか?

はい、顧客はGCashモバイルアプリがインストールされ、携帯電話番号にリンクされたアクティブなGCashアカウントが必要です。

取引制限は何ですか?
  • 最小: ₱1.00
  • 最大: 取引あたり₱100,000

制限は顧客のアカウント確認レベル(未確認、半確認済み、完全確認済み)によっても異なります。

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

GCashの決済は通常1〜3営業日以内に行われます。具体的な決済スケジュールについてはOmiseダッシュボードをご確認ください。

GCash支払いを返金できますか?

はい、GCashは元の取引の180日以内に全額および一部返金をサポートします。

顧客の残高が不足している場合はどうなりますか?

支払いは拒否されます。顧客は次の方法でGCashウォレットにチャージできます:

  • 銀行振込(BPI、BDO、UnionBankなど)
  • 7-Eleven CLiQQキオスク
  • 送金センター(Cebuana、M Lhuillier、Palawan)
  • オンラインバンキング(Instapay、PESONet)
  • 全国のGCash Padalаセンター
GCashはデスクトップで動作しますか?

いいえ、GCashにはモバイルアプリが必要で、モバイル専用です。デスクトップユーザーにはクレジットカードやオンラインバンキングなどの代替決済手段を表示する必要があります。

フィリピノ語/タガログ語で指示を表示する必要がありますか?

はい!GCashはフィリピン専用なので、フィリピノ語またはタガログ語で指示を表示すると、ユーザーエクスペリエンスとコンバージョン率が大幅に向上します。

テスト

テストモード

GCashはテストAPIキーを使用してテストできます。テストモードでは:

テスト認証情報:

  • テストAPIキーを使用 (skey_test_xxx)
  • 通貨: PHP(フィリピンペソ)
  • テストに実際のGCashアカウントは不要

テストフロー:

  1. テストAPIキーでソースとチャージを作成
  2. 顧客がテストauthorize_uriにリダイレクト
  3. テストページがGCash認証をシミュレート
  4. Omiseダッシュボードのアクションを使用してチャージを成功/失敗としてマーク
  5. WebhookとReturn_uriの処理を確認

テスト実装:

// GCash支払いをテスト
const source = await omise.sources.create({
type: 'gcash',
amount: 10000, // ₱100.00
currency: 'PHP'
});

const charge = await omise.charges.create({
amount: 10000,
currency: 'PHP',
source: source.id,
return_uri: 'https://example.com/callback'
});

console.log('Test authorize URL:', charge.authorize_uri);

テストシナリオ:

  • 支払い成功: 注文履行ワークフローを確認
  • 支払い失敗: エラー処理をテスト
  • 金額制限: 最小および最大金額をテスト
  • モバイルフロー: GCashアプリへのディープリンクをテスト
  • 残高不足: 低ウォレット残高をシミュレート
  • タイムアウト: 放棄された支払いシナリオをテスト
  • Webhook配信: すべてのWebhook通知を確認

重要な注意事項:

  • テストモードは実際のGCashサーバーに接続しません
  • ダッシュボードを使用して支払い結果をシミュレート
  • モバイルアプリフローを徹底的にテスト
  • すべてのチャージステータスのWebhook処理を確認
  • PHP通貨の金額検証をテスト

包括的なテストガイドラインについては、テストドキュメントを参照してください。

関連リソース

次のステップ

  1. GCashソースを作成
  2. リダイレクトフローを実装
  3. リターンコールバックを処理
  4. Webhookを設定
  5. 支払いフローをテスト
  6. 本番稼働