Como funciona

Como funciona PCI Proxy

Envie-nos os dados de cartão. Nós tokenizamo-los, guardamo-los no vault PCI DSS e devolvemos um token. Os seus sistemas nunca ficam com o número de cartão.

Fluxo de Dados

O fluxo em 5 passos

Desde o momento em que o cliente introduz o cartão até ao token que guarda no seu sistema: é o que acontece passo a passo.

Fase 1

Dados de cartão recebidos

Checkout no site, chamada API ou formulário do call center

Fase 2

PCI Proxy intercepta

Recebemos os dados de cartão do payload HTTP antes de chegarem aos seus servidores

Fase 3

Tokenização

Encriptamos o número de cartão e geramos um token único

Fase 4

Vault seguro

O número de cartão permanece encriptado no vault PCI DSS Nível 1, apenas na UE

Fase 5

Token para si

Recebe o token e utiliza-o para pagamentos, subscrições ou reembolsos

Tokenização

O que acontece quando tokenizamos

Substituímos o número de cartão por um token. Nunca vê o cartão em texto simples nos seus sistemas. Estes são os três passos internos.

01

Passo

Detetamos os dados de cartão

Analisamos os pedidos recebidos e identificamos os números de cartão, em JSON, formulário ou multipart. Não precisa de alterar o seu código: basta ligar o fluxo e está pronto.

02

Passo

Criamos o token

Cada token começa com tok_pci_eu_ e inclui os últimos quatro dígitos, o esquema e a data de validade. Assim pode mostrar na interface "Visa terminando em 1234" sem ter o número de cartão.

03

Passo

Mesmo token, mesmo cartão

Se o mesmo cartão chegar novamente, devolvemos o mesmo token. Útil para subscrições e cartões já guardados. O mapeamento permanece apenas no vault, não é exposto via API.

pci-proxy · exemplo em vivo ATIVO

→ POST /v1/tokenize

{

"card_number": "4111 1111 1111 1234",

"expiry": "12/26"

}

AES-256 · vault UE

← 200 OK · 47ms

{

"token": "tok_pci_eu_a1b2c3d4e5f61234",

"last_four": "1234",

"brand": "visa",

"card_in_your_systems": false

}

Número de cartão nunca nos seus servidores · Vault na UE · Registado
Recuperação de cartão

Quando o número de cartão é necessário

Para autorizar um pagamento, o PSP precisa do número de cartão real. Envia o token: nós recuperamos o cartão do vault e encaminhamo-lo de forma segura. Nunca o vê.

1

Quando acontece

Quando precisa de cobrar um cartão guardado, envia o token para o nosso endpoint forward. Nós resolvemos o número de cartão no vault e passamo-lo ao PSP por ligação encriptada. Não aparece nos seus registos.

2

Quem pode fazê-lo

Apenas quem tiver uma chave API com permissão forward ou detokenize. Pode restringir por IP, ambiente e volume de pedidos.

3

Totalmente auditado

Cada recuperação fica registada: quem solicitou, quando e para que PSP. Os registos são conservados pelo menos 12 meses e podem ser consultados a partir do dashboard ou da API.

Níveis de proteção

Nível 1 Chave API assinada

Cada pedido é autenticado

Nível 2 Lista branca de IPs

Apenas a partir dos seus servidores autorizados

Nível 3 Ligação encriptada ao PSP

TLS com certificados verificados

Nível 4 Registos de auditoria

Conservados pelo menos 12 meses

API

Dois endpoints, fluxo claro

Autentique-se com a sua chave API. Um endpoint cria o token, o outro usa-o para pagar. JSON de entrada, JSON de saída.

POST /v1/tokenize Scope: tokenize

Corpo do pedido

{
  "card_number": "4111111111111111",
  "expiry":      "12/26",
  "cvv":         "123"
}

Resposta 200 OK

{
  "token":      "tok_pci_eu_a1b2c3d4e5f6",
  "last_four": "1111",
  "brand":     "visa",
  "expires_at": "2026-12-31"
}
POST /v1/forward Scope: forward

Corpo do pedido

{
  "token":      "tok_pci_eu_a1b2c3d4e5f6",
  "target_url": "https://psp.eu/charge",
  "amount":     9900,
  "currency":   "EUR"
}

Resposta (do PSP, proxiada)

{
  "status":         "authorized",
  "transaction_id": "txn_9f8e7d6c",
  "amount":         9900,
  "currency":       "EUR"
}
Pedidos assinados
Latência média inferior a 50 ms
REST + Webhooks
Eventos em Tempo Real

Webhooks e notificações

Quando acontece algo (token criado, pagamento enviado, erro), enviamos um evento em tempo real para o seu endpoint. Cada mensagem está assinada: pode verificá-la no servidor.

Se a entrega falhar, tentamos novamente até 5 vezes com intervalos crescentes. Também pode reenviar manualmente a partir do dashboard nas 72 horas seguintes.

Tipos de Eventos Suportados

token.created Novo token gerado
token.used Token enviado ao PSP
token.expired Token atingiu o TTL
token.deleted Token eliminado a pedido
forward.success PSP devolveu 2xx
forward.failure PSP devolveu erro

Exemplo de Payload Webhook

POST o-seu-servidor.com/webhooks/pci LIVE
{
  "event":     "token.created",
  "timestamp": "2026-04-03T10:15:30Z",
  "data": {
    "token":       "tok_pci_eu_a1b2c3d4e5f6",
    "last_four":   "1111",
    "brand":       "visa",
    "merchant_id": "mrc_xyz789"
  },
  "signature": "sha256=4a8b9c..."  // HMAC-SHA256
}

Verificação de assinatura

Cada webhook inclui o cabeçalho X-PCI-Signature. Calcule o HMAC-SHA256 do body com o seu secret e compare com a assinatura. Se não coincidir, rejeite o pedido.

Anti-replay Assinatura verificável 5 tentativas automáticas
Integração

SDKs e formas de integrar

SDKs para Node, Python e PHP, ou campos hosted em iFrame. Escolha o que se adapta à sua stack.

JS

SDK JavaScript

npm
import PCIProxy from '@pci-proxy-eu/js';

const pci = new PCIProxy({
  merchantId: 'mrc_xyz789'
});

const { token } = await pci.tokenize({
  cardNumber: '4111...'
});
Node.js 18+ · Browser · TypeScript incluído
PY

SDK Python

PyPI
from pci_proxy_eu import Client

client = Client(
  merchant_id="mrc_xyz789",
  api_key="sk_live_..."
)

result = client.tokenize(
  card_number="4111..."
)
Python 3.9+ · AsyncClient disponível
PHP

SDK PHP

Composer
use PCIProxyEU\Client;

$client = new Client(
  merchantId: 'mrc_xyz789',
  apiKey: 'sk_live_...'
);

$result = $client->tokenize([
  'card_number' => '4111...'
]);
PHP 8.1+ · Java e .NET disponíveis
Campos hosted

iFrames seguros para o checkout

Para se manter em SAQ A: os campos de cartão são renderizados nos nossos iFrames. Os dados de cartão nunca passam pelo seu DOM.

hosted-fields.html
<div id="card-number"></div>
<div id="card-expiry"></div>
<div id="card-cvv"></div>

<script>
  PCIProxy.hostedFields({
    merchantId: 'mrc_xyz789',
    fields: {
      cardNumber: '#card-number',
      expiry:     '#card-expiry',
      cvv:        '#card-cvv'
    },
    onTokenize: (result) => {
      // apenas token, nunca o número de cartão
      console.log(result.token);
    }
  });
</script>
checkout.a-sua-loja.com

Dados de Pagamento

4111 1111 1111 •••• iFrame
12/27 iFrame
••• iFrame

Dados de cartão nunca no seu servidor

SAQ A

Menos obrigações PCI

CSS

Estilo personalizável

Mobile

Responsive

Pronto para integrar?

Saiba o que é um PCI Proxy, aprofunde-se na tokenização ou veja como os programadores utilizam a plataforma.