CDX Pay para desenvolvedores

Pagamentos

Todas as chamadas desta página partem do servidor do e-commerce, com a chave no cabeçalho Authorization (Autenticação e idempotência). Os exemplos usam:

export WP_API=https://pay-api.staging.bloomx.cloud
export WP_KEY='wp_test.<key_id>.<segredo>'

Criar um pagamento: POST /v1/payments

Permissão payments:write. Exige Idempotency-Key.

curl -s -X POST "$WP_API/v1/payments" \
  -H "Authorization: Bearer $WP_KEY" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: pedido-1234:autorizar' \
  -d '{
    "amount_cents": 15000,
    "installments": 1,
    "capture": true,
    "external_reference": "pedido-1234",
    "payment_source": { "source_type": "token", "token_id": "<tokenId do navegador>" },
    "customer": {
      "name": "Maria Teste",
      "email": "maria@example.com",
      "document": "12345678909",
      "phone": "11999999999",
      "address": {
        "zip_code": "01001000",
        "street": "Rua Teste",
        "number": "100",
        "complement": "Sala 1",
        "district": "Centro",
        "city": "Sao Paulo",
        "state": "SP"
      }
    }
  }'
Campo do pedido Obrigatório Formato e regras
amount_cents sim inteiro, em centavos, a partir de 1
currency não só BRL (padrão)
installments não de 1 a 18; padrão 1
capture não true (padrão) autoriza e captura; false só pré-autoriza
statement_descriptor não texto da fatura do comprador, até 22 caracteres
external_reference sim o id do pedido no seu e-commerce, até 64 caracteres
payment_source sim de onde vem o cartão
payment_source.source_type sim token (cartão recém-digitado) ou card (cartão salvo)
payment_source.token_id não com source_type: token: o token_id de uso único do navegador
payment_source.card_id não com source_type: card: o card_id de POST /v1/cards
payment_source.cvv não opcional com card_id, 3 ou 4 dígitos; nunca é guardado
customer sim o comprador; todos os blocos abaixo são exigidos pela rede de cartões
customer.name sim até 120 caracteres
customer.email sim e-mail válido, até 120 caracteres
customer.document sim CPF (11 dígitos) ou CNPJ (14 dígitos), só dígitos, com dígitos verificadores válidos
customer.phone sim DDD e número, de 10 a 11 dígitos, só dígitos
customer.address sim endereço do comprador
customer.address.zip_code sim CEP com 8 dígitos, só dígitos
customer.address.street sim até 120 caracteres
customer.address.number sim de 1 a 10 caracteres
customer.address.complement não até 60 caracteres, ou null
customer.address.district sim bairro, até 60 caracteres
customer.address.city sim até 60 caracteres
customer.address.state sim sigla da UF, como SP
metadata não até 20 pares chave e valor simples, devolvidos na consulta

Respostas:

HTTP Corpo O que fazer
201 pagamento em captured (com capture: true) pedido pago
201 pagamento em pre_authorized (com capture: false) capture até expires_at
200 replay da mesma Idempotency-Key: o resultado original trate como a primeira resposta
202 pagamento em unknown não reenvie com outra chave; consulte ou espere o webhook (resultado ambíguo)
4xx e 5xx envelope de erro veja Erros

Guarde o id do pagamento: é ele que as outras rotas e o webhook usam. A resposta também traz o cabeçalho Location com o endereço do pagamento.

Capturar uma pré-autorização: POST /v1/payments/{id}/capture

Permissão payments:write. Exige Idempotency-Key. Sem corpo, captura o valor total; com amount_cents, captura parcialmente (até o valor autorizado).

curl -s -X POST "$WP_API/v1/payments/<id>/capture" \
  -H "Authorization: Bearer $WP_KEY" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: pedido-1234:capturar' \
  -d '{ "amount_cents": 15000 }'

A captura responde 200 com o pagamento em captured. A pré-autorização vale pelo número de dias de preauth_ttl_days em GET /v1/capabilities (hoje, 7 dias); o fim da janela está em expires_at. Depois disso, a captura recebe 422 preauth_expired. Um pagamento que não está em pre_authorized recebe 409 invalid_state.

Cancelar ou estornar: POST /v1/payments/{id}/cancel

Permissão payments:write. Exige Idempotency-Key. A mesma rota desfaz uma pré-autorização ou estorna um pagamento capturado. Sem corpo, estorna o saldo todo; com amount_cents, estorna parcialmente.

curl -s -X POST "$WP_API/v1/payments/<id>/cancel" \
  -H "Authorization: Bearer $WP_KEY" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: pedido-1234:estorno-1' \
  -d '{ "amount_cents": 5000 }'
Pagamento antes Resultado
pre_authorized canceled
captured, estorno de parte do valor partially_refunded
captured ou partially_refunded, estorno do saldo restante refunded

Estorno acima do saldo recebe 422 amount_exceeds_refundable. Cada estorno parcial leva a sua própria Idempotency-Key.

Consultar um pagamento: GET /v1/payments/{id}

Permissão payments:read. É a fonte da verdade sobre o pagamento e pode ser consultada a qualquer momento.

curl -s "$WP_API/v1/payments/<id>" -H "Authorization: Bearer $WP_KEY"
Campo da resposta O que é
id id do pagamento (UUID)
external_reference o id do pedido que você enviou
status status atual (tabela abaixo)
capture_mode auto (capture: true) ou manual (capture: false)
amount_cents, captured_cents, refunded_cents valor autorizado, capturado e estornado, em centavos
currency, installments, statement_descriptor como enviados na criação
card.brand, card.last4, card.card_id bandeira, quatro últimos dígitos e o cartão salvo, quando houver
customer.name, customer.email o comprador (documento, telefone e endereço nunca voltam)
provider.authorization_code, provider.nsu, provider.tid identificadores da transação na rede de cartões
provider.declined_code código da recusa, quando houver
metadata o que você enviou na criação
expires_at fim da janela de captura de uma pré-autorização
created_at, authorized_at, captured_at, canceled_at, refunded_at datas em UTC (ISO 8601)
operation a última operação (kind, state), quando a resposta vem de uma operação
error code, message e retryable do último erro, quando houver

Listar pagamentos: GET /v1/payments

Permissão payments:read. Lista do mais novo para o mais antigo, em páginas.

curl -s "$WP_API/v1/payments?status=captured&limit=20" -H "Authorization: Bearer $WP_KEY"
Parâmetro Uso
status filtra por status
external_reference filtra pelo id do pedido
limit itens por página, de 1 a 100; padrão 20
cursor o next_cursor da página anterior

A resposta traz items (os pagamentos) e next_cursor, que vem null na última página.

Guardar o cartão: POST /v1/cards

Permissão cards:write. Troca um token_id por um cartão guardado no cofre do provedor, para cobrar de novo sem pedir o cartão ao comprador. O token é consumido aqui: para pagar na mesma hora, gere outro token_id.

curl -s -X POST "$WP_API/v1/cards" \
  -H "Authorization: Bearer $WP_KEY" \
  -H 'Content-Type: application/json' \
  -d '{ "token_id": "<tokenId do navegador>" }'
{ "card_id": "<card_id>", "status": "active", "brand": "mastercard", "last4": "0020",
  "expiration_month": "12", "expiration_year": "2030", "holder_name": "MARIA TESTE" }

Depois, pague com "payment_source": { "source_type": "card", "card_id": "<card_id>" }. Guarde o card_id associado ao cliente no seu sistema; ele só serve com a chave do seu estabelecimento.

Status do pagamento

Status Significado
pending criado; a autorização ainda não terminou
pre_authorized autorizado e aguardando captura
capturing captura em curso
captured capturado: o pagamento está pago
cancelling cancelamento em curso
canceled pré-autorização desfeita; nada foi cobrado
refunding estorno em curso
partially_refunded parte do valor capturado foi estornada
refunded todo o valor capturado foi estornado
charged_back o comprador contestou a compra com o emissor (chargeback)
expired pré-autorização não capturada dentro da janela
failed não autorizado; nada foi cobrado
unknown resultado ambíguo, em conciliação (resultado ambíguo)