Ir para o conteúdo

Integração completa

1. Criar o pedido no seu sistema

Antes de chamar a biblioteca, guarde referência única, sessão, montante, moeda, cliente e estado pendente.

$reference = 'R' . date('YmdHis');
$session = 'S' . date('YmdHis');
$amount = 1500;

Use uma referência única de exatamente 15 caracteres e guarde-a antes de enviar o pagamento à SISP:

$reference = Vinti4Net::generateMerchantRef();

$sdk->setMerchant($reference);

Por padrão, o SDK utiliza R + ymdHis + dois caracteres alfanuméricos aleatórios. Para gerar uma referência totalmente aleatória:

$reference = Vinti4Net::generateMerchantRef(random: true);

2. Preparar a transação

$vinti4
    ->setMerchant($reference, $session)
    ->preparePurchase($amount, $billing);

Se não quiser enviar dados de billing, use preparePurchase($amount, []).

Use um método prepare...() por envio. Outro prepare...() substitui os dados específicos da transação anterior.

3. Enviar para a Vinti4

echo $vinti4->createPaymentForm(
    responseUrl: 'https://loja.example.cv/pagamentos/vinti4/callback',
    lang: 'pt',
);

O método retorna o formulário que encaminha o cliente para a Vinti4.

4. Receber e classificar o callback

$response = $vinti4->processResponse($_POST);

if ($response->hasInvalidFingerprint()) {
    http_response_code(400);
    exit('Resposta inválida.');
}

if ($response->isCancelled()) {
    exit('Operação cancelada.');
}

if ($response->hasFailed()) {
    http_response_code(422);
    exit($response->message);
}

5. Validar contra o seu banco

Dado Callback Seu backend (db)
Referência getMerchantRef() referência do pedido
Sessão getMerchantSession() sessão da tentativa
Montante getAmount() total esperado
Estado isSuccess() ainda pendente

Só confirme a compra quando tudo estiver correto. getCurrency() pode ser null se a resposta não trouxer moeda; compare a moeda quando houver esse campo e use a moeda guardada no pedido para o restante da validação.

Para estornos, não compare getAmount() com o valor original: o callback aprovado pode trazer 0. Recupere o montante do estorno guardado na aplicação. Um erro messageType=6 também não identifica por si só se veio de pagamento ou estorno.

6. Guardar dados para reembolso

$transactionId = $response->getTransactionId();
$clearingPeriod = $response->getClearingPeriod();

7. Mostrar o recibo

echo $response->isDccEnabled()
    ? $response->renderDccReceipt()
    : $response->renderReceipt(data: [
        'companyName' => 'Minha Empresa, Lda.',
    ]);
Estado Ação recomendada
SUCCESS Conferir os dados e confirmar uma vez
ERROR Mostrar mensagem segura e permitir nova tentativa
CANCELLED Não confirmar; permitir voltar ao pedido
INVALID_FINGERPRINT Rejeitar e investigar