carecapay / sdk-php
SDK oficial PHP da CarecaPay — cobranças Pix, saldo e verificação de webhooks.
Requires
- php: ^8.1
- ext-curl: *
- ext-json: *
Requires (Dev)
- phpunit/phpunit: ^10.5
README
SDK oficial da CarecaPay para PHP: cobranças Pix,
saldo e webhooks. Sem dependências além de ext-curl/ext-json
(PHP 8.1+).
Instalação
composer require carecapay/sdk-php
Beta: enquanto o pacote não está no Packagist, aponte um repositório
path/vcsdo Composer paracarecapay-sdk-php.
Pré-requisito: a chave privada (obrigatória)
Toda chamada é autenticada pela sua chave secreta (ccp_secret_...),
gerada no painel em Chaves de API — ela aparece uma única vez. O construtor
exige uma chave privada válida e falha na hora com chave pública, vazia ou de
outro formato:
use CarecaPay\CarecaPay; $carecapay = new CarecaPay($_ENV['CARECAPAY_SECRET_KEY']);
O ambiente vem embutido na chave (ccp_secret_sandbox_... → sandbox,
ccp_secret_live_... → produção). Para desenvolvimento local:
$carecapay = new CarecaPay($key, ['base_url' => 'http://localhost:8080']);
Uso
$charge = $carecapay->charges->create([ 'amount_cents' => 1990, // R$ 19,90 — sempre em centavos, obrigatório 'description' => 'Assinatura', // opcional 'external_reference' => 'order_42', // opcional — seu id do pedido, só guardamos e devolvemos ]); echo $charge['qr_code']; // copia e cola do Pix echo $charge['qr_code_base64']; // PNG já renderizado (base64), pronto pra exibir $carecapay->charges->get('txn_...'); $carecapay->charges->list(['status' => 'paid', 'limit' => 10]); $carecapay->balance->get(); // ['available_cents' => ..., 'pending_cents' => ...] // só no sandbox: baixa fake (dispara o webhook também) $carecapay->charges->simulatePayment($charge['id']);
Os arrays devolvidos têm exatamente os shapes da API REST (snake_case).
Clientes (opcional)
Identificar o pagador é opcional — o Pix funciona sem isso. Use customer_id
(cliente já cadastrado) ou customer (cria/completa na hora pelo documento),
nunca os dois juntos:
// cliente já cadastrado $carecapay->charges->create(['amount_cents' => 1990, 'customer_id' => 'cust_...']); // cria (ou completa, se o documento já existir) um cliente na hora $carecapay->charges->create([ 'amount_cents' => 1990, 'customer' => ['document' => '111.444.777-35', 'name' => 'Fulano de Tal'], ]); // gerenciar clientes diretamente $customer = $carecapay->customers->create(['document' => '11144477735']); $carecapay->customers->get($customer['id']); $carecapay->customers->list();
Webhooks (recomendado)
Configure sua URL e um segredo no painel (Webhooks). Cada entrega vem com dois mecanismos de verificação.
Com o SDK (recomendado): assinatura verificada em 1 chamada
Webhooks::constructEvent valida o HMAC (rejeita corpo adulterado e entregas
antigas) usando o corpo CRU da requisição (php://input):
use CarecaPay\Webhooks; use CarecaPay\CarecaPayWebhookException; try { $event = Webhooks::constructEvent( payload: file_get_contents('php://input'), // corpo cru! header: $_SERVER['HTTP_X_CARECAPAY_SIGNATURE'] ?? '', secret: $_ENV['CARECAPAY_WEBHOOK_SECRET'], // ccp_whsec_... ); } catch (CarecaPayWebhookException) { http_response_code(400); exit; } if ($event['type'] === 'charge.paid') { liberarPedido($event['data']['id']); // deduplique pelo $event['id'] } http_response_code(200);
Webhooks::verifySignature($payload, $header, $secret) devolve só o booleano.
Entregas com mais de 5 minutos são rejeitadas ($toleranceSeconds ajusta).
Sem SDK / mais simples: comparar o token
Todo POST também traz o segredo cru no header X-CarecaPay-Token. É mais
simples, mas não detecta corpo adulterado nem repetição de entrega, então
exige HTTPS na sua URL:
if (($_SERVER['HTTP_X_CARECAPAY_TOKEN'] ?? '') !== $_ENV['CARECAPAY_WEBHOOK_SECRET']) { http_response_code(401); // não veio da CarecaPay exit; }
Erros
use CarecaPay\CarecaPayException; try { $carecapay->charges->create(['amount_cents' => 0]); } catch (CarecaPayException $err) { $err->code; // "invalid_amount" (estável — programe contra ele) $err->status; // 400 (0 em falha de rede, code "network_error") }
Desenvolvimento
composer install && composer test