Pular para o conteúdo principal

Início rápido

Uma integração de pagamentos mínima: a criação de uma cobrança pela API e o tratamento da notificação de pagamento. A última seção cobre a entrega do pedido. Os exemplos são autossuficientes; nenhum SDK é usado.

dica

Trabalhando com um agente de IA? Entregue a ele a versão em markdown desta página. Ela tem detalhes suficientes para construir uma integração para o seu site ou loja.

Pré-requisitos

ValorOnde obter
Chave de APIA seção Integrações (Integrations)
ID do projetoA seção Projetos (Projects)
Segredo do webhookConfigurações do projeto

Nas mesmas configurações do projeto, defina a Webhook URL — o endereço do manipulador de notificações no seu servidor. Somente HTTPS; redirecionamentos não são seguidos.

Os exemplos usam valores de teste — substitua-os pelos seus.

Criação de uma cobrança

POST https://api.bitsby.app/invoices/create, a chave de API é passada no cabeçalho Authorization.

ParâmetroObrigatórioValor
projectIdsimID do projeto, UUID
amountFiatsimValor da cobrança
currencyFiatsimMoeda: USD, EUR, RUB
timeToPaysimPrazo de pagamento em horas: 0.5, 1, 3, 6, 12
descriptionnãoDescrição, exibida ao cliente na página de pagamento
serviceDatanãoDados de serviço, não exibidos ao cliente. Recomendamos passar o número do pedido: ele volta na notificação de pagamento
curl -X POST https://api.bitsby.app/invoices/create \
-H "Authorization: Token MSvL2ltaDZdWVjmZURURMVWhqSJLT2NURjhL2Fla1Z1T1IxQTltKs1T3Ay" \
-F "projectId=9deea1e2-0c08-41a3-bdc2-a34eada3892d" \
-F "amountFiat=49.90" \
-F "currencyFiat=USD" \
-F "timeToPay=1" \
-F "description=Order 4172" \
-F "serviceData=order-4172"

Resposta:

{
"result": "success",
"data": {
"id": "ade9550d-3dc7-4fd3-b94e-3b4c12aaaa0c",
"uid": "MXNj4m8HhcM4",
"createDatetime": "2026-09-14 10:12:03",
"timeToPayDatetime": "2026-09-14 11:12:03",
"commissionFiatUSD": 0.5,
"amountFiatUSD": 49.9,
"url": "https://dash.bitsby.app/invoices/pay/MXNj4m8HhcM4"
}
}

Guarde data.id junto com o pedido e envie o cliente para data.url — a página de pagamento. Entregue o link como preferir: um redirecionamento, um e-mail, uma mensagem de bot. A cobrança é válida até timeToPayDatetime (UTC).

Tratamento da notificação

Quando uma cobrança passa a Paga (Paid), o serviço envia uma requisição POST para a Webhook URL do projeto. O corpo é JSON; a assinatura vem nos cabeçalhos:

CabeçalhoValor
X-TimestampHorário de envio, unix time em segundos
X-Signaturesha256= + HMAC-SHA256 em hex da string <timestamp>.<request body>

A chave de assinatura é o segredo do webhook. A assinatura é calculada sobre o corpo bruto da requisição, então verifique-a antes de fazer o parse do JSON.

<?php
$secret = 'k7QwR2mZ9tXbN4vL8sJpH3dF6yA1cE0u';

$body = file_get_contents('php://input');
$timestamp = $_SERVER['HTTP_X_TIMESTAMP'] ?? '';
$signature = $_SERVER['HTTP_X_SIGNATURE'] ?? '';

// Reject replayed requests: allow up to 5 minutes of clock drift
if (abs(time() - (int)$timestamp) > 300) {
http_response_code(400);
exit;
}

$expected = 'sha256='.hash_hmac('sha256', $timestamp.'.'.$body, $secret);

if (!hash_equals($expected, $signature)) {
http_response_code(403);
exit;
}

$invoice = json_decode($body, true)['invoice'];

if ($invoice['status'] === 'paid') {
// $invoice['serviceData'] — the order id passed at creation: 'order-4172'
// $invoice['amountFiat'] — the original invoice amount: 49.9
// Issue the order here, see the next section
}

http_response_code(200);

Responda com um código 2xx em até 10 segundos. Qualquer outro código, um redirecionamento ou um timeout conta como falha de entrega: o serviço repete as tentativas em intervalos crescentes, de 5 minutos até 24 horas, e depois para. Transfira processamentos longos para uma fila: responda 200 primeiro e só então trate o pedido.

O formato completo da notificação e a referência dos campos estão na seção Webhook URL.

Entrega do pedido

Uma notificação verificada com status paid confirma o pagamento. Etapas da entrega:

  1. Encontre o pedido por invoice.serviceData — o valor passado na criação da cobrança (order-4172).
  2. Verifique por invoice.id se esta cobrança já foi entregue. Uma notificação com o mesmo invoice.id pode chegar mais de uma vez — entregue o pedido uma única vez e guarde uma marca de processado.
  3. Confira o valor e a moeda com invoice.amountFiat e invoice.currencyFiat — esses são os valores originais da cobrança e nunca mudam. amountFiatUSD é sobrescrito com o valor efetivamente recebido. Compare valores como números, não como strings: zeros à direita são descartados, então 49.90 chega como 49.9. Se os valores não corresponderem ao pedido, encaminhe a cobrança para análise manual em vez da entrega — esses casos são cobertos em Vinculação de pagamentos e divergências de valores.
  4. Entregue o pedido e marque-o como processado.

Não verifique o prazo de pagamento na entrega: o pagamento pode ter sido confirmado on-chain depois de timeToPayDatetime, e o lojista pode vincular um pagamento a uma cobrança manualmente. A própria notificação confirma o pagamento.

O que vem a seguir