ソース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. 成功画面表示 │ │ │
├──────────────────────────────────────────────────────────>│
│ │ │ │
実装手順
- ソース作成 - 決済手段タイプと金額を指定
- チャージ作成 - ソースIDを使用してチャージを作成(ステータス: pending)
- 決済UI表示 - QRコードを表示するか顧客をリダイレクト
- Webhookを待機 - 顧客が非同期で決済を完了
- ステータス確認 - WebhookまたはAPIでチャージステータスを確認
- 注文処理 - 決済成功後 に注文を処理
ソースタイプ
QRベース決済
| タイプ | 説明 | 地域 |
|---|---|---|
| promptpay | タイの国家QR決済 | タイ |
| alipay | 中国の主要電子マネー | 国際 |
| wechat_pay | WeChat Pay QR | 国際 |
| paynow | シンガポールのQR決済 | シンガポール |
モバイルバンキング
| タイプ | 説明 | 地域 |
|---|---|---|
| mobile_banking_scb | SCB Easyアプリ | タイ |
| mobile_banking_kbank | K PLUSアプリ | タイ |
| mobile_banking_bbl | Bangkok Bank Mobile | タイ |
| mobile_banking_bay | Krungsri Mobile | タイ |
| mobile_banking_ktb | Krungthai NEXTアプリ | タイ |
インターネットバンキング
| タイプ | 説明 | 地域 |
|---|---|---|
| internet_banking_scb | SCBオンラインバンキング | タイ |
| internet_banking_bbl | Bangkok Bankオンライン | タイ |
| internet_banking_bay | Krungsriオンライン | タイ |
| fpx | マレーシアのオンラインバンキング | マレーシア |
その他の決済手段
| タイプ | 説明 | 地域 |
|---|---|---|
| truemoney | TrueMoneyウォレット | タイ |
| rabbit_linepay | Rabbit LINE Pay | タイ |
| installment_bay | Krungsri分割払い | タイ |
| installment_kbank | カシコン銀行分割払い | タイ |
| econtext | コンビニ決済 | 日本 |
ソースライフサイクル
ステータス
| ス テータス | 説明 | チャージステータス |
|---|---|---|
| pending | ソース作成済み、決済待ち | pending |
| successful | 決済完了 | successful |
| failed | 決済失敗または拒否 | failed |
| expired | 決済期限切れ | expired |
有効期限ルール
決済手段によってデフォルトの有効期限が異なります:
有効期限の確認
以下に記載されている有効期限は、利用可能なドキュメントに基づいており、実際とは異なる場合があります。お使いの決済手段の最新かつ正確な有効期限については、個別の決済手段ドキュメントを参照するか、Omiseサポートにお問い合わせください。
| 決済手段 | デフォルト有効期限 | カスタム有効期限 |
|---|---|---|
| PromptPay | 24時間 | 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でカスタマイズ可能 |
| Alipay | 15〜30分* | expires_inでカスタマイズ可能 |
| WeChat Pay | 15〜30分* | expires_inでカスタマイズ可能 |
| TrueMoneyウォレット | 15〜30分* | expires_inでカスタマイズ可能 |
| Rabbit LINE Pay | 15〜30分* | expires_inでカスタマイズ可能 |
| GrabPay | 15〜30分* | expires_inでカスタマイズ可能 |
| Boost | 15〜30分* | expires_inでカスタマイズ可能 |
| Touch 'n Go | 15〜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)
- ソース作成 → チャージ作成
- 顧客にQRコードを表示
- 顧客がモバイルアプリでスキャン
- 顧客がアプリで決済を確認
- Webhook通知が送信される
- 注文ステータスを更新
リダイレクトフロー(モバイルバンキング、インターネットバンキング)
- ソース作成 → チャージ作成
- 顧客を
authorize_uriにリダイレクト - 顧客が決済を完了
- 顧客が
return_uriにリダイレクト - Webhook通知が送信される
- 決済ステータスを確認
オフラインフロー(コンビニ決済)
- ソース作成 → チャージ作成
- 顧客に支払いコードを表示
- 顧客がコンビニで支払い
- Webhook通知が送信される(数時間〜数日後)
- 注文を処理
一般的なユースケース
単発決済
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を保存