GCash
フィリピンNo.1デジタルウォレットGCashから支払いを受け付けます。8600万人以上のユーザーを持ち、同国で最も広く利用されているキャッシュレス決済手段です。
概要
ユーザー統計
ユーザー数は概算であり、公開されている情報に基づいています。実際のアクティブユーザー数は異なる場合があります。
GCashはフィリピンで主要なモバイルウォレットで、Mynt(Globe Fintech Innovations)が運営しています。フィリピン人にとって、請求書の支払いや送金からeコマースやピアツーピア送金まで、あらゆる用途で利用される決済手段です。
主な特徴:
- ✅ 市場リーダー - フィリピン全土で8600万人以上のユーザー
- ✅ 迅速な確認 - ほぼリアルタイムの支払い確認(通常数秒以内)
- ✅ 高い信頼性 - Globe TelecomとAnt Groupの支援
- ✅ 広範な採用 - オンラインショッパーの60%以上が利用
- ✅ 多用途 - 請求書、ショッピング、送金、投資
- ✅ 低摩擦 - 迅速なMPIN認証
サポート地域
| 地域 | 通貨 | 最小金額 | 最大金額 | APIバージョン |
|---|---|---|---|---|
| Philippines | PHP | ₱1.00 | ₱100,000.00 | 2017-11-02 |
確認レベル別のアカウント制限
| 確認レベル | ウォレット制限 | 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 | 無制限 |
仕組み
顧客体験:
- 顧客がチェックアウトでGCashを選択
- GCash認証ページにリダイレクト
- GCashアプリが自動的に開く(モバイルでのディープリンク)
- 顧客が支払い詳細を確認
- 4桁のMPINを入力して確認
- 加盟店サイトに戻る
- GCashからSMS確認を受信
一般的な完了時間: 30〜60秒
支払いフローの例
モバイル支払いフロー:

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

デスクトップ用のQRコードスキャン:
- ❶ GCashを選択 - 顧客がデスクトップでGCash支払いを選択
- ❷ QR生成 - システムが一意のGCash支払いQRコードを作成
- ❸ QR表示 - 支払い詳細とともに画面にQRコードが表示される
- ❹ GCashアプリを開く - 顧客がモバイルデバイスでGCashを起動
- ❺ QRスキャン - アプリ内スキャナーを使用してQRコードをキャプチャ
- ❻ 詳細を確認 - 支払い金額と加盟店名が表示される
- ❼ MPINを入力 - 4桁のモバイルPINで認証
- ❽ 確認 - タップして支払いを承認
- ❾ 成功 - デスクトップに確認が表示され、支払い完了
実装
ステップ1: GCashソースを作成
- cURL
- Node.js
- PHP
- Python
- Ruby
- Go
curl https://api.omise.co/sources \
-u skey_test_YOUR_SECRET_KEY: \
-d "type=gcash" \
-d "amount=50000" \
-d "currency=PHP"
const omise = require('omise')({
secretKey: 'skey_test_YOUR_SECRET_KEY'
});
const source = await omise.sources.create({
type: 'gcash',
amount: 50000, // ₱500.00
currency: 'PHP'
});
console.log('GCash source:', source.id);
<?php
$source = OmiseSource::create(array(
'type' => 'gcash',
'amount' => 50000,
'currency' => 'PHP'
));
?>
import omise
omise.api_secret = 'skey_test_YOUR_SECRET_KEY'
source = omise.Source.create(
type='gcash',
amount=50000,
currency='PHP'
)
require 'omise'
Omise.api_key = 'skey_test_YOUR_SECRET_KEY'
source = Omise::Source.create({
type: 'gcash',
amount: 50000,
currency: 'PHP'
})
source, err := client.Sources().Create(&operations.CreateSource{
Type: "gcash",
Amount: 50000,
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ウォレットに処理されます。