Quibly Pay
Começando

Primeira cobrança

Exemplos de requisição no servidor.

Os exemplos criam uma cobrança no sandbox. Configure QP_CLIENT_ID com sua credencial qp_test_ e QP_CLIENT_SECRET com o segredo correspondente. Configure QP_WEBHOOK_URL com a URL HTTPS pública do receptor. Em produção, use os dados reais do pagador exigidos pelo provedor. Para chamar outro endpoint, mantenha as credenciais e substitua o caminho e os campos da operação: consulta/simulação usam transaction_id; saque usa valor, chave_pix, os campos do destinatário e o header Idempotency-Key.

Antes de enviar urlnoty, cadastre o receptor em Desenvolvedor > Webhooks, selecione os eventos e mantenha "Usar nas notificações por cobrança" habilitado. Guarde QP_WEBHOOK_SECRET para validar X-Quibly-Secret. Ao verificar HMAC, use a chave separada QP_WEBHOOK_SIGNING_KEY, revelada em Avançado: chave de assinatura. Um receptor em outra origem deve verificar HMAC porque não recebe o segredo no header. Consulte as regras de entrega.

curl (form-urlencoded)

curl --fail-with-body https://api.quiblypay.com/v3/sandbox/pix/qrcode \
  --data-urlencode "client_id=$QP_CLIENT_ID" \
  --data-urlencode "client_secret=$QP_CLIENT_SECRET" \
  --data-urlencode 'valor=25.00' \
  --data-urlencode 'nome=Cliente Sandbox' \
  --data-urlencode 'descricao=Pedido de exemplo' \
  --data-urlencode "urlnoty=$QP_WEBHOOK_URL"

# Salve o transactionId retornado em QP_TRANSACTION_ID e simule:
curl --fail-with-body https://api.quiblypay.com/v3/sandbox/simulate-payment \
  --data-urlencode "client_id=$QP_CLIENT_ID" \
  --data-urlencode "client_secret=$QP_CLIENT_SECRET" \
  --data-urlencode "transaction_id=$QP_TRANSACTION_ID"

# Confirme o status na consulta:
curl --fail-with-body https://api.quiblypay.com/v3/sandbox/pix/transaction \
  --data-urlencode "client_id=$QP_CLIENT_ID" \
  --data-urlencode "client_secret=$QP_CLIENT_SECRET" \
  --data-urlencode "transaction_id=$QP_TRANSACTION_ID"

Node.js (fetch, JSON, somente no servidor)

async function quibly(path, fields, headers = {}) {
  const response = await fetch(`https://api.quiblypay.com${path}`, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json', ...headers },
    body: JSON.stringify({
      ...fields,
      client_id: process.env.QP_CLIENT_ID,
      client_secret: process.env.QP_CLIENT_SECRET,
    }),
  });
  const data = await response.json();
  if (!response.ok) throw new Error(`${response.status}: ${data.message}`);
  return data;
}
const charge = await quibly('/v3/sandbox/pix/qrcode', {
  valor: '25.00',
  nome: 'Cliente Sandbox',
  descricao: 'Pedido de exemplo',
  urlnoty: process.env.QP_WEBHOOK_URL,
});
// Salve charge.transactionId e exiba charge.qrcode.
await quibly('/v3/sandbox/simulate-payment', { transaction_id: charge.transactionId });
const confirmed = await quibly('/v3/sandbox/pix/transaction', {
  transaction_id: charge.transactionId,
});
console.log(confirmed.status);
// Saque, se desejado: quibly('/v3/sandbox/pix/payment',
//   { valor: '25.00', chave_pix: 'CHAVE_PIX_DO_TITULAR', cpf: 'DOCUMENTO_DO_TITULAR' },
//   { 'Idempotency-Key': 'ID_UNICO_DO_SEU_SAQUE' });

Python (biblioteca padrão, form-urlencoded)

import json, os
from urllib.request import Request, urlopen
from urllib.parse import urlencode
from urllib.error import HTTPError

def quibly(path, fields, headers=None):
    body = urlencode({**fields, "client_id": os.environ["QP_CLIENT_ID"],
                      "client_secret": os.environ["QP_CLIENT_SECRET"]}).encode()
    request = Request("https://api.quiblypay.com" + path, data=body,
        headers={"Content-Type": "application/x-www-form-urlencoded", **(headers or {})}, method="POST")
    try:
        with urlopen(request, timeout=30) as response:
            return json.load(response)
    except HTTPError as error:
        data = json.load(error)
        raise RuntimeError(f"{error.code}: {data.get('message')}") from error

charge = quibly("/v3/sandbox/pix/qrcode", {"valor": "25.00", "nome": "Cliente Sandbox",
    "urlnoty": os.environ["QP_WEBHOOK_URL"]})
# Salve charge["transactionId"] e exiba charge["qrcode"].
quibly("/v3/sandbox/simulate-payment", {"transaction_id": charge["transactionId"]})
confirmed = quibly("/v3/sandbox/pix/transaction", {"transaction_id": charge["transactionId"]})
print(confirmed["status"])

PHP (extensão cURL, form-urlencoded)

<?php
function quibly(string $path, array $fields, array $headers = []): array {
    $fields['client_id'] = getenv('QP_CLIENT_ID');
    $fields['client_secret'] = getenv('QP_CLIENT_SECRET');
    $ch = curl_init('https://api.quiblypay.com' . $path);
    curl_setopt_array($ch, [CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT => 30, CURLOPT_POSTFIELDS => http_build_query($fields),
        CURLOPT_HTTPHEADER => array_merge(['Content-Type: application/x-www-form-urlencoded'], $headers)]);
    $raw = curl_exec($ch);
    $status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
    if ($raw === false) { $error = curl_error($ch); curl_close($ch); throw new RuntimeException($error); }
    curl_close($ch);
    $data = json_decode($raw, true, 512, JSON_THROW_ON_ERROR);
    if ($status < 200 || $status >= 300) throw new RuntimeException($status . ': ' . ($data['message'] ?? 'Erro da API'));
    return $data;
}
$charge = quibly('/v3/sandbox/pix/qrcode', ['valor' => '25.00', 'nome' => 'Cliente Sandbox',
    'urlnoty' => getenv('QP_WEBHOOK_URL')]);
// Salve $charge['transactionId'] e exiba $charge['qrcode'].
quibly('/v3/sandbox/simulate-payment', ['transaction_id' => $charge['transactionId']]);
$confirmed = quibly('/v3/sandbox/pix/transaction', ['transaction_id' => $charge['transactionId']]);
echo $confirmed['status'];

On this page