概要

何ですか

MONDOを通じてApple Pay支払いを受け付ける

必要なもの

MONDO アカウントID + シークレットキー

送信内容

Apple Pay トークン + 金額 + 通貨

あなたが得るもの

完了または拒否された状態

使い方

顧客
Apple Pay
あなた
MONDO
完了

オプション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開発者アカウントなし、AppleマーチャントIDなし、管理する証明書なし。

トークン管理 — 誰が何をするのか?

Apple Payはエンドツーエンドの暗号化を使用してカード保持者のデータを保護します。責任の分担は以下の通りです:

Apple(顧客のデバイス) 生成する 暗号化された支払いトークン にはカードデータ、クリプトグラム、認証詳細が含まれています
あなた (商人) 暗号化されたトークンを apple_pay_token パラメータを通じてMONDOに直接渡してください復号化を試みないでください
MONDO (PSP) トークンを解除し、Apple Pay支払処理証明書を使用して支払いをCardCorpで処理します
重要: カード番号は表示も取り扱いもしません。Appleから受け取るトークンは暗号化されており、当社のマーチャント証明書を使用してMONDOのみが復号化できます。

統合方法を選択

最適: Apple Pay ボタンの外観とチェックアウトページのユーザーエクスペリエンスを完全に制御します。

📋 前提条件

  • パートナーアカウントID - あなたのユニークなMONDOアカウント識別子
  • パートナーシークレットキー - あなたのAPI認証キー
  • HTTPS - あなたのウェブサイトはHTTPSを使用する必要があります

⚠️ ドメイン確認が必要です

AppleのMONDOを通じてドメインを登録する必要があります。これは一度きりの設定です。

  1. 移動 GETMONDO.CO
  2. LoginDeveloperApple PayAdd Apple Pay Domain

🔄 支払いフロー

1
ユーザーがApple Payボタンをクリック
ウェブサイトで
2
Apple Payシートが開きます
ネイティブ Apple Pay インターフェース
3
加盟店検証
あなたのJSはMONDOの検証エンドポイントを呼び出します
4
ユーザー認証
Face ID / Touch ID
5
トークンをMONDOに送信しました
POST to /payment/ with apple_pay_token
6
3Dセキュア&リダイレクト
ユーザーが成功/失敗のURLにリダイレクトされました

🔗 API エンドポイント

POST https://server-to-server.getmondo.co/payment/

マーチャント検証エンドポイント

POST https://server-to-server.getmondo.co/payment/apple_pay_validate_merchant.php

取引先検証パラメータ

パラメータタイプ必要説明
validationURLstring✓ はいAppleが提供したURL onvalidatemerchant イベント
company_account_idstring✓ はいあなたのMONDOパートナーアカウントID
gateway_secret_keystring✓ はいあなたのMONDOパートナーシークレットキー
domain_namestring○ 条件付きお支払いドメイン (例: paynow.yoursite.com). サーバー間通信でブラウザのOriginヘッダーが利用できない場合に必要です。ブラウザから直接呼び出す場合は不要です。
サーバー間統合ノート:
バックエンドがマーチャント検証コールをプロキシする場合(つまり、ブラウザーが直接呼び出すのではなく、サーバーがMONDOを呼び出す場合)、次のものを含める必要があります domain_name Apple Payボタンが表示されるドメインに設定してください。これにより、Apple Payセッションがお支払いページのドメインと一致します。

📝 必要なパラメータ (支払処理)

パラメータタイプ説明
company_account_idstringあなたのMONDOパートナーアカウントID
gateway_secret_keystringあなたのMONDOパートナーシークレットキー
apple_pay_tokenobject暗号化済み トークン元 event.payment.token — pass directly to MONDO as-is (復号しないでください)
transaction_amountdecimal支払額(例:99.99)
transaction_currency_iso3string通貨コード (EUR, USD, GBP)
cardholder_email_addressstring顧客のメール

オプションパラメータ

パラメータ説明
partner_return_url_completed支払い成功時のリダイレクトURL
partner_return_url_rejected支払い拒否のリダイレクト用URL
partner_webhook_urlWebhook通知のURL
live_or_sandboxlive または 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"
}

応答フィールド

フィールド説明
statussuccess または error
transaction_statusCOMPLETED または 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つのテストモードをサポートしています。違いを理解することが成功した統合には重要です。

SANDBOX テスト用

何が起こるか

  • ✅ トークン構造が検証されました
  • ✅ すべての必須項目がチェックされました
  • ⏭️ 復号はスキップされました(モックデータが返されました)
  • ⏭️ CardCorp API コールはスキップされました
  • ✅ 支払い手続き完了
💡
キーポイント: 正しい形式のトークンを送信する必要があります - LIVEモードで要求されるのと同じ形式です。
LIVE 製作用

何が起こるか

  • ✅ トークン構造が検証されました
  • ✅ すべての必須項目がチェックされました
  • ✅ リアル暗号解読
  • ✅ リアルカードコープAPI処理
  • ✅ 本当のお金が請求されます
🔒
キーポイント: 実際のデバイスからの本物のApple PayトークンでのみLIVEモードを使用してください。

🎯 なぜSANDBOXは同じトークン構造が必要か

この設計により、SANDBOXからLIVEに切り替えると、コードの変更なしですぐに統合が機能します。

🧪
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.dataAppleからのBase64暗号化支払いデータ
paymentData.signatureBase64署名の検証
paymentData.header.ephemeralPublicKeyBase64 一時公開キー
paymentData.header.publicKeyHashBase64 ハッシュ マーチャントの公開鍵
paymentData.header.transactionId一意の取引識別子
paymentMethod.networkカードネットワーク(Visa、Mastercard、Amex)
paymentMethod.displayNameApple 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エンドポイントを照会した際に受け取る可能性のある最終ステータスです:

COMPLETED
支払い成功
REJECTED
プロセッサーにより支払いが拒否されました
CANCELED
ユーザーが支払いをキャンセルしました
FAILED
技術的なエラーが発生しました

中級ステータス

INITIATED

取引は作成されましたが、処理中です。これは以下の場合に発生します:

  • ユーザーが3Dセキュア認証を完了しています
  • カードネットワークで処理中です
  • ユーザーが支払い手続きを中断しました

取引状況を照会するタイミングは?

ベストプラクティス: 常にWebフックを主要な通知方法として依存してください。次の場合にのみ、/details エンドポイントをフォールバックとして問い合わせてください:
  • 予想される時間内にWebhookを受信していません(例:5分)
  • トランザクションのステータスを手動で確認する必要があります
  • Webhookエンドポイントが一時的に利用できませんでした

取引状況確認

トランザクションの状態を確認するには、詳細エンドポイントにPOSTリクエストを行います:

POST https://server-to-server.getmondo.co/details/

リクエストパラメータ

パラメータ 必要 説明
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の状態に移行します。