メインコンテンツへスキップ
バージョン: 最新版

ソースAPI

概要

Sources APIを使用すると、クレジットカード以外の代替決済手段を受け付けることができます。ソースはPromptPay QRコード、モバイルバンキング、インターネットバンキング、分割払いなどの決済チャネルを表します。

ソースとは

ソースは以下の決済手段を表す決済オブジェクトです:

  • PromptPay QRコード - リアルタイムQRベース決済
  • モバイルバンキング - アプリ内決済リダイレクト(SCB Easy、Krungthai Nextなど)
  • インターネットバンキング - オンライン銀行振込
  • コンビニ決済 - セブン-イレブン、ファミリーマートなどでの現金支払い
  • 分割払い - 分割払いオプション
  • 電子マネー - TrueMoney、Rabbit LINE Payなど

主な機能

幅広い決済手段サポート

  • QR決済 - PromptPay、Alipay、WeChat Pay
  • 銀行振込 - モバイルおよびインターネットバンキング
  • 分割払い - 0%金利分割払いプラン
  • 現金決済 - コンビニ決済
  • 電子マネー - デジタルウォレット連携

柔軟なワークフロー

  • リダイレクトベース - 顧客が決済完了のためにリダイレクト
  • QRコード表示 - 顧客がスキャンするQRコードを表示
  • Webhook通知 - リアルタイム決済ステータス更新
  • 非同期処理 - サイト外で決済完了

地域サポート

  • タイ - PromptPay、SCB、Krungthai、BAY、BBLなど
  • マレーシア - FPX、Boost、GrabPay、Touch 'n Go
  • シンガポール - PayNow、GrabPay
  • 国際 - Alipay、WeChat Pay

ソースの仕組み

標準フロー

┌─────────┐         ┌─────────┐         ┌─────────┐         ┌─────────┐
│ あなたの │ │ Omise │ │ 決済 │ │ 顧客 │
│ サーバー │ │ API │ │プロバイダ│ │ │
└────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘
│ │ │ │
│ 1. ソース作成 │ │ │
├──────────────────>│ │ │
│ │ │ │
│ 2. ソース返却 │ │ │
│ (QR/URL付き) │ │ │
│<──────────────────┤ │ │
│ │ │ │
│ 3. チャージ作成 │ │ │
├──────────────────>│ │ │
│ │ │ │
│ 4. チャージ返却 │ │ │
│ (status:pending) │ │
│<──────────────────┤ │ │
│ │ │ │
│ 5. QR表示 │ │ │
│ またはリダイレクト │ │
├──────────────────────────────────────────────────────────>│
│ │ │ │
│ │ │ 6. 顧客が支払い │
│ │ │<──────────────────┤
│ │ │ │
│ │ 7. Webhook通知 │ │
│<──────────────────┤ │ │
│ │ │ │
│ 8. 成功画面表示 │ │ │
├──────────────────────────────────────────────────────────>│
│ │ │ │

実装手順

  1. ソース作成 - 決済手段タイプと金額を指定
  2. チャージ作成 - ソースIDを使用してチャージを作成(ステータス: pending)
  3. 決済UI表示 - QRコードを表示するか顧客をリダイレクト
  4. Webhookを待機 - 顧客が非同期で決済を完了
  5. ステータス確認 - WebhookまたはAPIでチャージステータスを確認
  6. 注文処理 - 決済成功後に注文を処理

ソースタイプ

QRベース決済

タイプ説明地域
promptpayタイの国家QR決済タイ
alipay中国の主要電子マネー国際
wechat_payWeChat Pay QR国際
paynowシンガポールのQR決済シンガポール

モバイルバンキング

タイプ説明地域
mobile_banking_scbSCB Easyアプリタイ
mobile_banking_kbankK PLUSアプリタイ
mobile_banking_bblBangkok Bank Mobileタイ
mobile_banking_bayKrungsri Mobileタイ
mobile_banking_ktbKrungthai NEXTアプリタイ

インターネットバンキング

タイプ説明地域
internet_banking_scbSCBオンラインバンキングタイ
internet_banking_bblBangkok Bankオンラインタイ
internet_banking_bayKrungsriオンラインタイ
fpxマレーシアのオンラインバンキングマレーシア

その他の決済手段

タイプ説明地域
truemoneyTrueMoneyウォレットタイ
rabbit_linepayRabbit LINE Payタイ
installment_bayKrungsri分割払いタイ
installment_kbankカシコン銀行分割払いタイ
econtextコンビニ決済日本

ソースライフサイクル

ステータス

ステータス説明チャージステータス
pendingソース作成済み、決済待ちpending
successful決済完了successful
failed決済失敗または拒否failed
expired決済期限切れexpired

有効期限ルール

決済手段によってデフォルトの有効期限が異なります:

有効期限の確認

以下に記載されている有効期限は、利用可能なドキュメントに基づいており、実際とは異なる場合があります。お使いの決済手段の最新かつ正確な有効期限については、個別の決済手段ドキュメントを参照するか、Omiseサポートにお問い合わせください。

決済手段デフォルト有効期限カスタム有効期限
PromptPay24時間expires_inでカスタマイズ可能
モバイルバンキング (SCB/KBANK/BBL/BAY/KTB)15〜30分*expires_inでカスタマイズ可能
インターネットバンキング (SCB/BBL/BAY)15〜30分*expires_inでカスタマイズ可能
FPX (マレーシア)30分*expires_inでカスタマイズ可能
PayNow (シンガポール)15〜30分*expires_inでカスタマイズ可能
Alipay15〜30分*expires_inでカスタマイズ可能
WeChat Pay15〜30分*expires_inでカスタマイズ可能
TrueMoneyウォレット15〜30分*expires_inでカスタマイズ可能
Rabbit LINE Pay15〜30分*expires_inでカスタマイズ可能
GrabPay15〜30分*expires_inでカスタマイズ可能
Boost15〜30分*expires_inでカスタマイズ可能
Touch 'n Go15〜30分*expires_inでカスタマイズ可能
分割払い (BAY/KBANK)24〜48時間*expires_inでカスタマイズ可能
コンビニ決済 (日本)7日間*expires_inでカスタマイズ可能

*正確な値については、個別の決済手段ドキュメントまたはOmiseサポートにお問い合わせください。

カスタム有効期限の設定:

const source = await omise.sources.create({
type: 'promptpay',
amount: 100000,
currency: 'thb',
expires_in: 1800 // 30分(秒単位)
});

ベストプラクティス:

  • 推奨される有効期限については個別の決済手段ドキュメントを確認
  • QR決済では古いQRコードを防ぐために短い有効期限(5〜15分)を設定
  • 銀行振込では処理時間を考慮して長い有効期限(24〜48時間)を設定
  • 注文ステータスを更新するためにsource.expiredWebhookイベントを常に処理

APIエンドポイント

メソッドエンドポイント説明
POST/sources新しいソースを作成
GET/sources/:idソース情報を取得

クイックスタート

PromptPay QR決済の例

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

// 2. ソースを使用してチャージを作成
const charge = await omise.charges.create({
amount: 100000,
currency: 'thb',
source: source.id,
return_uri: 'https://example.com/payment/complete'
});

// 3. 顧客にQRコードを表示
const qrCodeUrl = charge.source.scannable_code.image.download_uri;
console.log('QRコードを表示:', qrCodeUrl);

// 4. Webhook通知を待機
// Webhookイベント: charge.complete
// チャージステータスが"successful"に変わったことを確認

モバイルバンキングの例

// 1. モバイルバンキングソースを作成
const source = await omise.sources.create({
type: 'mobile_banking_scb',
amount: 50000,
currency: 'thb'
});

// 2. チャージを作成
const charge = await omise.charges.create({
amount: 50000,
currency: 'thb',
source: source.id,
return_uri: 'https://example.com/payment/complete'
});

// 3. 顧客をauthorize_uriにリダイレクト
const redirectUrl = charge.authorize_uri;
// 顧客をこのURLにリダイレクト
window.location.href = redirectUrl;

// 4. 顧客がバンキングアプリで決済を完了
// 5. 顧客がreturn_uriにリダイレクトされる
// 6. 決済完了時にWebhookが送信される

決済フロー

QRコードフロー(PromptPay、Alipay、WeChat Pay)

  1. ソース作成 → チャージ作成
  2. 顧客にQRコードを表示
  3. 顧客がモバイルアプリでスキャン
  4. 顧客がアプリで決済を確認
  5. Webhook通知が送信される
  6. 注文ステータスを更新

リダイレクトフロー(モバイルバンキング、インターネットバンキング)

  1. ソース作成 → チャージ作成
  2. 顧客をauthorize_uriにリダイレクト
  3. 顧客が決済を完了
  4. 顧客がreturn_uriにリダイレクト
  5. Webhook通知が送信される
  6. 決済ステータスを確認

オフラインフロー(コンビニ決済)

  1. ソース作成 → チャージ作成
  2. 顧客に支払いコードを表示
  3. 顧客がコンビニで支払い
  4. Webhook通知が送信される(数時間〜数日後)
  5. 注文を処理

一般的なユースケース

単発決済

const source = await omise.sources.create({ type: 'promptpay', amount: 100000, currency: 'thb' });
const charge = await omise.charges.create({ amount: 100000, currency: 'thb', source: source.id });

分割払い

const source = await omise.sources.create({
type: 'installment_kbank',
amount: 300000,
currency: 'thb',
installment_term: 6 // 6ヶ月
});
const charge = await omise.charges.create({ amount: 300000, currency: 'thb', source: source.id });

コンビニ決済

const source = await omise.sources.create({
type: 'econtext',
amount: 50000,
currency: 'jpy',
name: 'TARO YAMADA',
email: 'taro@example.com',
phone_number: '+81312345678'
});
const charge = await omise.charges.create({ amount: 50000, currency: 'jpy', source: source.id });

ベストプラクティス

すべきこと

  • リダイレクトベースの決済にはreturn_uriを設定
  • 非同期通知のためにWebhookを実装
  • 各決済手段の明確な説明を表示
  • 決済タイプに基づいて適切な有効期限を設定
  • ポーリングではなくWebhookで決済ステータスを確認
  • タイムアウトを適切に処理(顧客が完了しなかった場合)
  • 本番稼働前に各決済手段をテスト
  • 追跡とサポートのためにソースIDを保存

すべきでないこと

  • 頻繁にポーリングしない(Webhookを使用)
  • 即時決済を想定しない(非同期)
  • return_uriをスキップしない(顧客が戻る必要がある)
  • 有効期限を無視しない(ソースは期限切れになる)
  • 決済手段を混在させない(1つのソース = 1つの決済タイプ)
  • 誤った通貨でソースを使用しない(タイプ固有)

セキュリティ考慮事項

Webhook検証

真正性を確保するために、常にWebhook署名を検証してください:

const crypto = require('crypto');

function verifyWebhook(payload, signature, secret) {
const hmac = crypto.createHmac('sha256', secret);
hmac.update(payload);
const expectedSignature = hmac.digest('hex');
return signature === expectedSignature;
}

ステータス検証

return_uriパラメータだけを信頼しないでください。常にチャージステータスを確認:

// 顧客が決済から戻る
app.get('/payment/complete', async (req, res) => {
const chargeId = req.query.charge_id;

// 実際のチャージステータスを確認
const charge = await omise.charges.retrieve(chargeId);

if (charge.status === 'successful') {
// 決済確認済み、注文を処理
} else {
// 決済未完了、エラーを表示
}
});

テスト

テストモード

すべてのソースタイプは、テスト用秘密キーでテストモードで動作します。

決済シミュレーション

テストモードでは以下が可能です:

  • ソースとチャージの作成
  • Webhookの受信
  • リダイレクトフローのテスト
  • テストQRコードの生成

テストWebhook

ローカル開発にはWebhookテストツールまたはngrokを使用:

ngrok http 3000
# OmiseダッシュボードでWebhook URLを設定

エラー処理

一般的なソースエラー:

エラーコード説明解決方法
invalid_source_typeサポートされていない決済手段通貨で利用可能なタイプを確認
amount_too_low金額が最小値を下回っている決済タイプの最小金額を確認
currency_not_supported誤った通貨決済タイプが通貨をサポートしているか確認
expired_sourceソースの有効期限切れ新しいソースを作成

APIリファレンス

関連リソース

決済手段ガイド


ヘルプが必要ですか? 決済手段ガイドを確認するか、support@omise.coにお問い合わせください