Panoramica

Cos'è

Accetta pagamenti Apple Pay tramite MONDO

Ciò che Serve

ID Account MONDO + Chiave Segreta

Ciò che invii

Token Apple Pay + importo + valuta

Cosa Ottieni

STATO COMPLETATO o RIFIUTATO

Come Funziona

Cliente
Apple Pay
Tu
MONDO
Fatto

Opzione A: Autogestito

Visualizza il pulsante Apple Pay sul tuo sito e inviaci il token

Opzione B: Ospitato da MONDO

Gestiamo tutto - reindirizza il tuo cliente a noi

Avvio Rapido (Autogestito)

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"
}

Su Apple Pay

Apple Pay offre un modo veloce, sicuro e privato per i clienti di pagare. Con MONDO come tuo fornitore di servizi di pagamento (PSP), puoi accettare Apple Pay senza necessità di avere un tuo account sviluppatore Apple.

MONDO come il tuo PSP

  • MONDO possiede l'ID Commerciante Apple
  • MONDO gestisce i certificati Apple Pay
  • MONDO gestisce la convalida del commerciante
  • MONDO decodifica ed elabora token di pagamento
Cosa NON ti serve: Nessun account sviluppatore Apple, nessun ID commerciante Apple, nessun certificato da gestire.

Gestione Token — Chi fa cosa?

Apple Pay utilizza la crittografia end-to-end per proteggere i dati dei titolari di carta. Ecco come sono divise le responsabilità:

Apple (Dispositivo del cliente) Genera un token di pagamento crittografato contenente dati della carta, criptogramma e dettagli di autenticazione
Tu (Commerciante) Passa il token crittografato direttamente a MONDO tramite il parametro apple_pay_tokenNON tentare di decifrare
MONDO (PSP) Decodifica il token usando il nostro Certificato di Elaborazione Pagamenti Apple Pay e gestisce il pagamento con CardCorp
Importante: Non vedi né gestisci numeri di carta grezzi. Il token che ricevi da Apple è criptato e può essere decifrato solo da MONDO utilizzando il nostro certificato commerciale.

Scegli il Metodo di Integrazione

Migliore per: Controllo completo sull'aspetto e sull'esperienza utente del pulsante Apple Pay nella tua pagina di checkout.

📋 Prerequisiti

  • ID Account Partner - Il tuo identificativo unico dell'account MONDO
  • Chiave Segreta Partner - La tua chiave di autenticazione API
  • HTTPS - Il tuo sito web deve utilizzare HTTPS

⚠️ Verifica Dominio Richiesta

Il tuo dominio deve essere registrato con Apple tramite MONDO. Questa è un'impostazione una tantum.

  1. Vai a GETMONDO.CO
  2. LoginDeveloperApple PayAdd Apple Pay Domain

🔄 Flusso di Pagamento

1
L'utente clicca su Apple Pay
Sul tuo sito web
2
Apertura Scheda Apple Pay
Interfaccia nativa Apple Pay
3
Convalida Commerciante
La tua chiamata JS al punto di convalida di MONDO
4
Autenticazione Utente
Face ID / Touch ID
5
Token inviato a MONDO
POST to /payment/ with apple_pay_token
6
3D Secure & Reindirizzamento
Utente reindirizzato all'URL di successo/errore

🔗 Punto di accesso API

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

Punto di Validazione Commerciante

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

Parametri di Validazione Commerciante

ParametroTipoRichiestoDescrizione
validationURLstring✓ SìL'URL fornito da Apple in ita onvalidatemerchant evento
company_account_idstring✓ SìIl tuo ID Account Partner MONDO
gateway_secret_keystring✓ SìLa tua chiave segreta MONDO Partner
domain_namestring○ CondizionaleIl tuo dominio Apple Pay (ad es. paynow.yoursite.com). Richiesto per chiamate server-to-server dove l'intestazione Origin del browser non è disponibile. Non necessario se la chiamata proviene direttamente dal browser.
Nota di integrazione Server-to-Server:
Se il tuo backend fa da proxy per la chiamata di validazione del commerciante (ovvero il tuo server chiama MONDO invece che il browser direttamente), devi includere domain_name imposta sul dominio dove è visualizzato il tuo pulsante Apple Pay. Questo garantisce che la sessione Apple Pay corrisponda al dominio della tua pagina di pagamento.

📝 Parametri Richiesti (Elaborazione Pagamento)

ParametroTipoDescrizione
company_account_idstringIl tuo ID Account Partner MONDO
gateway_secret_keystringLa tua chiave segreta MONDO Partner
apple_pay_tokenobjectCriptato token da event.payment.token — passa direttamente a MONDO così com'è (non decifrare)
transaction_amountdecimalImporto pagamento (es. 99,99)
transaction_currency_iso3stringCodice valuta (EUR, USD, GBP)
cardholder_email_addressstringE-mail del cliente

Parametri Opzionali

ParametroDescrizione
partner_return_url_completedURL per reindirizzamento pagamento riuscito
partner_return_url_rejectedURL per reindirizzamento pagamento rifiutato
partner_webhook_urlURL per notifiche webhook
live_or_sandboxlive o sandbox

📤 Risposta API

I pagamenti con Apple Pay vengono elaborati immediatamente. La risposta contiene lo stato finale della transazione:

{
    "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"
}

Campi di risposta

CampoDescrizione
statussuccess o error
transaction_statusCOMPLETED o REJECTED
gateway_session_idIdentificativo unico della sessione per questa transazione
transaction_idIdentificativo unico transazione - utilizzalo per correlare con le callback
gateway_messageMessaggio di stato leggibile
redirect_urlURL per reindirizzare l'utente dopo il pagamento (opzionale - solo per UX)
Elaborazione Istantanea
A differenza dei pagamenti con carta che richiedono un reindirizzamento 3D Secure, le transazioni con Apple Pay sono elaborate istantaneamente. Il pagamento è già completato quando ricevi la risposta.

🍎 Integrazione Apple Pay JS

Passaggio 1: Aggiungi pulsante Apple Pay

<apple-pay-button buttonstyle="black" type="plain" locale="en" onclick="startApplePayPayment()"></apple-pay-button>

Passaggio 2: Verifica Disponibilità

if (window.ApplePaySession && ApplePaySession.canMakePayments()) {
    document.getElementById('apple-pay-button').style.display = 'block';
}

Passaggio 3: Implementazione Completa

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();
}

Modalità di Test

MONDO supporta due modalità di test. Comprendere la differenza è cruciale per un'integrazione di successo.

SANDBOX per testare

Cosa Succede

  • ✅ La struttura del token è validata
  • ✅ Tutti i campi richiesti sono stati controllati
  • ⏭️ La decrittazione è saltata (dati simulati restituiti)
  • ⏭️ La chiamata API CardCorp è saltata
  • ✅ Il flusso di pagamento completo è eseguito
💡
Punto Chiave: Devi inviare un token strutturato correttamente - lo stesso formato richiesto per la modalità LIVE.
LIVE Per la Produzione

Cosa Succede

  • ✅ La struttura del token è validata
  • ✅ Tutti i campi richiesti sono stati controllati
  • ✅ Decrittografia crittografica reale
  • ✅ Elaborazione API Real CardCorp
  • ✅ Denaro reale addebitato
🔒
Punto Chiave: Usa solo la modalità LIVE con token Apple Pay reali da dispositivi effettivi.

🎯 Perché SANDBOX Richiede la Stessa Struttura di Token

Questo design garantisce che quando passi da SANDBOX a LIVE, la tua integrazione funzioni immediatamente senza modifiche al codice.

🧪
SANDBOX
Test con struttura valida
Convalidato
Struttura confermata
🚀
LIVE
Funziona immediatamente

⚙️ Impostazione Modalità

Includi live_or_sandbox parametro nella tua richiesta 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: Forza Risultato Transazione

In modalità SANDBOX, puoi forzare un esito specifico della transazione per testare:

ParametroValoreRisultato
sandbox_force_transaction_status COMPLETED ✅ Pagamento approvato
sandbox_force_transaction_status REJECTED ❌ Pagamento rifiutato

Struttura Token Apple Pay

Il token di Apple Pay deve avere la seguente struttura. Questo vale sia per la modalità SANDBOX che per la modalità LIVE.

Importante: Invio di una struttura di token non valida (come solo "***") risulterà in un errore, anche in modalità SANDBOX.

Struttura Token Richiesta

{
    "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"
}

Descrizioni dei campi

Campo Richiesto Descrizione
paymentData.versionSempre EC_v1
paymentData.dataDati di pagamento criptati in Base64 da Apple
paymentData.signatureFirma Base64 per la verifica
paymentData.header.ephemeralPublicKeyChiave pubblica effimera Base64
paymentData.header.publicKeyHashHash Base64 della chiave pubblica del commerciante
paymentData.header.transactionIdIdentificatore unico transazione
paymentMethod.networkRete di carte (Visa, Mastercard, Amex)
paymentMethod.displayNameNome visualizzato da Apple Wallet

= Richiesto  |  = Consigliato

Token di Prova Sandbox

Copia questo token per il test SANDBOX. I valori criptati non devono essere reali - viene validata solo la struttura.

{
    "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"
}

Errori Comuni dei Token

Errore Causa Soluzione
Invalid token format Il token non è un oggetto JSON Invia token come oggetto, non stringa
Missing paymentData Il token non ha la proprietà paymentData Includi token completo da Apple Pay JS
Missing header fields chiavePubblicaEffimera, hashChiavePubblica o idTransazione mancante Assicurati che tutti i campi dell'intestazione siano presenti

Da dove proviene il token?

In modalità LIVE, il token proviene da Apple Pay JS quando l'utente autorizza il pagamento:

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
            ...
        })
    });
};

Stato Transazione

Comprensione degli stati delle transazioni e come interrogarli è essenziale per un'integrazione completa.

Stati Finali Transazione

Questi sono i possibili stati finali che riceverai tramite webhook o quando interroghi l'endpoint /details:

COMPLETED
Pagamento riuscito
REJECTED
Pagamento rifiutato dall'elaboratore
CANCELED
Pagamento annullato dall'utente
FAILED
Errore tecnico

Stato Intermedio

INITIATED

La transazione è stata creata ma è ancora in elaborazione. Questo può accadere quando:

  • L'utente sta completando l'autenticazione 3D Secure
  • Il pagamento è in elaborazione dalla rete delle carte
  • L'utente ha abbandonato il processo di pagamento

Quando verificare lo stato della transazione?

Migliore Pratica: Affidati sempre ai webhook come metodo principale di notifica. Interroga l'endpoint /details solo come alternativa se:
  • Non hai ricevuto un webhook nel tempo previsto (ad es., 5 minuti)
  • Devi verificare manualmente lo stato della transazione
  • Il tuo endpoint webhook non era temporaneamente disponibile

Stato Transazione

Per controllare lo stato di una transazione, effettua una richiesta POST all'endpoint dei dettagli:

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

Parametri Richiesta

Parametro Richiesto Descrizione
company_account_id Il tuo ID Account Partner MONDO
gateway_secret_key La tua chiave segreta MONDO Partner
gateway_session_id L'ID sessione restituito dalla richiesta di pagamento iniziale

Richiesta Esempio

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"
  }'

Risposta Esempio

{
    "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"
}

Ricezione Aggiornamenti Stato

Ci sono due modi per ricevere lo stato finale della transazione:

Metodo Come Funziona Quando usare
Webhook Consigliato MONDO invia una richiesta POST al tuo partner_webhook_url Metodo principale - automatico, in tempo reale
Redirect URL L'utente è reindirizzato al tuo partner_return_url_completed o partner_return_url_rejected Per conferma utente
Query /details Effettui una richiesta POST per controllare lo stato Fallback se webhook non ricevuto

Se Transazione Resta INIZIATA

Se una transazione rimane in stato INIZIATO per più di 15 minuti, probabilmente significa:

  • L'utente ha abbandonato la sfida 3D Secure
  • L'utente ha chiuso il browser durante il pagamento
  • Si è verificato un problema di rete durante l'elaborazione

Azione: Interroga il punto /details per ottenere lo stato corrente. Queste transazioni alla fine andranno in timeout e passeranno allo stato FAILED o CANCELED.