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
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
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_token — NON tentare di decifrare |
| MONDO (PSP) | Decodifica il token usando il nostro Certificato di Elaborazione Pagamenti Apple Pay e gestisce il pagamento con CardCorp |
Scegli il Metodo di Integrazione
📋 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.
- Vai a GETMONDO.CO
- Login → Developer → Apple Pay → Add Apple Pay Domain
🔄 Flusso di Pagamento
Sul tuo sito web
Interfaccia nativa Apple Pay
La tua chiamata JS al punto di convalida di MONDO
Face ID / Touch ID
POST to /payment/ with apple_pay_token
Utente reindirizzato all'URL di successo/errore
🔗 Punto di accesso API
Punto di Validazione Commerciante
Parametri di Validazione Commerciante
| Parametro | Tipo | Richiesto | Descrizione |
|---|---|---|---|
| validationURL | string | ✓ Sì | L'URL fornito da Apple in ita onvalidatemerchant evento |
| company_account_id | string | ✓ Sì | Il tuo ID Account Partner MONDO |
| gateway_secret_key | string | ✓ Sì | La tua chiave segreta MONDO Partner |
| domain_name | string | ○ Condizionale | Il 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. |
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)
| Parametro | Tipo | Descrizione |
|---|---|---|
| company_account_id | string | Il tuo ID Account Partner MONDO |
| gateway_secret_key | string | La tua chiave segreta MONDO Partner |
| apple_pay_token | object | Criptato token da event.payment.token — passa direttamente a MONDO così com'è (non decifrare) |
| transaction_amount | decimal | Importo pagamento (es. 99,99) |
| transaction_currency_iso3 | string | Codice valuta (EUR, USD, GBP) |
| cardholder_email_address | string | E-mail del cliente |
Parametri Opzionali
| Parametro | Descrizione |
|---|---|
| partner_return_url_completed | URL per reindirizzamento pagamento riuscito |
| partner_return_url_rejected | URL per reindirizzamento pagamento rifiutato |
| partner_webhook_url | URL per notifiche webhook |
| live_or_sandbox | live 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
| Campo | Descrizione |
|---|---|
| status | success o error |
| transaction_status | COMPLETED o REJECTED |
| gateway_session_id | Identificativo unico della sessione per questa transazione |
| transaction_id | Identificativo unico transazione - utilizzalo per correlare con le callback |
| gateway_message | Messaggio di stato leggibile |
| redirect_url | URL per reindirizzare l'utente dopo il pagamento (opzionale - solo per UX) |
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.
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
Cosa Succede
- ✅ La struttura del token è validata
- ✅ Tutti i campi richiesti sono stati controllati
- ✅ Decrittografia crittografica reale
- ✅ Elaborazione API Real CardCorp
- ✅ Denaro reale addebitato
🎯 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.
⚙️ 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:
| Parametro | Valore | Risultato |
|---|---|---|
| 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.
"***") 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.version | ✓ | Sempre EC_v1 |
| paymentData.data | ✓ | Dati di pagamento criptati in Base64 da Apple |
| paymentData.signature | ✓ | Firma Base64 per la verifica |
| paymentData.header.ephemeralPublicKey | ✓ | Chiave pubblica effimera Base64 |
| paymentData.header.publicKeyHash | ✓ | Hash Base64 della chiave pubblica del commerciante |
| paymentData.header.transactionId | ✓ | Identificatore unico transazione |
| paymentMethod.network | ○ | Rete di carte (Visa, Mastercard, Amex) |
| paymentMethod.displayName | ○ | Nome 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:
Stato Intermedio
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?
- 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:
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.