Skip to content

REF-901-04: Banco Inter Integration Contract

ADR: ADR-901 — IntegrationsEscopo: Field-level mapping entre woocommerce-banco-inter e middag-account, rate limits, timeouts, reconciliation, B2B override detalhado


1. Arquitetura de Integração

┌──────────────────────────────────┐     ┌──────────────────────────────────┐
│  Plugin: woocommerce-banco-inter │     │  Plugin: middag-account          │
│  (gateway WC independente)       │     │  (B2B overlay + presentation)    │
│                                  │     │                                  │
│  BancoInterGateway               │◄────│  BancoInterPayerAdapter          │
│  ├── process_payment()           │     │  ├── filter: prepare_payer       │
│  ├── process_webhook()           │     │  └── filter: prepare_debtor      │
│  ├── generate_boleto()           │     │                                  │
│  └── generate_pix()              │     │  BancoInterWebhookHandler [SPEC] │
│                                  │     │  └── action: payment_complete    │
│  API Inter v2                    │     │                                  │
│  ├── POST /banking/v2/boleto     │     │  BancoInterPaymentService [SPEC] │
│  └── POST /banking/v2/pix       │     │  └── REST: /orders/{id}/payment  │
└──────────────────────────────────┘     └──────────────────────────────────┘
         │                                         │
         │  WC Hooks (filters + actions)           │
         └─────────────────────────────────────────┘

Princípio: woocommerce-banco-inter funciona standalone em qualquer WooCommerce B2C. middag-account adiciona B2B sem modificar o plugin externo.


2. Boleto — Field Mapping (13 campos)

Mapeamento dos campos enviados à API Inter v2 para criação de boleto bancário.

#Campo API InterTipoMaxOrigem middag-account (B2B)Fallback (B2C)
1pagador.cpfCnpjstring14Organization.org_documentnumber1 (CNPJ)Order.billing_cpf
2pagador.tipoPessoaenumJURIDICA (quando CNPJ)FISICA
3pagador.nomestring100Organization.org_trade_nameOrder.billing_first_name + billing_last_name
4pagador.enderecostring100Organization.org_address_line1Order.billing_address_1
5pagador.complementostring30Organization.org_address_line2Order.billing_address_2
6pagador.bairrostring60Organization.org_neighborhoodOrder.billing_neighborhood
7pagador.cidadestring60Organization.org_cityOrder.billing_city
8pagador.ufstring2Organization.org_stateOrder.billing_state
9pagador.cepstring8Organization.org_postcode (sem hífen)Order.billing_postcode
10pagador.emailstring100Organization.org_emailOrder.billing_email
11pagador.telefonestring15Organization.org_phoneOrder.billing_phone
12seuNumerostring15Order.id (prefixado)Order.id
13valorNominaldecimalOrder.totalOrder.total

Regras de Override B2B

1. Order tem meta `_organization`?
   └── NÃO → bypass (B2C normal, dados do billing)
   └── SIM → resolve Organization via ID
       └── Organization tem `org_documentnumber1` (CNPJ)?
           └── NÃO → bypass (pessoa física na org, usa billing)
           └── SIM → override campos 1-11 com dados da Organization
               └── tipoPessoa = JURIDICA
               └── nome = org_trade_name (razão social / trade name)

3. Pix — Field Mapping (8 campos)

Mapeamento para criação de cobrança Pix via API Inter v2.

#Campo API InterTipoMaxOrigem middag-account (B2B)Fallback (B2C)
1devedor.cpf ou devedor.cnpjstring14Organization.org_documentnumber1Order.billing_cpf
2devedor.nomestring100Organization.org_trade_nameOrder.billing_first_name + billing_last_name
3valor.originalstringOrder.total (formato "123.45")Order.total
4chavestring77Env var BANCO_INTER_PIX_KEYEnv var
5solicitacaoPagadorstring140Pedido #{Order.id} - {org_trade_name}Pedido #{Order.id}
6calendario.expiracaoint1800 (30 minutos)1800
7txidstring35middag{Order.id}{timestamp}Gerado pelo gateway
8infoAdicionaisarray50[{nome: "Pedido", valor: Order.id}]

Diferença Pix B2B

Quando CNPJ presente, usa campo devedor.cnpj (14 dígitos) em vez de devedor.cpf (11 dígitos). API Inter distingue pelo campo enviado, não por flag.


4. Rate Limits — API Banco Inter v2

OperaçãoLimitePeríodoAção no Excesso
Criar boleto100 req1 minHTTP 429, Retry-After
Criar Pix100 req1 minHTTP 429, Retry-After
Consultar status300 req1 minHTTP 429, Retry-After
Cancelar boleto50 req1 minHTTP 429, Retry-After

Plugin woocommerce-banco-inter implementa retry com backoff exponencial (1s, 2s, 4s, max 3 tentativas).


5. Timeouts e Expiração

MétodoTimeout APIExpiração CobrançaBaixa Automática
Pix30s30 minutos (configurável via calendario.expiracao)Imediata após expiração
Boleto30sD+3 após vencimento (padrão Inter)D+5 após vencimento (baixa automática)

Cenários de Expiração

CenárioAção plugin wc-banco-interAção middag-account
Pix expirado (30min)Order status → failedQuote status mantém payment_pending
Pix pagoOrder status → processingcompletedQuote → paid, sync HubSpot
Boleto vencido (D+3)Nenhuma (aguarda baixa)Nenhuma
Boleto baixado (D+5)Order status → cancelledQuote → expired (via cron)
Boleto pagoOrder status → processingcompletedQuote → paid, sync HubSpot

6. Webhook Flow Detalhado

Banco Inter API

├── Pix: callback URL configurada no painel Inter
│   POST /wc-api/banco-inter-webhook
│   Headers: x-inter-webhook-signature: {HMAC-SHA256}
│   Body: { "pix": [{ "txid": "...", "valor": "123.45", "horario": "..." }] }

└── Boleto: callback URL configurada no painel Inter
    POST /wc-api/banco-inter-webhook
    Headers: x-inter-webhook-signature: {HMAC-SHA256}
    Body: { "codigoSolicitacao": "...", "codigoBarras": "...", "situacao": "PAGO" }

Plugin wc-banco-inter

├── Valida HMAC signature
├── Identifica tipo (pix ou boleto)
├── Localiza WC Order via txid/seuNumero
├── Atualiza Order status
│   └── payment_complete() → woocommerce_payment_complete action

└── middag-account (via hook woocommerce_payment_complete)

    ├── BancoInterWebhookHandler::onPaymentComplete($orderId)
    │   ├── Verifica meta _quote_id no Order
    │   ├── Se existe: Quote.status → paid
    │   ├── Dispara EntitlementProvisioningService (auto-criação)
    │   └── Sync HubSpot: Deal → Closed Won

    └── (Outros handlers: Invoice generation, email notification, etc.)

7. Reconciliation

Cron job no middag-account para tratar webhooks perdidos:

FrequênciaAçãoEscopo
A cada 30 minBuscar Orders com status on-hold há mais de 2hPix (podem ter expirado sem webhook)
DiárioBuscar boletos pendentes com vencimento D-1 ou anteriorBoletos que expiraram
DiárioVerificar Orders completed sem Quote paid correspondenteInconsistência webhook

Lógica de Reconciliation

Para cada Order pendente encontrada:
  1. Consultar status no wc-banco-inter (que consulta API Inter)
  2. Se pago: disparar payment_complete manualmente
  3. Se expirado: marcar Order como cancelled/failed
  4. Se pendente: manter (ainda dentro do prazo)

8. Environment Variables

VariávelResponsávelDescrição
BANCO_INTER_CLIENT_IDwc-banco-interOAuth2 client ID
BANCO_INTER_CLIENT_SECRETwc-banco-interOAuth2 client secret
BANCO_INTER_CERT_PATHwc-banco-interCaminho certificado .crt
BANCO_INTER_KEY_PATHwc-banco-interCaminho chave .key
BANCO_INTER_PIX_KEYwc-banco-interChave Pix (CNPJ, email, etc.)
BANCO_INTER_WEBHOOK_SECRETwc-banco-interHMAC secret para validação
BANCO_INTER_ENVIRONMENTwc-banco-intersandbox ou production

middag-account NÃO gerencia essas variáveis. São configuração exclusiva do plugin externo.


9. Escopo de Implementação

ComponenteStatusVersão
BancoInterPayerAdapter (B2B override)Implementadov5.0
BancoInterWebhookHandler (Quote sync)Specv5.0
BancoInterPaymentService (API v1)Specv5.0
Reconciliation cronSpecv5.0.x
Admin UI (payment status view)Specv5.0.x