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'];