Voltar pro gateway Throne Gateway
5 MIN · ZERO SETUP · PIX BRASIL

Receba PIX no seu site
em 5 minutos.

Snippet HTML pronto · QR Code automático · webhook configurado · funciona com qualquer checkout próprio. Sem SDK obrigatório.

1

Cadastre-se · aprovação 24h

Crie sua conta seller no Throne · envie documentos KYC (RG + Selfie) · aprovação em até 24h dias úteis. Você recebe email confirmando que pode operar.

Criar conta seller →
2

Copie credenciais do painel

Acesse /painel/integracao · copie pk_live + sk_live. A secret key aparece UMA VEZ no email de aprovação · guarde em local seguro.

# .env do seu site
THRONE_PK=pk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
THRONE_SK=sk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
THRONE_WEBHOOK_SECRET=whsec_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
3

Cole snippet no checkout

HTML + JS puro · sem dependências · funciona em qualquer site (WordPress, custom, Next.js, etc).

<!-- Adicione no seu checkout -->
<form id="pix-checkout">
  <input name="produto" value="Plano Premium" />
  <input name="amount_cents" value=9900 /> <!-- R$ 99 -->
  <input name="sku" value="premium-001" />
  <input name="payer_email" placeholder="seu@email.com" />
  <input name="payer_cpf" placeholder="000.000.000-00" />
  <button type="submit">Pagar com PIX</button>
</form>

<div id="pix-result"></div>

<script>
document.getElementById('pix-checkout').addEventListener('submit', async (e) => {
  e.preventDefault();
  const data = Object.fromEntries(new FormData(e.target));

  // Chama seu backend que tem as keys (NUNCA expor SK no frontend)
  const r = await fetch('/api/criar-pix', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify(data),
  });
  const tx = await r.json();

  // Renderiza QR Code + Copia e Cola
  document.getElementById('pix-result').innerHTML = `
    <h3>Aguardando pagamento PIX</h3>
    <img src="data:image/png;base64,${tx.qr_code_base64}" />
    <p>Ou copie o código:</p>
    <textarea>${tx.pix_payload}</textarea>
    <button onclick="navigator.clipboard.writeText('${tx.pix_payload}')">Copiar</button>
  `;

  // Polling status a cada 3s OU receber via webhook (recomendado)
  const poll = setInterval(async () => {
    const s = await fetch(`/api/tx/${tx.public_id}`).then(r => r.json());
    if (s.status === 'paid') {
      clearInterval(poll);
      window.location = '/sucesso';
    }
  }, 3000);
});
</script>
4

Backend que cria PIX

Endpoint próprio que chama Throne API com auth Bearer. Exemplos em 4 linguagens:

Route::post('/api/criar-pix', function (Request $req) {
    $auth = base64_encode(env('THRONE_PK').':'.env('THRONE_SK'));
    $response = Http::withHeaders([
        'Authorization' => 'Bearer '.$auth,
        'Idempotency-Key' => Str::uuid(),
    ])->post('https://api.thronecorporate.com/v1/transactions', [
        'payment_method' => 'pix',
        'amount_cents' => (int) $req->amount_cents,
        'payer_email' => $req->payer_email,
        'payer_cpf' => $req->payer_cpf,
        'description' => $req->produto,
        'metadata' => ['sku' => $req->sku, 'order_id' => Str::uuid()],
    ]);
    return $response->json();
});
app.post('/api/criar-pix', async (req, res) => {
  const auth = Buffer.from(`${process.env.THRONE_PK}:${process.env.THRONE_SK}`).toString('base64');
  const r = await fetch('https://api.thronecorporate.com/v1/transactions', {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${auth}`,
      'Idempotency-Key': crypto.randomUUID(),
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      payment_method: 'pix',
      amount_cents: req.body.amount_cents,
      payer_email: req.body.payer_email,
      payer_cpf: req.body.payer_cpf,
      description: req.body.produto,
      metadata: { sku: req.body.sku, order_id: crypto.randomUUID() },
    }),
  });
  res.json(await r.json());
});
@app.post('/api/criar-pix')
def criar_pix(req):
    auth = base64.b64encode(f'{THRONE_PK}:{THRONE_SK}'.encode()).decode()
    r = requests.post(
        'https://api.thronecorporate.com/v1/transactions',
        headers={
            'Authorization': f'Bearer {auth}',
            'Idempotency-Key': str(uuid.uuid4()),
        },
        json={
            'payment_method': 'pix',
            'amount_cents': req.amount_cents,
            'payer_email': req.payer_email,
            'payer_cpf': req.payer_cpf,
            'description': req.produto,
            'metadata': {'sku': req.sku, 'order_id': str(uuid.uuid4())},
        },
    )
    return r.json()
func criarPix(w http.ResponseWriter, r *http.Request) {
    auth := base64.StdEncoding.EncodeToString([]byte(os.Getenv("THRONE_PK") + ":" + os.Getenv("THRONE_SK")))
    body := map[string]interface{}{
        "payment_method": "pix",
        "amount_cents": req.AmountCents,
        "payer_email": req.PayerEmail,
        "description": req.Produto,
        "metadata": map[string]string{"sku": req.SKU},
    }
    jsonBody, _ := json.Marshal(body)
    httpReq, _ := http.NewRequest("POST", "https://api.thronecorporate.com/v1/transactions", bytes.NewBuffer(jsonBody))
    httpReq.Header.Set("Authorization", "Bearer "+auth)
    httpReq.Header.Set("Idempotency-Key", uuid.NewString())
    resp, _ := http.DefaultClient.Do(httpReq)
    io.Copy(w, resp.Body)
}
# Direto pela linha de comando · útil em scripts CI/CD
curl -X POST https://api.thronecorporate.com/v1/transactions \
  -H "Authorization: Bearer $THRONE_PK:$THRONE_SK" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "payment_method": "pix",
    "amount_cents": 9900,
    "payer_email": "cliente@example.com",
    "payer_cpf": "12345678901",
    "description": "Plano Premium",
    "metadata": {"sku": "premium-001", "order_id": "PED-42"}
  }'
require 'net/http'
require 'json'
require 'securerandom'

def criar_pix(amount_cents, payer_email, sku)
  uri = URI('https://api.thronecorporate.com/v1/transactions')
  req = Net::HTTP::Post.new(uri, {
    'Authorization' => "Bearer #{ENV['THRONE_PK']}:#{ENV['THRONE_SK']}",
    'Content-Type' => 'application/json',
    'Idempotency-Key' => SecureRandom.uuid,
  })
  req.body = {
    payment_method: 'pix',
    amount_cents: amount_cents,
    payer_email: payer_email,
    description: 'Plano Premium',
    metadata: { sku: sku, order_id: SecureRandom.uuid },
  }.to_json
  res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(req) }
  JSON.parse(res.body)
end
// Java 17+ · HttpClient nativo (sem libs extras)
import java.net.URI;
import java.net.http.*;
import java.util.UUID;

public class ThronePixClient {
    public static String criarPix(int amountCents, String payerEmail, String sku) throws Exception {
        String auth = "Bearer " + System.getenv("THRONE_PK") + ":" + System.getenv("THRONE_SK");
        String body = """
            {
              "payment_method": "pix",
              "amount_cents": %d,
              "payer_email": "%s",
              "description": "Plano Premium",
              "metadata": {"sku": "%s"}
            }
            """.formatted(amountCents, payerEmail, sku);
        HttpRequest req = HttpRequest.newBuilder()
            .uri(URI.create("https://api.thronecorporate.com/v1/transactions"))
            .header("Authorization", auth)
            .header("Content-Type", "application/json")
            .header("Idempotency-Key", UUID.randomUUID().toString())
            .POST(HttpRequest.BodyPublishers.ofString(body))
            .build();
        HttpResponse<String> resp = HttpClient.newHttpClient().send(req, HttpResponse.BodyHandlers.ofString());
        return resp.body();
    }
}

Multi-produtos · checkout próprio

Cada produto da sua loja tem own SKU + valor. Cada venda chega na Throne com metadata específica · sem mistura · sem bug.

Plano Premium
R$ 99,00
SKU · premium-001
Plano Pro
R$ 199,00
SKU · pro-002
Plano Enterprise
R$ 499,00
SKU · enterprise-003
Add-on Storage
R$ 19,00
SKU · storage-004
Add-on Support
R$ 49,00
SKU · support-005
Setup Fee
R$ 99,00
SKU · setup-006
Domain Renewal
R$ 29,00
SKU · domain-007
Custom Theme
R$ 149,00
SKU · theme-008

Cada chamada POST /v1/transactions com metadata.sku próprio · resultado: 8 vendas independentes · cada uma com informações certas no painel.

Webhook · pagamento confirmado

Configure URL no painel · Throne envia POST sempre que tx muda status. Use webhook em vez de polling pra produção.

Route::post('/throne/webhook', function (Request $req) {
    // 1. Verifica signature (anti-spoofing)
    $payload = $req->getContent();
    $signature = $req->header('X-Throne-Signature');
    $expected = hash_hmac('sha256', $payload, env('THRONE_WEBHOOK_SECRET'));
    if (! hash_equals($expected, $signature)) {
        abort(401);
    }

    // 2. Process event
    $event = json_decode($payload, true);
    if ($event['type'] === 'transaction.paid') {
        $tx = $event['data'];
        // Marca pedido como pago · libera produto · envia email · etc
        Order::where('metadata->order_id', $tx['metadata']['order_id'])
            ->update(['status' => 'paid', 'paid_at' => now()]);
    }

    return response('ok', 200); // IMPORTANTE: 200 em < 30s
});

Pronto para produção

Taxas Throne descontadas automaticamente antes do saldo · você recebe valor LÍQUIDO direto. Cautelar (anti-fraude) configurável pelo painel admin · proteção contra estornos.

Começar agora →   Documentação API completa →