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

Cliente
Apple Pay
Você
MONDO
Feito

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
O que NÃO Precisa: Sem conta de desenvolvedor Apple, sem ID de comerciante Apple, sem certificados para gerenciar.

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_tokennão tente descriptografar
MONDO (PSP) Descriptografa o token usando nosso Certificado de Processamento de Pagamento Apple Pay e processa o pagamento com a CardCorp
Importante: Você nunca vê ou manipula números de cartões brutos. O token que você recebe da Apple é criptografado e só pode ser descriptografado pela MONDO usando nosso certificado de comerciante.

Escolha o Seu Método de Integração

Melhor para: Controle total sobre a aparência do botão Apple Pay e a experiência do usuário na sua própria página de checkout.

📋 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.

  1. Ir para GETMONDO.CO
  2. LoginDeveloperApple PayAdd Apple Pay Domain

🔄 Fluxo de Pagamento

1
Usuário Clica no Botão Apple Pay
No seu site
2
Folha do Apple Pay Abre
Interface Nativa do Apple Pay
3
Validação do Comerciante
A sua chamada JS aciona o ponto de validação do MONDO
4
Usuário Autentica
Face ID / Touch ID
5
Token Enviado para MONDO
POST to /payment/ with apple_pay_token
6
3D Secure & Redirecionar
Usuário redirecionado para URL de sucesso/falha

🔗 Ponto Final da API

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

Ponto de Validação do Comerciante

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

Parâmetros de Validação do Comerciante

ParâmetroTipoNecessárioDescrição
validationURLstring✓ SimA URL fornecida pela Apple no onvalidatemerchant evento
company_account_idstring✓ SimO seu ID de Conta Parceira MONDO
gateway_secret_keystring✓ SimA sua Chave Secreta de Parceiro MONDO
domain_namestring○ CondicionalO 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.
Nota de Integração Servidor-a-Servidor:
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âmetroTipoDescrição
company_account_idstringO seu ID de Conta Parceira MONDO
gateway_secret_keystringA sua Chave Secreta de Parceiro MONDO
apple_pay_tokenobjectCriptografado token de event.payment.token — pass directly to MONDO as-is (não decifrar)
transaction_amountdecimalValor do pagamento (ex.: 99,99)
transaction_currency_iso3stringCódigo de moeda (EUR, USD, GBP)
cardholder_email_addressstringE-mail do cliente

Parâmetros Opcionais

ParâmetroDescrição
partner_return_url_completedURL para redirecionamento de pagamento bem-sucedido
partner_return_url_rejectedURL para redirecionamento de pagamento rejeitado
partner_webhook_urlURL para notificações webhook
live_or_sandboxlive 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

CampoDescrição
statussuccess ou error
transaction_statusCOMPLETED ou REJECTED
gateway_session_idIdentificador único da sessão para esta transação
transaction_idIdentificador único de transação - use isso para correlacionar com callbacks
gateway_messageMensagem de status legível
redirect_urlURL para redirecionar usuário após pagamento (opcional - apenas para UX)
Processamento Instantâneo
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.

SANDBOX para testar

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
💡
Ponto Chave: Deve enviar um token estruturado corretamente - o mesmo formato exigido para o MODO AO VIVO.
LIVE Para Produção

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
🔒
Ponto Chave: Use apenas o modo AO VIVO com tokens reais do Apple Pay de dispositivos reais.

🎯 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.

🧪
SANDBOX
Teste com estrutura válida
Validado
Estrutura confirmada
🚀
LIVE
Funciona imediatamente

⚙️ 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âmetroValorResultado
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.

Importante: Enviando uma estrutura de token inválida (como apenas "***") 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.versionSempre EC_v1
paymentData.dataDados de pagamento criptografados em Base64 da Apple
paymentData.signatureAssinatura Base64 para verificação
paymentData.header.ephemeralPublicKeyChave pública efêmera Base64
paymentData.header.publicKeyHashHash Base64 da chave pública do comerciante
paymentData.header.transactionIdIdentificador único da transação
paymentMethod.networkRede de cartões (Visa, Mastercard, Amex)
paymentMethod.displayNameNome 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:

COMPLETED
Pagamento efetuado
REJECTED
Pagamento recusado pelo processador
CANCELED
Usuário cancelou pagamento
FAILED
Ocorreu um erro técnico

Estado Intermediário

INITIATED

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?

Melhor Prática: Sempre dependa de webhooks como seu método principal de notificação. Consulte o endpoint /details apenas como alternativa se:
  • 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:

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

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.