Visão Geral
O Que É
Aceitar pagamentos Apple Pay através do MONDO
O Que Você Precisa
ID de Conta MONDO + Chave Secreta
O Que Você Envia
Token do Apple Pay + valor + moeda
O Que Recebe
ESTADO COMPLETADO ou REJEITADO
Como Funciona
Opção A: Auto-Hospedado
Exibe o botão Apple Pay no teu site e envia-nos o token
Opção B: Hospedado pela MONDO
Nós tratamos de tudo - apenas redirecione seu cliente para nós
Início Rápido (Auto-Hospedado)
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"
}
Sobre o Apple Pay
O Apple Pay oferece uma forma rápida, segura e privada para os clientes pagarem. Com a MONDO como seu Provedor de Serviços de Pagamento (PSP), você pode aceitar o Apple Pay sem precisar de uma conta de Desenvolvedor Apple própria.
MONDO como Seu PSP
- ✓ A MONDO possui o ID de Comerciante Apple
- ✓ MONDO gere certificados Apple Pay
- ✓ MONDO lida com validação de comerciante
- ✓ MONDO descriptografa e processa tokens de pagamento
Tratamento de Token — Quem Faz O Quê?
O Apple Pay utiliza criptografia de ponta a ponta para proteger os dados do titular do cartão. Veja como as responsabilidades são divididas:
| Apple (Dispositivo do Cliente) | Gera um token de pagamento criptografado contendo dados do cartão, criptograma e detalhes de autenticação |
| Você (Comerciante) | Passe o token criptografado diretamente para o MONDO através do parâmetro apple_pay_token — não tente descriptografar |
| MONDO (PSP) | Descriptografa o token usando nosso Certificado de Processamento de Pagamento Apple Pay e processa o pagamento com a CardCorp |
Escolha o Seu Método de Integração
📋 Pré-requisitos
- ✓ ID da Conta Parceira - O seu identificador único da conta MONDO
- ✓ Chave Secreta do Parceiro - A sua chave de autenticação API
- ✓ HTTPS - O seu site deve usar HTTPS
⚠️ Verificação de Domínio Necessária
O seu domínio deve ser registrado na Apple através do MONDO. Esta é uma configuração única.
- Ir para GETMONDO.CO
- Login → Developer → Apple Pay → Add Apple Pay Domain
🔄 Fluxo de Pagamento
No seu site
Interface Nativa do Apple Pay
A sua chamada JS aciona o ponto de validação do MONDO
Face ID / Touch ID
POST to /payment/ with apple_pay_token
Usuário redirecionado para URL de sucesso/falha
🔗 Ponto Final da API
Ponto de Validação do Comerciante
Parâmetros de Validação do Comerciante
| Parâmetro | Tipo | Necessário | Descrição |
|---|---|---|---|
| validationURL | string | ✓ Sim | A URL fornecida pela Apple no onvalidatemerchant evento |
| company_account_id | string | ✓ Sim | O seu ID de Conta Parceira MONDO |
| gateway_secret_key | string | ✓ Sim | A sua Chave Secreta de Parceiro MONDO |
| domain_name | string | ○ Condicional | O seu domínio Apple Pay (por exemplo, paynow.yoursite.com). Necessário para chamadas de servidor para servidor onde o cabeçalho de Origem do navegador não está disponível. Não necessário se a chamada for feita diretamente do navegador. |
Se o seu backend faz proxy da chamada de validação do comerciante (ou seja, o seu servidor chama o MONDO em vez do navegador chamar diretamente), você deve incluir
domain_name definido para o domínio onde o seu botão Apple Pay é exibido. Isso garante que a sessão Apple Pay corresponda ao domínio da sua página de pagamento. 📝 Parâmetros Necessários (Processamento de Pagamento)
| Parâmetro | Tipo | Descrição |
|---|---|---|
| company_account_id | string | O seu ID de Conta Parceira MONDO |
| gateway_secret_key | string | A sua Chave Secreta de Parceiro MONDO |
| apple_pay_token | object | Criptografado token de event.payment.token — pass directly to MONDO as-is (não decifrar) |
| transaction_amount | decimal | Valor do pagamento (ex.: 99,99) |
| transaction_currency_iso3 | string | Código de moeda (EUR, USD, GBP) |
| cardholder_email_address | string | E-mail do cliente |
Parâmetros Opcionais
| Parâmetro | Descrição |
|---|---|
| partner_return_url_completed | URL para redirecionamento de pagamento bem-sucedido |
| partner_return_url_rejected | URL para redirecionamento de pagamento rejeitado |
| partner_webhook_url | URL para notificações webhook |
| live_or_sandbox | live ou sandbox |
📤 Resposta da API
Os pagamentos com Apple Pay são processados imediatamente. A resposta contém o status final da transação:
{
"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"
}
Campos de Resposta
| Campo | Descrição |
|---|---|
| status | success ou error |
| transaction_status | COMPLETED ou REJECTED |
| gateway_session_id | Identificador único da sessão para esta transação |
| transaction_id | Identificador único de transação - use isso para correlacionar com callbacks |
| gateway_message | Mensagem de status legível |
| redirect_url | URL para redirecionar usuário após pagamento (opcional - apenas para UX) |
Ao contrário dos pagamentos com cartão que requerem redirecionamento 3D Secure, as transações com Apple Pay são processadas instantaneamente. O pagamento já está completo quando você recebe a resposta.
🍎 Integração do Apple Pay JS
Passo 1: Adicionar Botão Apple Pay
<apple-pay-button buttonstyle="black" type="plain" locale="en" onclick="startApplePayPayment()"></apple-pay-button>
Etapa 2: Verificar Disponibilidade
if (window.ApplePaySession && ApplePaySession.canMakePayments()) {
document.getElementById('apple-pay-button').style.display = 'block';
}
Etapa 3: Concluir Implementação
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();
}
Modos de Teste
MONDO suporta dois modos de teste. Compreender a diferença é crucial para uma integração bem-sucedida.
O que Acontece
- ✅ A estrutura do token está validada
- ✅ Todos os campos obrigatórios foram verificados
- ⏭️ A descriptografia foi ignorada (dados fictícios retornados)
- ⏭️ A chamada à API CardCorp foi ignorada
- ✅ O fluxo completo de pagamento foi executado
O que Acontece
- ✅ A estrutura do token está validada
- ✅ Todos os campos obrigatórios foram verificados
- ✅ Descriptografia real
- ✅ Processamento Real da API CardCorp
- ✅ Dinheiro real é cobrado
🎯 Por que o SANDBOX Requer a Mesma Estrutura de Token
Este design garante que ao mudar de SANDBOX para LIVE, sua integração funcione imediatamente sem alterações no código.
⚙️ Definindo o Modo
Incluir live_or_sandbox parâmetro no seu pedido de 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: Forçar Resultado da Transação
No modo SANDBOX, você pode forçar um resultado específico de transação para teste:
| Parâmetro | Valor | Resultado |
|---|---|---|
| sandbox_force_transaction_status | COMPLETED |
✅ Pagamento aprovado |
| sandbox_force_transaction_status | REJECTED |
❌ Pagamento recusado |
Estrutura do Token Apple Pay
O token do Apple Pay deve ter a seguinte estrutura. Isso é o mesmo para os modos SANDBOX e LIVE.
"***") resultará em um erro, mesmo no modo SANDBOX. Estrutura de Token Necessária
{
"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"
}
Descrições dos Campos
| Campo | Necessário | Descrição |
|---|---|---|
| paymentData.version | ✓ | Sempre EC_v1 |
| paymentData.data | ✓ | Dados de pagamento criptografados em Base64 da Apple |
| paymentData.signature | ✓ | Assinatura Base64 para verificação |
| paymentData.header.ephemeralPublicKey | ✓ | Chave pública efêmera Base64 |
| paymentData.header.publicKeyHash | ✓ | Hash Base64 da chave pública do comerciante |
| paymentData.header.transactionId | ✓ | Identificador único da transação |
| paymentMethod.network | ○ | Rede de cartões (Visa, Mastercard, Amex) |
| paymentMethod.displayName | ○ | Nome exibido no Apple Wallet |
✓ = Necessário | ○ = Recomendado
Token de Teste Sandbox
Copie este token para testes em SANDBOX. Os valores criptografados não precisam ser reais - apenas a estrutura é validada.
{
"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"
}
Erros Comuns de Token
| Erro | Causa | Solução |
|---|---|---|
| Invalid token format | O token não é um objeto JSON | Envie o token como objeto, não como string |
| Missing paymentData | O token não possui a propriedade paymentData | Incluir token completo do Apple Pay JS |
| Missing header fields | chavePúblicaEfêmera, hashDaChavePública ou idDaTransação ausente | Certifique-se de que todos os campos do cabeçalho estão presentes |
De onde vem o Token?
No modo AO VIVO, o token vem do Apple Pay JS quando o usuário autoriza o 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
...
})
});
};
Estado da Transação
Compreender os estados das transações e como consultá-los é essencial para uma integração completa.
Status Finais da Transação
Estes são os possíveis status finais que você receberá via webhook ou ao consultar o endpoint /details:
Estado Intermediário
A transação foi criada, mas ainda está sendo processada. Isso pode acontecer quando:
- O usuário está completando a autenticação 3D Secure
- O pagamento está sendo processado pela rede do cartão
- O usuário abandonou o fluxo de pagamento
Quando Deve Consultar o Estado da Transação?
- Não recebeu um webhook no tempo esperado (por exemplo, 5 minutos)
- Você precisa verificar o status da transação manualmente
- O seu endpoint de webhook estava temporariamente indisponível
Estado da Transação
Para verificar o status de uma transação, faça uma solicitação POST para o endpoint de detalhes:
Parâmetros de Solicitação
| Parâmetro | Necessário | Descrição |
|---|---|---|
| company_account_id | ✓ | O seu ID de Conta Parceira MONDO |
| gateway_secret_key | ✓ | A sua Chave Secreta de Parceiro MONDO |
| gateway_session_id | ✓ | O ID da sessão retornado da solicitação de pagamento inicial |
Pedido de Exemplo
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"
}'
Resposta Exemplo
{
"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"
}
Recebendo Atualizações de Status
Existem duas formas de receber o status final da transação:
| Método | Como Funciona | Quando Usar |
|---|---|---|
| Webhook Recomendado | MONDO envia um pedido POST para o seu partner_webhook_url |
Método principal - automático, em tempo real |
| Redirect URL | O usuário é redirecionado para o seu partner_return_url_completed ou partner_return_url_rejected |
Para confirmação do usuário |
| Query /details | Você faz uma solicitação POST para verificar o status | Fallback se webhook não recebido |
Se Transação Permanecer INICIADA
Se uma transação permanecer no status INICIADO por mais de 15 minutos, provavelmente significa:
- O usuário abandonou o desafio 3D Secure
- O usuário fechou o navegador durante o pagamento
- Houve um problema de rede durante o processamento
Ação: Consulte o endpoint /details para obter o status atual. Essas transações eventualmente expirarão e passarão para o status FALHADO ou CANCELADO.