AcapaPay · CodeIgniter SDK
Iniciar um Pagamento (Checkout Session)
Como Funciona
Ao contrário do SDK Laravel, aqui não existe Facade nem service locator: o SDK é usado sempre por instância direta da classe AcapaPay\CodeIgniter\AcapaPay. Internamente o SDK pede um token OAuth2 (Client Credentials) — reutilizando um token em cache quando disponível via obterTokenCached() — cria a sessão de checkout, e devolve o URL de pagamento para redirecionar (ou embutir em iFrame) o utilizador.
plan_reference_code é obrigatório
O AcapaPay exige sempre um plan_reference_code válido e previamente sincronizado (ver Sincronização de Planos). Não é possível criar uma sessão de checkout apenas com um amount avulso.
Duas Formas de Criar a Sessão
O SDK expõe dois métodos equivalentes:
checkoutSession()— espelha a assinatura do SDK Laravel e devolve apenas ourlde redirecionamento (string).criarSessaoPagamento()— recebe um array associativo, devolve a resposta completa da API, e é o único que permite sobrepor pontualmente oamountdo plano (ex: para descontos).
Assinatura de checkoutSession()
public function checkoutSession(
mixed $userId, // ID do utilizador na sua base de dados
string $planReferenceCode, // Referência do plano (ex: 'PRO_YEARLY')
array $metadata = [], // Dados extras devolvidos no Webhook
?string $successUrl = null, // URL para onde redirecionar após pagamento
?string $cancelUrl = null // URL para onde redirecionar se o utilizador cancelar
): string // Devolve apenas o URL da sessão de checkout
Assinatura de criarSessaoPagamento()
/**
* @param array{
* user_id: mixed,
* plan_reference_code: string,
* amount?: int, // opcional: sobrepõe o preço do plano, em cêntimos
* currency?: string, // usado apenas se 'amount' for definido (padrão: 'AOA')
* success_url?: string,
* cancel_url?: string,
* metadata?: array,
* } $dados
*/
public function criarSessaoPagamento(array $dados): array // Devolve a resposta completa da API
Exemplo Completo no Controller (CodeIgniter 4)
<?php
namespace App\Controllers;
use AcapaPay\CodeIgniter\AcapaPay;
use CodeIgniter\Controller;
class PagamentoController extends Controller
{
public function comprarPlano()
{
$userId = session()->get('user_id');
$plano = 'PRO_YEARLY';
try {
$acapapay = new AcapaPay();
$urlDePagamento = $acapapay->checkoutSession(
$userId,
$plano,
['local_user_id' => $userId],
site_url('pagamento/sucesso'),
site_url('pagamento/cancelado')
);
return view('pagamento/checkout', ['urlDePagamento' => $urlDePagamento]);
} catch (\Throwable $e) {
return redirect()->back()->with('error', $e->getMessage());
}
}
}
Exemplo com criarSessaoPagamento() (com override de preço)
$acapapay = new AcapaPay();
$dados = $acapapay->criarSessaoPagamento([
'user_id' => $userId,
'plan_reference_code' => 'PRO_YEARLY',
'amount' => 15000, // opcional: sobrepõe o preço do plano, em cêntimos
'currency' => 'AOA',
'success_url' => site_url('pagamento/sucesso'),
'cancel_url' => site_url('pagamento/cancelado'),
'metadata' => ['local_user_id' => $userId],
]);
$urlDePagamento = $dados['url'];
Embutir o Checkout com renderIframe()
Para manter o utilizador dentro do seu site sem redirecionamento, use o método renderIframe(), que devolve o HTML pronto a imprimir (não é um componente Blade — o SDK renderiza a sua própria view interna em src/Views/iframe.php):
public function renderIframe(string $checkoutUrl, array $opts = []): string
// $opts aceita 'height' (padrão '700px') e 'width' (padrão '100%')
<?= (new \AcapaPay\CodeIgniter\AcapaPay())->renderIframe($urlDePagamento, ['height' => '800px']) ?>
Eventos JavaScript no iFrame
O HTML devolvido por renderIframe() já escuta os eventos postMessage disparados pela página de sucesso/cancelamento no AcapaDev, e relança-os como CustomEvent no window: acapapay-success e acapapay-cancel. Basta escutar estes eventos em JavaScript no seu lado.
Metadata é a sua âncora: tudo o que colocar no array metadata durante o checkout será devolvido integralmente no payload do Webhook quando o pagamento for confirmado. Use sempre local_user_id para conseguir identificar qual utilizador/pedido atualizar na sua base de dados — ver Webhooks.