Pular para o conteúdo

Criar e acompanhar transações

Quando um comprador escolhe um anúncio no jogo, o seu servidor assina uma oferta de compra e a plataforma cria uma transação. A transação é o pedido: ela nasce aguardando pagamento, ganha uma URL de checkout que o comprador abre no navegador, e a partir daí evolui por dois eixos de estado. Esta página cobre criar a transação (POST /v1/api/transactions) e consultá-la (GET /v1/api/transactions/{transactionId}).

Para o dono de servidor: a oferta de compra é magra de propósito. Ela diz apenas “este personagem quer esta quantidade deste anúncio” — o preço a Lootfy já conhece, do anúncio. Assim, nada que venha da máquina do jogador consegue alterar o valor cobrado.

Criar a transação ✅ disponível

Seção intitulada “Criar a transação ”

Esta é a segunda rota signature-only: é transportada pelo client do jogo, então leva só a assinatura JWS, sem API key.

POST /v1/api/transactions
X-Lootfy-Signature: <protegido>..<assinatura>
Content-Type: application/json
{ "itemRef": "srv-offer-9931", "quantity": 2, "buyerCharacterRef": "char-123" }
// 200
{ "data": {
"transactionId": 42,
"paymentStatus": "AGUARDANDO",
"deliveryStatus": null,
"checkoutUrl": "https://api.lootfy.gg/checkout/uwMT4PfQ2B-TjbWXMukbLJOzcaQO",
"quantity": 2,
"unitAmountCents": 7000,
"totalAmountCents": 14000,
"expiresAt": "2026-09-14T12:30:00.000Z"
} }

O corpo carrega só três campos, e é intencional: o anúncio (itemRef), a quantidade e o personagem comprador. O preço não viaja. A plataforma multiplica o unitAmountCents do anúncio pela quantidade e devolve unitAmountCents, totalAmountCents e a checkoutUrl.

Abra a checkoutUrl no navegador do jogador. O prazo do pedido é o expiresAt (padrão 30 minutos); vencido, o jogador refaz a compra no jogo.

A plataforma revalida tudo no momento da compra — nada é herdado do anúncio. A transação é recusada, com 400 e a message já em pt-BR, quando:

  • a assinatura é inválida ou o exp está vencido;
  • o anúncio não existe, não está ativo, ou não é daquele servidor;
  • o personagem comprador não está vinculado a uma conta Lootfy;
  • o comprador ou o vendedor está banido;
  • o recebedor do vendedor não está aprovado no PSP no instante da compra — revalidado, não herdado do anúncio;
  • a quantidade excede o disponível estimado do anúncio (estimativa velha não recusa);
  • o total fica abaixo do valor mínimo daquele servidor (padrão R$ 0,50). O mínimo incide sobre o total, não sobre o unitário: item barato continua vendável em quantidade.

Consultar a transação ✅ disponível

Seção intitulada “Consultar a transação ”

Consulta idempotente do estado atual do pedido. É uma rota service (API key + JWS).

GET /v1/api/transactions/42
X-Service-Api-Key: <sua-api-key>
X-Lootfy-Signature: <protegido>..<assinatura>
// 200
{ "data": {
"transactionId": 42,
"paymentStatus": "PAGO",
"deliveryStatus": "AGUARDANDO_SERVIDOR",
"itemRef": "srv-offer-9931",
"gameItemId": "bow-9",
"quantity": 2,
"unitAmountCents": 7000,
"totalAmountCents": 14000,
"expiresAt": "2026-09-14T12:30:00.000Z",
"createdAt": "2026-09-14T12:00:00.000Z",
"updatedAt": "2026-09-14T12:05:00.000Z"
} }

Esta é a rota que resolve a única corrida que o desenho admite: use-a antes de transferir o item quando a ordem de transferência (webhook transfer_order) chegou com atraso, ou quando você não tem certeza de que a transação ainda vale. É a fonte confiável do estado no momento da consulta. Detalhe dessa corrida em Webhook e entrega.

Como é uma rota service, o jti é nonce — gere um novo a cada consulta.

O que não existe: cancelar transação (planejado)

Seção intitulada “O que não existe: cancelar transação (planejado)”

O contrato previa uma rota para o servidor cancelar um pedido ainda não pago. Ela não foi implementada, e não bloqueia o ciclo. Não há como você cancelar do seu lado um pedido pendente; ele expira sozinho pelo prazo (expiresAt, 30 minutos por padrão). Um pedido vencido deixa de ser pagável, e o comprador simplesmente refaz a compra no jogo. Não há ação sua a tomar.