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

Alipay

世界中で10億人以上のユーザーを持つ中国最大のデジタルウォレットAlipayからの支払いを受け付け、シームレスなクロスボーダーeコマース取引を実現します。

支払いフロー

Alipay Payment Flow Step 1

Alipay Payment Flow Step 2

上記の画像は、Alipay支払いフローでのredirectプロセスと顧客承認ステップを示しています。

概要

Alipayは、Alibaba Groupの関連会社であるAnt Group(旧Ant Financial)が運営するサードパーティのモバイルおよびオンライン決済プラットフォームです。主に中国に10億人以上のアクティブユーザーを持つAlipayは、世界最大のモバイル決済プラットフォームとなり、中国の消費者をターゲットとする加盟店にとって重要な決済方法となっています。

主な機能:

  • 10億人以上のユーザー - 世界最大のモバイル決済プラットフォームの1つ
  • クロスボーダー対応 - 国際eコマース向けに構築
  • 中国市場へのアクセス - 中国重視のビジネスに不可欠
  • 即時確認 - リアルタイム決済処理
  • モバイルファースト - スマートフォンユーザーに最適化
  • 信頼できるブランド - Alibaba/Ant Groupエコシステムの一部

サポートされている地域

地域通貨最小金額最大金額1日の上限
タイTHB฿20.00฿150,000変動
シンガポールSGD$1.00$20,000変動
マレーシアMYRRM1.00RM30,000変動
日本JPY¥100¥6,000,000変動

*上限は顧客のAlipayアカウント検証レベルによって異なります

仕組み

顧客体験:

  1. 顧客がチェックアウト時に「Alipay」を選択
  2. Alipay認証ページにredirect
  3. Alipayアプリを開く(モバイル)またはQR codeをスキャン(デスクトップ)
  4. パスワード/指紋/Face IDで認証
  5. 支払いを確認して承認
  6. 加盟店サイトに戻る

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

実装

ステップ1: Alipay Sourceの作成

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

レスポンス:

{
"object": "source",
"id": "src_test_5rt6s9vah5lkvi1rh9c",
"type": "alipay",
"flow": "redirect",
"amount": 50000,
"currency": "THB"
}

ステップ2: Chargeの作成

curl https://api.omise.co/charges \
-u skey_test_YOUR_SECRET_KEY: \
-d "amount=50000" \
-d "currency=THB" \
-d "source=src_test_5rt6s9vah5lkvi1rh9c" \
-d "return_uri=https://yourdomain.com/payment/callback"

ステップ3: 顧客のredirect

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

// Validate currency
const supportedCurrencies = ['THB', 'SGD', 'MYR', 'JPY'];
if (!supportedCurrencies.includes(currency)) {
return res.status(400).json({
error: 'Alipay supports THB, SGD, MYR, and JPY only'
});
}

// Validate amount by currency
const limits = {
THB: { min: 2000, max: 15000000 },
SGD: { min: 100, max: 2000000 },
MYR: { min: 100, max: 3000000 },
JPY: { min: 100, max: 600000000 }
};

const { min, max } = limits[currency];
if (amount < min || amount > max) {
return res.status(400).json({
error: `Amount must be between ${min} and ${max} ${currency}`
});
}

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

// Create charge
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
}
});

// Redirect to Alipay
res.redirect(charge.authorize_uri);

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

ステップ4: returnの処理

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('/payment-success');
} else if (charge.status === 'failed') {
res.redirect('/payment-failed?reason=' + charge.failure_message);
} else {
res.redirect('/payment-pending');
}
} catch (error) {
res.redirect('/payment-error');
}
});

ステップ5: webhookの処理

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

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

if (charge.status === 'successful') {
processOrder(charge.metadata.order_id);
} else if (charge.status === 'failed') {
handleFailedPayment(charge.metadata.order_id);
}
}

res.sendStatus(200);
});

完全な実装例

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

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

// Amount limits by currency
const LIMITS = {
THB: { min: 2000, max: 15000000 },
SGD: { min: 100, max: 2000000 },
MYR: { min: 100, max: 3000000 },
JPY: { min: 100, max: 600000000 }
};

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

// Validate currency
if (!['THB', 'SGD', 'MYR', 'JPY'].includes(currency)) {
return res.status(400).json({
error: 'Alipay only supports THB, SGD, MYR, and JPY'
});
}

// Validate amount
const { min, max } = LIMITS[currency];
if (amount < min || amount > max) {
return res.status(400).json({
error: `Amount must be between ${min} and ${max} ${currency}`
});
}

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

// Create charge
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,
payment_method: 'alipay'
}
});

// Return authorization URL
res.json({
authorize_uri: charge.authorize_uri,
charge_id: charge.id
});

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

// Callback handler
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') {
res.redirect(`/order-success?order=${charge.metadata.order_id}`);
} else {
res.redirect(`/payment-failed?charge=${chargeId}`);
}
} catch (error) {
res.redirect('/payment-error');
}
});

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

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

if (charge.source.type === 'alipay') {
if (charge.status === 'successful') {
updateOrderStatus(charge.metadata.order_id, 'paid');
sendConfirmation(charge.metadata.customer_email);
} else {
updateOrderStatus(charge.metadata.order_id, 'failed');
}
}
}

res.sendStatus(200);
});

app.listen(3000);

返金サポート

Alipayは90日以内全額および部分返金をサポート:

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

// Partial refund
const partialRefund = await omise.charges.refund('chrg_test_...', {
amount: 25000 // Half refund
});
返金期間

返金は元の取引から90日以内にサポートされています。全額および部分返金の両方が許可されています。

返金ポリシー

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

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

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

原因: 顧客がAlipayを選択したがアプリを持っていない(主に中国の顧客)

解決策:

  • Alipayは中国の顧客向けであることを明確に示す
  • アプリのダウンロードリンクを提供
  • デスクトップユーザー向けにQR codeオプションを表示
function checkAlipayAvailability() {
// Detect if user is likely from China
const userLocale = navigator.language;
const isChineseLocale = /^zh/i.test(userLocale);

if (!isChineseLocale) {
showWarning('Alipay is primarily for customers in China. Do you have an Alipay account?');
}
}

問題: 通貨換算の混乱

原因: 顧客がAlipayアプリで異なる金額を見る

解決策:

// Display amount in customer's currency
function displayAlipayAmount(amount, currency) {
return `
<div class="payment-amount">
<p>お支払い額: ${amount / 100} ${currency}</p>
<p class="note">金額はAlipayアプリで現在の為替レートでCNYに換算されます</p>
</div>
`;
}

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

解決策:

const TIMEOUT = 15 * 60 * 1000; // 15 minutes

setTimeout(() => {
if (!paymentConfirmed) {
showTimeoutMessage();
allowRetry();
}
}, TIMEOUT);

ベストプラクティス

1. 中国の顧客をターゲット

<div class="alipay-info">
<h3>Alipayで支払う (支付宝)</h3>
<p>Alipayは中国で人気のあるデジタルウォレットで、10億人以上のユーザーがいます。</p>
<p><strong>要件:</strong></p>
<ul>
<li>Alipayアカウント(通常は中国の電話番号が必要)</li>
<li>Alipayアプリがインストールされているか、デスクトップブラウザアクセス</li>
<li>十分な残高またはリンクされた支払い方法</li>
</ul>
<p class="chinese">支付宝是中国领先的数字钱包,拥有超过10亿用户。</p>
</div>

2. 中国語で表示(オプション)

const ALIPAY_LABELS = {
en: {
title: 'Pay with Alipay',
button: 'Continue to Alipay'
},
zh: {
title: '使用支付宝支付',
button: '前往支付宝'
}
};

function getAlipayLabel(locale = 'en') {
return ALIPAY_LABELS[locale] || ALIPAY_LABELS.en;
}

3. モバイルとデスクトップの処理

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

if (isMobile) {
// Mobile: Try to open app
window.location = authorizeUri;
} else {
// Desktop: Show QR code
showQRCode(authorizeUri);
}
}

4. 通貨の検証

function validateAlipayPayment(amount, currency) {
const limits = {
THB: { min: 2000, max: 15000000, symbol: '฿' },
SGD: { min: 100, max: 2000000, symbol: '$' },
MYR: { min: 100, max: 3000000, symbol: 'RM' },
JPY: { min: 100, max: 600000000, symbol: '¥' }
};

if (!limits[currency]) {
return { valid: false, error: 'Currency not supported' };
}

const { min, max, symbol } = limits[currency];

if (amount < min || amount > max) {
return {
valid: false,
error: `Amount must be between ${symbol}${min / 100} and ${symbol}${max / 100}`
};
}

return { valid: true };
}

5. クロスボーダーの考慮事項

// For international merchants targeting Chinese customers
const CROSS_BORDER_CONFIG = {
displayChineseInterface: true,
showExchangeRate: true,
supportCNYDisplay: true,
provideChineseSupport: true
};

// Show exchange rate estimate
async function displayExchangeRate(amount, currency) {
// Note: Actual rate determined by Alipay
const estimatedRate = await getEstimatedExchangeRate(currency, 'CNY');
const cnyAmount = (amount / 100) * estimatedRate;

return `
おおよそ ¥${cnyAmount.toFixed(2)} CNY
(為替レートは支払い時にAlipayによって決定されます)
`;
}

FAQ

Alipayとは何ですか?

Alipayは、世界中で10億人以上のユーザーを持つ中国最大のデジタルウォレットです。Ant Group(Alibabaの関連会社)が運営しており、オンラインショッピングをする中国の消費者にとって支配的な決済方法です。

顧客は中国にいる必要がありますか?

いいえ、ただしAlipayアカウントが必要です。ほとんどのAlipayユーザーは中国国民または居住者です。登録には通常、中国の電話番号とID検証が必要です。

Alipayはどの通貨をサポートしていますか?

Omiseを通じて、Alipayは以下をサポートします:

  • THB(タイバーツ)
  • SGD(シンガポールドル)
  • MYR(マレーシアリンギット)
  • JPY(日本円)

金額は、Alipayの為替レートでAlipay内でCNY(中国元)に換算されます。

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

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

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

はい、Alipayは元の取引から90日以内に全額および部分返金の両方をサポートします。

Alipayは中国以外の顧客に適していますか?

いいえ、Alipayは主に中国の顧客向けです。他の市場では、以下を検討してください:

  • タイ: PromptPay、TrueMoney
  • シンガポール: PayNow、GrabPay
  • マレーシア: Touch 'n Go、Boost
  • 国際: クレジットカード、PayPal
Alipayはデスクトップで動作しますか?

はい、デスクトップユーザーはAlipayモバイルアプリでQR codeをスキャンするか、利用可能な場合はAlipayのwebインターフェースを使用できます。

テスト

テストモード

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

テスト認証情報:

  • テストAPIキー(skey_test_xxx)を使用
  • サポートされているすべての通貨をテスト可能(THB、SGD、MYR、JPY)
  • テストにはAlipayアカウントは不要

テストフロー:

  1. テストAPIキーを使用してsourceとchargeを作成
  2. redirectのauthorize_uriを受け取ります
  3. テストredirectフローはテスト認証ページを開きます
  4. テストモードでは、ダッシュボードのActionsを使用してchargeを成功/失敗としてマーク
  5. webhook通知が受信されることを確認

テスト実装:

// Create test Alipay charge
const source = await omise.sources.create({
type: 'alipay',
amount: 50000,
currency: 'THB'
});

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

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

// Manually mark as successful/failed in dashboard
// Then verify webhook handling

テストシナリオ:

  • 成功した支払い: redirectフローを完了し、注文処理を検証
  • 失敗した支払い: エラー処理と顧客メッセージングをテスト
  • 通貨検証: サポートされているすべての通貨をテスト
  • 金額制限: 通貨ごとの最小/最大の適用を検証
  • タイムアウト処理: 放棄された支払いシナリオをテスト

重要な注意事項:

  • テストモードは実際のAlipayサーバーに接続しません
  • ダッシュボードを使用して支払いステータスの変更をシミュレート
  • 本番環境に移行する前にすべてのサポートされている通貨をテスト
  • すべてのステータス結果についてwebhook処理を検証
  • モバイルとデスクトップの両方のフローをテスト

詳細なテスト手順については、テストドキュメントを参照してください。

関連リソース

次のステップ

  1. Alipay sourceの作成
  2. redirectフローの実装
  3. webhookの設定
  4. 統合のテスト
  5. 本番環境へ