概要
何ですか
MONDOを通じてApple Pay支払いを受け付ける
必要なもの
MONDO アカウントID + シークレットキー
送信内容
Apple Pay トークン + 金額 + 通貨
あなたが得るもの
完了または拒否された状態
使い方
オプションA: 自己ホスティング
あなたのサイトにApple Payボタンを表示し、トークンを送信してください
オプションB:MONDO主催
すべて対応します - お客様を当社にリダイレクトしてください
クイックスタート(セルフホスト)
POST https://server-to-server.getmondo.co/payment/
{
"company_account_id": "your_id",
"gateway_secret_key": "your_key",
"apple_pay_token": { /* from Apple Pay JS */ },
"transaction_amount": "99.99",
"transaction_currency_iso3": "EUR",
"live_or_sandbox": "sandbox"
}
Apple Pay について
Apple Payは、顧客が支払いを行うための迅速で安全、プライベートな方法を提供します。MONDOをあなたの決済サービスプロバイダー(PSP)として利用すれば、自身のApple開発者アカウントを持つ必要なくApple Payを受け付けることができます。
MONDOをあなたのPSPとして
- ✓ MONDOはApple Merchant IDを所有しています
- ✓ MONDOはApple Payの証明書を管理します
- ✓ MONDOは加盟店認証を処理します
- ✓ MONDOは支払いトークンを解読し処理します
トークン管理 — 誰が何をするのか?
Apple Payはエンドツーエンドの暗号化を使用してカード保持者のデータを保護します。責任の分担は以下の通りです:
| Apple(顧客のデバイス) | 生成する 暗号化された支払いトークン にはカードデータ、クリプトグラム、認証詳細が含まれています |
| あなた (商人) | 暗号化されたトークンを apple_pay_token パラメータを通じてMONDOに直接渡してください — 復号化を試みないでください |
| MONDO (PSP) | トークンを解除し、Apple Pay支払処理証明書を使用して支払いをCardCorpで処理します |
統合方法を選択
📋 前提条件
- ✓ パートナーアカウントID - あなたのユニークなMONDOアカウント識別子
- ✓ パートナーシークレットキー - あなたのAPI認証キー
- ✓ HTTPS - あなたのウェブサイトはHTTPSを使用する必要があります
⚠️ ドメイン確認が必要です
AppleのMONDOを通じてドメインを登録する必要があります。これは一度きりの設定です。
- 移動 GETMONDO.CO
- Login → Developer → Apple Pay → Add Apple Pay Domain
🔄 支払いフロー
ウェブサイトで
ネイティブ Apple Pay インターフェース
あなたのJSはMONDOの検証エンドポイントを呼び出します
Face ID / Touch ID
POST to /payment/ with apple_pay_token
ユーザーが成功/失敗のURLにリダイレクトされました
🔗 API エンドポイント
マーチャント検証エンドポイント
取引先検証パラメータ
| パラメータ | タイプ | 必要 | 説明 |
|---|---|---|---|
| validationURL | string | ✓ はい | Appleが提供したURL onvalidatemerchant イベント |
| company_account_id | string | ✓ はい | あなたのMONDOパートナーアカウントID |
| gateway_secret_key | string | ✓ はい | あなたのMONDOパートナーシークレットキー |
| domain_name | string | ○ 条件付き | お支払いドメイン (例: paynow.yoursite.com). サーバー間通信でブラウザのOriginヘッダーが利用できない場合に必要です。ブラウザから直接呼び出す場合は不要です。 |
バックエンドがマーチャント検証コールをプロキシする場合(つまり、ブラウザーが直接呼び出すのではなく、サーバーがMONDOを呼び出す場合)、次のものを含める必要があります
domain_name Apple Payボタンが表示されるドメインに設定してください。これにより、Apple Payセッションがお支払いページのドメインと一致します。 📝 必要なパラメータ (支払処理)
| パラメータ | タイプ | 説明 |
|---|---|---|
| company_account_id | string | あなたのMONDOパートナーアカウントID |
| gateway_secret_key | string | あなたのMONDOパートナーシークレットキー |
| apple_pay_token | object | 暗号化済み トークン元 event.payment.token — pass directly to MONDO as-is (復号しないでください) |
| transaction_amount | decimal | 支払額(例:99.99) |
| transaction_currency_iso3 | string | 通貨コード (EUR, USD, GBP) |
| cardholder_email_address | string | 顧客のメール |
オプションパラメータ
| パラメータ | 説明 |
|---|---|
| partner_return_url_completed | 支払い成功時のリダイレクトURL |
| partner_return_url_rejected | 支払い拒否のリダイレクト用URL |
| partner_webhook_url | Webhook通知のURL |
| live_or_sandbox | live または sandbox |
📤 APIレスポンス
Apple Payの支払いは即時に処理されます。応答には最終的な取引状況が含まれます:
{
"status": "success",
"transaction_status": "COMPLETED",
"gateway_session_id": "73d68b79579eeaa4a1f35f667509ba19",
"transaction_id": "37819a4707f3736b6fb42148d98f05ab",
"gateway_message": "Transaction succeeded",
"redirect_url": "https://yoursite.com/success?gateway_session_id=...&payment_status=COMPLETED"
}
応答フィールド
| フィールド | 説明 |
|---|---|
| status | success または error |
| transaction_status | COMPLETED または REJECTED |
| gateway_session_id | このトランザクションのユニークなセッションID |
| transaction_id | 一意の取引識別子 - コールバックとの相関に使用します |
| gateway_message | 人間が読めるステータスメッセージ |
| redirect_url | 支払い後にユーザーをリダイレクトするURL(オプション - UXのみ) |
Apple Payの取引は3Dセキュアのリダイレクトが必要なカード支払いと異なり、即時に処理されます。応答を受け取る時には、支払いはすでに完了しています。
🍎 Apple Pay JS 統合
ステップ1: Apple Payボタンを追加
<apple-pay-button buttonstyle="black" type="plain" locale="en" onclick="startApplePayPayment()"></apple-pay-button>
ステップ2: 在庫確認
if (window.ApplePaySession && ApplePaySession.canMakePayments()) {
document.getElementById('apple-pay-button').style.display = 'block';
}
ステップ3: 実装完了
async function startApplePayPayment() {
const paymentRequest = {
countryCode: 'US',
currencyCode: 'EUR',
merchantCapabilities: ['supports3DS'],
supportedNetworks: ['visa', 'masterCard'],
total: { label: 'Your Company', amount: '99.99', type: 'final' }
};
const session = new ApplePaySession(3, paymentRequest);
// Merchant Validation
session.onvalidatemerchant = async (event) => {
const resp = await fetch('https://server-to-server.getmondo.co/payment/apple_pay_validate_merchant.php', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
validationURL: event.validationURL,
company_account_id: 'YOUR_ACCOUNT_ID',
gateway_secret_key: 'YOUR_SECRET_KEY',
domain_name: 'your-domain.com' // Required for server-to-server; optional if browser calls directly
})
});
session.completeMerchantValidation(await resp.json());
};
// Payment Authorization - Apple provides ENCRYPTED token in event.payment.token
// IMPORTANT: Pass the token directly to MONDO - do NOT attempt to decrypt it
session.onpaymentauthorized = async (event) => {
const resp = await fetch('https://server-to-server.getmondo.co/payment/', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
company_account_id: 'YOUR_ACCOUNT_ID',
gateway_secret_key: 'YOUR_SECRET_KEY',
apple_pay_token: event.payment.token, // Encrypted token - MONDO decrypts
transaction_amount: '99.99',
transaction_currency_iso3: 'EUR',
cardholder_email_address: 'customer@example.com',
partner_return_url_completed: 'https://yoursite.com/success',
partner_return_url_rejected: 'https://yoursite.com/failed',
live_or_sandbox: 'live'
})
});
const result = await resp.json();
if (result.transaction_status === 'COMPLETED') {
session.completePayment(ApplePaySession.STATUS_SUCCESS);
// Payment already processed - redirect is optional for user experience
if (result.redirect_url) {
window.location.href = result.redirect_url;
}
} else {
session.completePayment(ApplePaySession.STATUS_FAILURE);
if (result.redirect_url) {
window.location.href = result.redirect_url;
}
}
};
session.begin();
}
テストモード
MONDOは2つのテストモードをサポートしています。違いを理解することが成功した統合には重要です。
何が起こるか
- ✅ トークン構造が検証されました
- ✅ すべての必須項目がチェックされました
- ⏭️ 復号はスキップされました(モックデータが返されました)
- ⏭️ CardCorp API コールはスキップされました
- ✅ 支払い手続き完了
何が起こるか
- ✅ トークン構造が検証されました
- ✅ すべての必須項目がチェックされました
- ✅ リアル暗号解読
- ✅ リアルカードコープAPI処理
- ✅ 本当のお金が請求されます
🎯 なぜSANDBOXは同じトークン構造が必要か
この設計により、SANDBOXからLIVEに切り替えると、コードの変更なしですぐに統合が機能します。
⚙️ モード設定
含める live_or_sandbox APIリクエストのパラメータ:
{
"company_account_id": "your_account_id",
"gateway_secret_key": "your_secret_key",
"apple_pay_token": { ... },
"transaction_amount": "99.99",
"transaction_currency_iso3": "EUR",
"live_or_sandbox": "sandbox" // or "live" for production
}
🎭 サンドボックス:強制トランザクション結果
SANDBOXモードでは、テストのために特定のトランザクション結果を強制できます:
| パラメータ | 価値 | 結果 |
|---|---|---|
| sandbox_force_transaction_status | COMPLETED |
✅ 支払い承認済み |
| sandbox_force_transaction_status | REJECTED |
❌ 支払い拒否 |
Apple Pay トークン構造
Apple Pay トークンは以下の構造でなければなりません。これはSANDBOXとLIVEモードの両方で同じです。
"***") SANDBOX モードでもエラーが発生します。 必要なトークン構造
{
"paymentData": {
"version": "EC_v1",
"data": "BASE64_ENCRYPTED_PAYMENT_DATA",
"signature": "BASE64_SIGNATURE",
"header": {
"ephemeralPublicKey": "BASE64_EPHEMERAL_KEY",
"publicKeyHash": "BASE64_PUBLIC_KEY_HASH",
"transactionId": "UNIQUE_TRANSACTION_ID"
}
},
"paymentMethod": {
"displayName": "Visa 1234",
"network": "Visa",
"type": "debit"
},
"transactionIdentifier": "APPLE_TRANSACTION_ID"
}
フィールド説明
| フィールド | 必要 | 説明 |
|---|---|---|
| paymentData.version | ✓ | 常に EC_v1 |
| paymentData.data | ✓ | AppleからのBase64暗号化支払いデータ |
| paymentData.signature | ✓ | Base64署名の検証 |
| paymentData.header.ephemeralPublicKey | ✓ | Base64 一時公開キー |
| paymentData.header.publicKeyHash | ✓ | Base64 ハッシュ マーチャントの公開鍵 |
| paymentData.header.transactionId | ✓ | 一意の取引識別子 |
| paymentMethod.network | ○ | カードネットワーク(Visa、Mastercard、Amex) |
| paymentMethod.displayName | ○ | Apple Walletからの表示名 |
✓ = 必要 | ○ = おすすめ
サンドボックステストトークン
このトークンをSANDBOXテスト用にコピーしてください。暗号化された値は実際のものである必要はありません - 構造のみが検証されます。
{
"paymentData": {
"version": "EC_v1",
"data": "c2FuZGJveF9lbmNyeXB0ZWRfZGF0YV8xNzAyMjU2MDAwMDAw",
"signature": "c2FuZGJveF9zaWduYXR1cmVfMTcwMjI1NjAwMDAwMA==",
"header": {
"ephemeralPublicKey": "c2FuZGJveF9lcGhlbWVyYWxfa2V5XzE3MDIyNTYwMDAwMDA=",
"publicKeyHash": "c2FuZGJveF9wdWJsaWNfa2V5X2hhc2g=",
"transactionId": "SANDBOX_TXN_1702256000000_a1b2c3d4e5f6"
}
},
"paymentMethod": {
"displayName": "Visa 4242",
"network": "Visa",
"type": "debit"
},
"transactionIdentifier": "SANDBOX_TXN_1702256000000_a1b2c3d4e5f6"
}
一般的なトークンエラー
| エラー | 原因 | 解決 |
|---|---|---|
| Invalid token format | トークンはJSONオブジェクトではありません | オブジェクトとしてトークンを送信 |
| Missing paymentData | トークンにはpaymentDataプロパティがありません | Apple Pay JSの完全なトークンを含める |
| Missing header fields | 一時公開鍵、公開鍵ハッシュ、またはトランザクションIDがありません | すべてのヘッダーフィールドが存在することを確認してください |
トークンはどこから来ますか?
LIVEモードでは、ユーザーが支払いを承認するとトークンはApple Pay JSから発行されます:
session.onpaymentauthorized = (event) => {
// This is the token you send to MONDO
const token = event.payment.token;
// Send to MONDO API
fetch('/payment/', {
body: JSON.stringify({
apple_pay_token: token, // Pass the entire token object
...
})
});
};
取引状況
トランザクションのステータスとその照会方法を理解することが完全な統合には不可欠です。
最終取引状況
以下は、webhookまたは/detailsエンドポイントを照会した際に受け取る可能性のある最終ステータスです:
中級ステータス
取引は作成されましたが、処理中です。これは以下の場合に発生します:
- ユーザーが3Dセキュア認証を完了しています
- カードネットワークで処理中です
- ユーザーが支払い手続きを中断しました
取引状況を照会するタイミングは?
- 予想される時間内にWebhookを受信していません(例:5分)
- トランザクションのステータスを手動で確認する必要があります
- Webhookエンドポイントが一時的に利用できませんでした
取引状況確認
トランザクションの状態を確認するには、詳細エンドポイントにPOSTリクエストを行います:
リクエストパラメータ
| パラメータ | 必要 | 説明 |
|---|---|---|
| company_account_id | ✓ | あなたのMONDOパートナーアカウントID |
| gateway_secret_key | ✓ | あなたのMONDOパートナーシークレットキー |
| gateway_session_id | ✓ | 初期支払いリクエストから返されたセッションID |
例のリクエスト
curl -X POST https://server-to-server.getmondo.co/details/ \
-H "Content-Type: application/json" \
-d '{
"company_account_id": "your_account_id",
"gateway_secret_key": "your_secret_key",
"gateway_session_id": "sess_abc123xyz"
}'
例示応答
{
"success": true,
"transaction_status": "COMPLETED",
"gateway_session_id": "sess_abc123xyz",
"transaction_amount": "99.99",
"transaction_currency_iso3": "EUR",
"card_last_4_digits": "4242",
"card_brand": "VISA",
"gateway_result_code": "000.000.000",
"gateway_result_description": "Transaction succeeded",
"created_at": "2024-12-10T22:30:00Z",
"completed_at": "2024-12-10T22:31:15Z"
}
受信状況更新
最終取引状況を受け取る方法は2つあります:
| 方法 | 使い方 | 使用時 |
|---|---|---|
| Webhook おすすめ | MONDOはPOSTリクエストを送信します partner_webhook_url |
プライマリ方法 - 自動, リアルタイム |
| Redirect URL | ユーザーがリダイレクトされました partner_return_url_completed または partner_return_url_rejected |
ユーザー確認用 |
| Query /details | ステータスを確認するためにPOSTリクエストを行います | ウェブフック未受信時の代替処理 |
取引が開始されたまま
取引が開始状態で15分以上経過した場合、それはおそらく以下を意味します:
- ユーザーが3Dセキュア認証を中止しました
- ユーザーが支払い中にブラウザを閉じました
- 処理中にネットワークの問題が発生しました
アクション: /details エンドポイントを照会して現在の状態を取得します。これらのトランザクションは最終的にタイムアウトし、FAILEDまたはCANCELEDの状態に移行します。