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

Alipay+

単一のAlipay+統合により、アジア太平洋地域で13億人以上の登録アカウントを持つ12以上のパートナーウォレットからの支払いを受け付けます。

概要

Alipay+は、アジア太平洋地域の複数の電子ウォレットを接続するAnt Groupのクロスボーダーデジタル決済およびマーケティングソリューションです。1つの統合で、GCash(フィリピン)、KakaoPay(韓国)、Touch 'n Go eWallet(マレーシア)、その他多くの地域ウォレットからの支払いを受け付けることができます。

主な機能:

  • 大規模なリーチ - 合計13億人以上の登録アカウントを持つ12以上のパートナーウォレット*
  • 単一統合 - 複数のウォレット用の1つのAPI
  • クロスボーダー - 観光客や国際顧客からの支払いを受け付け
  • 高速確認 - ほぼリアルタイムの支払い検証(通常数秒以内)
  • マルチ通貨 - 17以上の通貨をサポート
  • マーケティングツール - プロモーションおよびロイヤルティ機能

パートナーウォレット

Alipay+は、以下の主要なデジタルウォレットに接続します:

ウォレット地域ユーザー通貨
AlipayHK香港300万+HKD
GCashフィリピン8600万+PHP
KakaoPay韓国3000万+KRW
Touch 'n Go eWalletマレーシア1800万+MYR
TrueMoneyタイ3000万+THB
Changi Payシンガポール-SGD
EZ-Link Walletシンガポール100万+SGD
Hipayモンゴル200万+MNT
MPayマカオ-MOP
Rabbit LINE Payタイ1200万+THB
Toss Pay韓国1000万+KRW

サポートされている地域と通貨

地域通貨一般的な使用事例
東南アジアTHB, MYR, SGD, PHPEコマース、旅行、サービス
東アジアKRW, HKD, MOP観光、小売、デジタル商品
クロスボーダーUSD, EUR, JPY, CNY国際決済

最小取引額: 通貨により異なります(通常1米ドル相当) 最大取引額: パートナーウォレットにより異なります(通常10,000米ドル相当)

仕組み

支払いフロー:

  1. 顧客がチェックアウト時にウォレットを選択
  2. マーチャントがOmiseでAlipay+ソースを作成
  3. 顧客にQRコードが表示されるか、ウォレットにリダイレクト
  4. 顧客がQRをスキャンまたはウォレットアプリを開く
  5. 顧客がウォレットで支払いを確認
  6. Alipay+ネットワークを通じて支払いが処理
  7. マーチャントが即座に確認を受け取る

通常の完了時間: 1-2分

実装

ステップ1: Alipay+ソースの作成

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

レスポンス:

{
"object": "source",
"id": "src_test_5rt6s9vah5lkvi1rh9c",
"type": "alipay_plus",
"flow": "redirect",
"amount": 50000,
"currency": "THB",
"scannable_code": {
"type": "qr",
"image": {
"download_uri": "https://api.omise.co/...",
"object": "document"
}
}
}

ステップ2: QRコード表示またはリダイレクト

オプションA: QRコード(店舗内/デスクトップ)

app.post('/checkout/alipay-plus', async (req, res) => {
try {
const { amount, currency } = req.body;

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

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

// QRコードを表示
res.render('payment-qr', {
qr_code_url: source.scannable_code.image.download_uri,
charge_id: charge.id
});

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

QRコード表示テンプレート:

<div class="alipay-plus-payment">
<h2>Alipay+でスキャンして支払う</h2>
<img src="{{ qr_code_url }}" alt="Alipay+ QR Code" class="qr-code">

<div class="supported-wallets">
<p>以下のウォレットでスキャンできます:</p>
<div class="wallet-logos">
<img src="/icons/gcash.png" alt="GCash">
<img src="/icons/kakaopay.png" alt="KakaoPay">
<img src="/icons/tng.png" alt="Touch 'n Go">
<img src="/icons/truemoney.png" alt="TrueMoney">
<img src="/icons/alipay-hk.png" alt="AlipayHK">
</div>
</div>

<div class="instructions">
<ol>
<li>ウォレットアプリを開く</li>
<li>「スキャン」または「支払い」をタップ</li>
<li>上記のQRコードをスキャン</li>
<li>支払いを確認</li>
</ol>
</div>

<div id="payment-status">
<p>支払い待機中...</p>
<div class="spinner"></div>
</div>
</div>

<script>
// 支払いステータスをポーリング
const chargeId = '{{ charge_id }}';
const pollInterval = setInterval(async () => {
const response = await fetch(`/api/charges/${chargeId}/status`);
const data = await response.json();

if (data.status === 'successful') {
clearInterval(pollInterval);
window.location = '/payment-success';
} else if (data.status === 'failed') {
clearInterval(pollInterval);
window.location = '/payment-failed';
}
}, 3000); // 3秒ごとにチェック

// 10分後にタイムアウト
setTimeout(() => {
clearInterval(pollInterval);
document.getElementById('payment-status').innerHTML =
'<p>支払いタイムアウト。もう一度お試しください。</p>';
}, 600000);
</script>

オプションB: リダイレクト(モバイル)

app.post('/checkout/alipay-plus-mobile', async (req, res) => {
try {
const { amount, currency } = req.body;

const source = await omise.sources.create({
type: 'alipay_plus',
amount: amount,
currency: currency
});

const charge = await omise.charges.create({
amount: amount,
currency: currency,
source: source.id,
return_uri: `${process.env.BASE_URL}/payment/callback`
});

// Alipay+ページにリダイレクト
res.redirect(charge.authorize_uri);

} catch (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 fulfillOrder(charge.metadata.order_id);
res.redirect('/payment-success');
} else if (charge.status === 'failed') {
res.redirect('/payment-failed');
} 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 === 'alipay_plus') {
if (charge.status === 'successful') {
await processOrder(charge.metadata.order_id);
await sendConfirmation(charge.metadata.customer_email);
}
}
}

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 SUPPORTED_CURRENCIES = ['THB', 'MYR', 'SGD', 'PHP', 'KRW', 'HKD'];

const CURRENCY_LIMITS = {
THB: { min: 2000, max: 1000000 },
MYR: { min: 500, max: 500000 },
SGD: { min: 100, max: 100000 },
PHP: { min: 5000, max: 1000000 },
KRW: { min: 100000, max: 10000000 },
HKD: { min: 100, max: 100000 }
};

// Alipay+支払いを作成
app.post('/checkout/alipay-plus', async (req, res) => {
try {
const { amount, currency, order_id, customer_email } = req.body;

// 通貨を検証
if (!SUPPORTED_CURRENCIES.includes(currency)) {
return res.status(400).json({
error: `通貨${currency}はAlipay+でサポートされていません`
});
}

// 金額を検証
const limits = CURRENCY_LIMITS[currency];
if (amount < limits.min || amount > limits.max) {
return res.status(400).json({
error: `金額は${limits.min}から${limits.max} ${currency}の間である必要があります`
});
}

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

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

// QRコードと認証URIを返す
res.json({
charge_id: charge.id,
qr_code_url: source.scannable_code.image.download_uri,
authorize_uri: charge.authorize_uri,
expires_at: new Date(Date.now() + 10 * 60 * 1000).toISOString()
});

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

// チャージステータスを確認(ポーリング用)
app.get('/api/charges/:chargeId/status', async (req, res) => {
try {
const charge = await omise.charges.retrieve(req.params.chargeId);
res.json({
status: charge.status,
paid: charge.paid,
failure_message: charge.failure_message
});
} catch (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?reason=${charge.failure_message}`);
}
} 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 === 'alipay_plus') {
const charge = event.data;

if (charge.status === 'successful') {
await fulfillOrder(charge.metadata.order_id);
await sendReceipt(charge.metadata.customer_email, charge);
}
}

res.sendStatus(200);
});

app.listen(3000);

返金サポート

Alipay+は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);
返金処理時間

返金はパートナーウォレットに応じて、3〜7営業日以内に顧客の元のウォレットに処理されます。

返金ポリシー

返金期間とポリシーは変更される場合があります。Omise APIドキュメントまたはマーチャントダッシュボードで常に現在の返金機能を確認してください。

よくある問題とトラブルシューティング

問題: QRコードがスキャンできない

原因: 顧客が非互換のウォレットアプリを使用

解決策:

// サポートされているウォレットを目立つように表示
const supportedWallets = [
'GCash', 'KakaoPay', 'Touch \'n Go',
'TrueMoney', 'AlipayHK', 'Rabbit LINE Pay'
];

// メッセージを表示
showMessage(`以下でスキャンしてください: ${supportedWallets.join(', ')}`);

問題: 顧客のウォレットで通貨がサポートされていない

原因: 顧客のウォレットがマーチャントの通貨をサポートしていない

解決策: Alipay+は自動的に通貨換算を処理します。サポートされている通貨を使用していることを確認してください。

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

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

解決策:

const QR_TIMEOUT = 10 * 60 * 1000; // 10分

setTimeout(() => {
if (!paymentCompleted) {
showMessage('QRコードの有効期限が切れました。新しいものを生成してください。');
enableRetry();
}
}, QR_TIMEOUT);

問題: クロスボーダー制限

原因: 一部のウォレットにはクロスボーダー支払い制限がある

解決策: クロスボーダー制限についてはパートナーウォレットのドキュメントを確認し、それに応じて顧客に通知してください。

ベストプラクティス

1. サポートされているウォレットを表示

<div class="alipay-plus-info">
<h3>Alipay+パートナーウォレットで支払う</h3>
<div class="wallet-grid">
<div class="wallet-item">
<img src="/icons/gcash.svg" alt="GCash">
<span>GCash (PH)</span>
</div>
<div class="wallet-item">
<img src="/icons/kakaopay.svg" alt="KakaoPay">
<span>KakaoPay (KR)</span>
</div>
<div class="wallet-item">
<img src="/icons/tng.svg" alt="Touch 'n Go">
<span>Touch 'n Go (MY)</span>
</div>
<!-- その他のウォレット -->
</div>
</div>

2. レスポンシブQRコード表示

.qr-code {
width: 100%;
max-width: 300px;
height: auto;
display: block;
margin: 20px auto;
border: 10px solid white;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
}

@media (max-width: 768px) {
.qr-code {
max-width: 250px;
}
}

3. 支払いステータスをポーリング

async function pollPaymentStatus(chargeId) {
const maxAttempts = 200; // 10分(200 * 3秒)
let attempts = 0;

const poll = setInterval(async () => {
attempts++;

try {
const response = await fetch(`/api/charges/${chargeId}/status`);
const data = await response.json();

if (data.status === 'successful') {
clearInterval(poll);
window.location = '/payment-success';
} else if (data.status === 'failed') {
clearInterval(poll);
window.location = '/payment-failed';
} else if (attempts >= maxAttempts) {
clearInterval(poll);
showTimeout();
}
} catch (error) {
console.error('Poll error:', error);
}
}, 3000);
}

4. マルチチャネルサポート

// デバイスを検出して適切なフローを表示
function initAlipayPlusPayment(amount, currency) {
const isMobile = /iPhone|iPad|iPod|Android/i.test(navigator.userAgent);

if (isMobile) {
// ウォレット選択にリダイレクト
createPaymentAndRedirect(amount, currency);
} else {
// QRコードを表示
createPaymentAndShowQR(amount, currency);
}
}

5. 明確な指示

<div class="payment-instructions">
<h4>支払い方法:</h4>
<ol>
<li>ウォレットアプリを開く(GCash、KakaoPay、Touch 'n Goなど)</li>
<li>「スキャン」または「QRスキャン」をタップ</li>
<li>上記のQRコードにカメラを向ける</li>
<li>金額を確認して「支払う」をタップ</li>
<li>PINを入力するか生体認証を使用</li>
</ol>
<p class="help-text">ヘルプが必要ですか? <a href="mailto:support@omise.co">サポートに連絡</a></p>
</div>

FAQ

Alipay+とは何ですか?通常のAlipayとどう違いますか?

Alipay+は、アジア太平洋地域の12以上の地域電子ウォレットを接続するクロスボーダー決済ネットワークです。通常のAlipayは中国のウォレットのみです。Alipay+を使用すると、1つの統合でGCash、KakaoPay、Touch 'n Go、その他のパートナーウォレットからの支払いを受け付けることができます。

顧客はどのウォレットを使用できますか?

顧客は以下で支払うことができます: GCash(フィリピン)、KakaoPay(韓国)、Touch 'n Go eWallet(マレーシア)、TrueMoney(タイ)、AlipayHK(香港)、Rabbit LINE Pay(タイ)、Toss Pay(韓国)、その他のAlipay+パートナーウォレット。

各ウォレットに個別の統合が必要ですか?

いいえ! それがAlipay+の利点です。1つの統合で、すべてのパートナーウォレットにアクセスできます。顧客はAlipay+ QRコードをスキャンすることで、サポートされている任意のウォレットで支払うことができます。

Alipay+はクロスボーダー決済をサポートしていますか?

はい、Alipay+はクロスボーダー決済用に設計されています。通貨換算を自動的に処理します。たとえば、フィリピンからの観光客は、GCashウォレットを使用して現地通貨で支払うことができます。

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

決済は通常、マーチャント契約と顧客のウォレットに応じて、3〜7営業日以内に行われます。

Alipay+の支払いを返金できますか?

はい、元の取引から180日以内の全額および一部返金がサポートされています。

取引制限は何ですか?

制限はパートナーウォレットと顧客の確認レベルによって異なります。一般的に:

  • 最小: 1米ドル相当
  • 最大: 1取引あたり10,000米ドル相当

詳細な制限については、特定のパートナーウォレットで確認してください。

テスト

テストモード

Alipay+ウォレットは、テストAPIキーを使用してテストできます。テストモードでは:

テスト認証情報:

  • テストAPIキーを使用(skey_test_xxx)
  • ウォレット地域に基づいてサポートされている通貨をテスト
  • テストに実際のウォレットアカウントは不要

テストフロー:

  1. 特定のウォレット用のテストAPIキーでソースとチャージを作成
  2. QRコードが生成されるか、リダイレクトURLが提供される
  3. テストページがウォレット認証をシミュレート
  4. Omiseダッシュボードアクションを使用して、チャージを成功/失敗としてマーク
  5. Webhookと支払いステータス処理を検証

テスト実装:

// さまざまなAlipay+ウォレットをテスト
const testWallets = [
{ type: 'gcash', currency: 'PHP', amount: 10000 },
{ type: 'kakaopay', currency: 'KRW', amount: 10000 },
{ type: 'touch_n_go', currency: 'MYR', amount: 10000 }
];

for (const wallet of testWallets) {
const source = await omise.sources.create({
type: wallet.type,
amount: wallet.amount,
currency: wallet.currency
});

const charge = await omise.charges.create({
amount: wallet.amount,
currency: wallet.currency,
source: source.id
});

console.log(`Test ${wallet.type}:`, charge.authorize_uri || charge.source.scannable_code);
}

テストシナリオ:

  • 支払い成功: 各ウォレットの注文完了を検証
  • 支払い失敗: エラー処理をテスト
  • 複数のウォレット: 各Alipay+ウォレットを個別にテスト
  • QR vs リダイレクト: QRとリダイレクトの両方のフローをテスト
  • 金額制限: ウォレットと通貨ごとの制限を検証
  • 通貨検証: ウォレットごとの正しい通貨を確保
  • タイムアウト: 放棄された支払いシナリオをテスト
  • Webhook配信: すべてのWebhook通知を検証

重要な注意事項:

  • テストモードは実際のウォレットサーバーに接続しません
  • ダッシュボードを使用して支払い結果をシミュレート
  • 各ウォレットタイプを個別にテスト
  • すべてのウォレットのWebhook処理を検証
  • QRコードとリダイレクトの両方のフローをテスト
  • ウォレットごとの通貨要件を検証

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

関連リソース

次のステップ

  1. Alipay+ソースを作成
  2. QRコード表示またはリダイレクト
  3. ステータスポーリングを実装
  4. Webhookを設定
  5. さまざまなウォレットでテスト
  6. 本番開始