Cartão Cobrança no cartão
Como criar uma cobrança no cartão de crédito.
1. Tokenize o cartão
token resultante.
A tokenização acontece no checkout do provedor (ex. Pagar.me). O resultado
é um payment_token (Pagar.me) que você usa na cobrança.
2. Autentique com 3DS (opcional)
3ds-nx-js
v2) ou do seu autenticador externo. A PayGrid não faz o desafio
e não vê dados do cartão: no MPI Pagar.me/Stone ela gera o
token efêmero; nos dois casos ela recebe o resultado da autenticação,
grava para auditoria e uso único e repassa ao gateway na criação da
cobrança.
São três passos. Pule esta seção se a cobrança não usar 3DS: sem o
bloco threeDS, o pedido sai sem autenticação, como sempre.
2.1 Gere o token efêmero (MPI Pagar.me/Stone)
Chame POST /v1/3ds/pagarme/token do seu backend com a API
key do tenant. A PayGrid resolve a conta indicada em
providerAccountLogicalId (o logicalId da sua
conta Pagar.me em GET /v1/providers/accounts) e chama o
serviço de 3DS da Pagar.me/Stone. A secret key da conta nunca
sai do servidor da PayGrid; você recebe apenas o token
efêmero.
curl -X POST https://api.paygrid.tech/v1/3ds/pagarme/token \
-H "X-Api-Key: sk_sua_chave" \
-H "Content-Type: application/json" \
-d '{
"providerAccountLogicalId": "merchant-primary",
"amount": 59900,
"currency": "BRL"
}'
{
"token": "tds_abc123...",
"expiresAt": "2026-10-22T13:30:00Z",
"environment": "production"
}
Esse token é de uso único e diferente do token do
cartão (tok_...): ele autentica a transação 3DS, não o
cartão. Entregue-o ao SDK no cliente para rodar o desafio.
2.2 Envie o resultado na cobrança
Terminado o desafio, o SDK devolve o resultado da autenticação. Envie-o
no campo threeDS ao criar a cobrança — a PayGrid valida
apenas a forma do objeto (campos obrigatórios de cada
MPI), grava o resultado para auditoria e uso único e repassa ao
gateway. Quem decide se o portador autenticou é o emissor, não a
PayGrid.
"threeDS": {
"mpi": "pagarme",
"transactionId": "tds_abc123..."
}
Para um autenticador externo (MPI third_party), o desafio
é do seu provedor e a PayGrid só recebe os artefatos:
"threeDS": {
"mpi": "third_party",
"eci": "05",
"cavv": "AAAB...",
"dsTransactionId": "7f3c...",
"version": "2.2.0"
}
| Campo | Obrigatório | Descrição |
|---|---|---|
mpi | sim | pagarme (3DS da Stone/Pagar.me) ou third_party (autenticador externo). |
transactionId | mpi = pagarme | Id da autenticação devolvido pelo SDK da Pagar.me/Stone (tds_server_trans_id). |
eci | mpi = third_party | Indicator de autenticação emitido pelo autenticador externo. |
cavv | mpi = third_party | Criptograma de autenticação do portador. |
dsTransactionId | mpi = third_party | Id da transação no servidor de diretório (DS). |
version | mpi = third_party | Versão do protocolo 3DS (ex. 2.2.0). |
threeDS só vale para cartão — em
Pix a cobrança é recusada com erro de validação. A PayGrid grava o
resultado da autenticação (MPI, ids, eci/cavv
e versão) para auditoria e para garantir uso único:
reenviar a mesma autenticação devolve 409 e exige um novo
token e um novo desafio. Os dados do cartão continuam fora da PayGrid.
O 3DS não muda a resposta da criação da cobrança: o desfecho chega como
approved ou declined pelo webhook ou pela
consulta. Se o gateway devolver o pagamento como
action_required, o evento
payment.action_required sinaliza que o portador ainda
precisa agir.
Consultar a autenticação depois
GET /v1/transactions/{id} e GET /v1/payments/{id}
devolvem o bloco threeDS com o resultado da autenticação
daquela cobrança. O cavv nunca volta.
"threeDS": {
"mpi": "pagarme",
"authenticationId": "tds_server_trans_id_do_sdk",
"eci": "05",
"version": "2.2.0",
"authenticatedAt": "2026-10-26T15:04:05Z"
}
authenticationId é o transactionId para
pagarme e o dsTransactionId para
third_party. O eci depende da bandeira: em
Visa, Elo e Amex, 05 = autenticada, 06 =
tentativa e 07 = sem autenticação; em Mastercard,
02, 01 e 00, na mesma ordem.
Sem 3DS, o bloco não aparece — e também não aparece nas cobranças
criadas antes de 26/10/2026.
3. Crie a cobrança
curl -X POST https://api.paygrid.tech/v1/transactions \
-H "X-Api-Key: sk_sua_chave" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: pedido-5001" \
-d '{
"workflowId": "22222222-2222-2222-2222-222222222222",
"paymentMethod": "card",
"amount": 59900,
"currency": "BRL",
"token": "tok_abc123...",
"installments": 3,
"reference": "pedido-5001",
"customer": {
"name": "João da Silva",
"email": "joao@exemplo.com",
"document": "12345678900",
"phone": "+5511999999999",
"address": {
"line1": "Rua Exemplo, 100",
"zipCode": "01001000",
"city": "São Paulo",
"state": "SP",
"country": "BR"
}
}
}'
| Campo | Obrigatório | Descrição |
|---|---|---|
paymentMethod | não | card ou pix. Ausente vale card. |
amount | sim | Valor em centavos. |
reference | sim | Seu identificador do pedido (até 128 caracteres). Volta em todo webhook. |
currency | não | BRL (padrão). |
customer | recomendado | Pagador. A Pagar.me exige endereço de cobrança (address) para cartão. |
token | sim (card) | Token PCI do cartão. |
installments | não | Parcelas (padrão 1). |
cardBrand | não | Bandeira informada por você (visa, mastercard, etc.), usada nas condições do fluxo. Opcional. |
workflowId | sim | O fluxo que processa a cobrança. Pegue o id no painel (menu Fluxos) ou em GET /v1/workflows. |
threeDS | não | Resultado da autenticação 3DS 2.0 feita no cliente (veja a seção 2). Só cartão; ausente = sem autenticação. |
4. Resultado
A resposta (202) traz transactionId,
trackingId e status: "accepted": a cobrança foi
enfileirada. O desfecho do cartão sai em seguida — approved
ou declined — sem esperar o pagador, diferente do Pix, que
fica pending até ser pago.
5. Reconsulte / Webhook
Consulte GET /v1/transactions/{transactionId} ou configure
webhooks para ser notificado.
6. Detalhe do pagamento
GET /v1/payments/{paymentId} traz o que o provedor informou
sobre o cartão cobrado:
{
"paymentId": "5183e61a-...",
"status": "approved",
"cardBrand": "visa",
"cardLastFour": "1234",
"providerDetails": {
"feeAmount": 1797,
"hasFee": true,
"feeState": "disponivel"
}
}
| Campo | Descrição |
|---|---|
cardBrand | Bandeira que o provedor identificou, em minúsculas (visa, mastercard, elo, amex, hipercard...). É diferente do cardBrand que você envia na criação: aquele é só uma informação sua para o fluxo; este é o que o cartão realmente é. |
cardLastFour | Quatro últimos dígitos. BIN e titular nunca são expostos. |
failureReason | Numa recusa, o motivo como o emissor ou o provedor informou, sem tradução: a mensagem do emissor em português (padrão ABECS) ou erros de validação do provedor, em inglês. É texto livre: mostre e registre, mas não decida fluxo por ele. |
providerDetails | Taxa do provedor na cobrança — veja abaixo. |
7. Taxa do provedor
O Paygrid busca a taxa automaticamente quando a cobrança é aprovada ou
estornada. O provedor nem sempre a publica na hora, então
feeState diz em que pé ela está:
feeState | Significado |
|---|---|
aguardando | Aprovada ou estornada, e o provedor ainda não publicou a taxa. O Paygrid pergunta de novo periodicamente. |
disponivel | A taxa está em feeAmount, em centavos. |
indisponivel | Passaram 40 dias sem o provedor informar a taxa; o Paygrid parou de perguntar. |
nao_se_aplica | A cobrança não foi paga (pendente, recusada, cancelada...). |
feeAmount só vale quando hasFee é
true. Fora disso vem 0, e esse zero
não significa isenção. O mesmo vale para Pix.