Segurança¶
Antes de enviar o pagamento¶
- Gere uma referência única, de exatamente 15 caracteres, no servidor com
Vinti4Net::generateMerchantRef()e aplique uma restriçãoUNIQUEna base de dados. - Leia o montante (amount) do sua base de dados, não do formulário do cliente.
- Guarde a referência, sessão, montante, moeda e estado
pendente. - Só então chame pelo formulário Vinti4Net.
Ao receber o callback¶
- Passe o POST original para
processResponse(). - Interrompa se
hasInvalidFingerprint()for verdadeiro. - Trate cancelamento e erro sem confirmar o pedido.
- Em sucesso, localize o pedido pela referência.
- Compare sessão e dados da operação guardada, incluindo o montante de uma compra. No estorno, o callback pode trazer montante
0: confira o valor original no pedido que você enviou à SISP, não contragetAmount()do estorno. - Confirme uma única vez, dentro de uma transação no base de dados.
- Guarde
transactionIdeclearingPeriodpara caso precisar fazer estornos.
Idempotência¶
O mesmo callback pode chegar ou ser processado mais de uma vez. Atualize o pedido somente se ele ainda estiver pendente.
if ($payment->status === 'paid') {
exit('OK');
}
// Atualize para pago e grave o transaction ID atomicamente.
Dados sensíveis¶
- Nunca salve o
posAuthCodeno código-fonte (use .env). - Não envie credenciais ao navegador.
- Não registre o payload bruto sem filtrar.
- Não armazene o PAN (card number) completo.
- Use HTTPS no callback.
- Não confie em parâmetros enviados pelo cliente para definir o valor.
Redirecionamento não é confirmação¶
O cliente voltar ao seu site não significa que pagou. A confirmação vem da resposta processada e das verificações feitas no servidor.