Skip to main content

Como o gateway é escolhido

A cada pagamento, o roteador percorre três camadas em ordem de prioridade:
1. gateway_first_try no body da requisição?
   → Sim: usa esse gateway (se habilitado)
   → Não: continua ↓

2. Existem regras de roteamento por percentual para esse método?
   → Sim: seleciona pelo algoritmo de maior déficit
   → Não: continua ↓

3. Fallback: primeiro gateway habilitado, ordenado por `order`

1 — Ordem dos gateways (fallback)

Quando nenhuma regra de percentual está ativa, o sistema usa o gateway com menor order dentre os habilitados. É o mecanismo de fallback garantido — sempre existe um gateway escolhido se pelo menos um estiver habilitado.

Consultar ordem atual

GET /api/v1/company/gateways/order — requer X-Client-ID + X-API-Key.
[
  { "gateway_id": 1, "gateway_slug": "pagarme",  "order": 1, "enabled": true  },
  { "gateway_id": 4, "gateway_slug": "safe2pay",  "order": 2, "enabled": true  },
  { "gateway_id": 2, "gateway_slug": "stripe",    "order": 3, "enabled": false }
]

Atualizar ordem

PUT /api/v1/company/gateways/order — requer X-Client-ID + X-API-Key. A posição no array define a prioridade: índice 0 vira order = 1, índice 1 vira order = 2, e assim por diante. Gateways ausentes da lista são mantidos e reposicionados após os listados.
{
  "gateways": [
    { "gateway_id": 4 },
    { "gateway_id": 1 },
    { "gateway_id": 2 }
  ]
}
Resultado: Safe2Pay = prioridade 1, Pagarme = prioridade 2, Stripe = prioridade 3.
Gateways desabilitados (enabled: false) são ignorados durante o roteamento mesmo que estejam no topo da ordem. Apenas gateways habilitados participam do fallback.

2 — Roteamento por percentual

Define quanto do volume de transações deve ser processado por cada gateway. Ideal para distribuir carga, reduzir dependência de um único provedor ou realizar testes A/B entre gateways.

Como funciona o algoritmo

O sistema usa Maior Déficit Primeiro (Largest-Deficit-First). Em vez de sortear aleatoriamente, ele observa as últimas 10 transações aprovadas e calcula qual gateway está mais “devendo” em relação à sua cota. Exemplo:
Últimas 10 transações aprovadas com cartão:
  Pagarme:  7 transações
  Safe2Pay: 3 transações

Regras configuradas:
  Pagarme:  70%
  Safe2Pay: 30%

Cálculo:
  Pagarme:  esperado = 10 × 0.70 = 7.0 | real = 7 | déficit = 0.0
  Safe2Pay: esperado = 10 × 0.30 = 3.0 | real = 3 | déficit = 0.0

Próximas 10 transações (agora com 11 no histórico, considera as últimas 10):
  Se Pagarme processa a 11ª → Pagarme: 7/10, Safe2Pay: 3/10
  Pagarme:  esperado = 10 × 0.70 = 7.0 | real = 7 | déficit = 0.0
  Safe2Pay: esperado = 10 × 0.30 = 3.0 | real = 3 | déficit = 0.0
  → empate: vence quem tem maior percentual → Pagarme
O efeito prático é que a distribuição converge naturalmente para as proporções configuradas, sem picos ou oscilações bruscas.

Escopo por método de pagamento

As regras podem ser configuradas de forma diferente para cartão e PIX:
payment_methodAplicação
cardApenas transações de cartão
pixApenas transações PIX
null (omitido)Padrão — aplica a todos os métodos sem regra específica
Se existir uma regra para card e outra padrão (null), transações de cartão usam a regra de cartão; transações PIX sem regra específica usam a padrão.

Consultar regras atuais

GET /api/v1/company/gateways/routing — requer X-Client-ID + X-API-Key.
[
  { "gateway_id": 1, "gateway_slug": "pagarme",  "payment_method": "card", "percentage": 70 },
  { "gateway_id": 4, "gateway_slug": "safe2pay",  "payment_method": "card", "percentage": 30 },
  { "gateway_id": 1, "gateway_slug": "pagarme",  "payment_method": null,   "percentage": 100 }
]

Definir regras

PUT /api/v1/company/gateways/routing — requer X-Client-ID + X-API-Key.
{
  "payment_method": "card",
  "gateways": [
    { "gateway_id": 1, "percentage": 70 },
    { "gateway_id": 4, "percentage": 30 }
  ]
}
Os percentuais devem somar exatamente 100 ou todos ser 0 (que remove as regras daquele método). Qualquer outra soma retorna 422.
Para remover regras de um método e volcar ao fallback por ordem:
{
  "payment_method": "card",
  "gateways": [
    { "gateway_id": 1, "percentage": 0 },
    { "gateway_id": 4, "percentage": 0 }
  ]
}

3 — Configurações da empresa

As configurações de orquestração ficam em GET /PUT /api/v1/user/company/config — requer Bearer JWT.
{
  "time_to_wait_sync": 6.0,
  "default_response": "sync",
  "retry_failed_payments": true,
  "max_retry_attempt": 3
}

time_to_wait_sync

Controla por quanto tempo (em segundos) o servidor aguarda a resposta do gateway antes de devolver uma resposta HTTP ao cliente. O que acontece internamente:
Requisição chega

Coroutine criada — processa o pagamento em paralelo

Servidor aguarda até time_to_wait_sync segundos

Gateway respondeu a tempo?
    SIM → 201 com resultado completo (approved / failed)
    NÃO → 202 com transaction_id ("pagamento em processamento")

           Gateway responde depois → webhook entregue ao seu servidor
ValorComportamento
Padrão5.0 segundos
Mínimo0.5 segundos
Máximo30.0 segundos
O 202 não significa falha — significa que o gateway ainda não respondeu. O resultado final sempre chega via webhook.

default_response

Define o modo padrão de resposta independentemente do tempo de espera.
ValorComportamento
sync (padrão)Aguarda até time_to_wait_sync — pode retornar 201 ou 202
asyncRetorna 202 imediatamente, sem aguardar o gateway
Use async quando a latência de resposta for crítica e seu sistema já está preparado para receber o resultado via webhook.

retry_failed_payments e max_retry_attempt

Controlam o comportamento de retentativa automática quando um gateway recusa o pagamento.
CampoPadrãoRangeDescrição
retry_failed_paymentstrueHabilita retentativas automáticas em caso de falha
max_retry_attempt51–10Número máximo de tentativas por transação
Cada retentativa seleciona o próximo gateway disponível usando a mesma lógica de roteamento (percentual → ordem). O resultado de cada tentativa fica registrado no array transactions[] da resposta. Não são refeitas retentativas para os seguintes motivos de recusa:
  • expired_card — cartão vencido
  • insufficient_founds — saldo insuficiente
Nesses casos, uma nova tentativa no mesmo ou em outro gateway resultaria na mesma recusa, então o sistema interrompe imediatamente.

Referência rápida de rotas

MétodoRotaAuthDescrição
GET/api/v1/company/gateways/orderX-Client-ID + X-API-KeyConsultar ordem atual
PUT/api/v1/company/gateways/orderX-Client-ID + X-API-KeyDefinir ordem dos gateways
GET/api/v1/company/gateways/routingX-Client-ID + X-API-KeyConsultar regras de percentual
PUT/api/v1/company/gateways/routingX-Client-ID + X-API-KeyDefinir regras de percentual
GET/api/v1/user/company/configBearer JWTConsultar configurações
PUT/api/v1/user/company/configBearer JWTAtualizar configurações