Para efetuar o pedido de pagamento Online devem ser enviados os seguintes dados:
// CONFIGURAÇÕES
$posID = "90051";
$posAutCode = "123456789A";
// OBTER DADOS DE PAGAMENTO
$amount = "1000";
$merchantRef = "R" . date('YmdHms');
$merchantSession = "S" . date('YmdHms');
$dateTime = date('Y-m-d H:m:s');
$entityCode = "";
$referenceNumber = "";
// URL PARA RECEBER RESPOSTA/RESULTADO DO PAGAMENTO
$responseUrl = "http://www.meusite.com/resposta_pagamento.php";
// DADOS A ENVIAR
$fields = [
'transactionCode' => '1',
'posID' => '90051',
'merchantRef' => $merchantRef,
'merchantSession' => $merchantSession,
'amount' => $amount,
'currency' => '132',
'is3DSec' => '1',
'urlMerchantResponse' => $responseUrl,
'languageMessages' => 'en',
'timeStamp' => $dateTime,
'fingerprintversion' => '1'
];
// GERAR PRINGER PRINT E ADICIONAR AOS DADOS DE ENVIO
$fields['fingerprint'] = GerarFingerPrintEnvio(
$posAutCode, $fields['timeStamp'], $amount,
$fields['merchantRef'], $fields['merchantSession'], $fields['posID'],
$fields['currency'], $fields['transactionCode'], $entityCode, $referenceNumber
);
// URL PARA FAZER REQUISIÇÃO
$postUrl = "https://mc.vinti4net.cv/Client_VbV_v2/biz_vbv_clientdata.jsp?FingerPrint=" . urlencode($fields["fingerprint"]) . "&TimeStamp=" . urlencode($fields["timeStamp"]) . "&FingerPrintVersion=" . urlencode($fields["fingerprintversion"]);
O FingerPrint é gerado no âmbito de pagamento para garantir que os dados não foram alterados no envio.
O FingerPrint de envio de dados pode ser gerado utilizando a seguinte função.
function GerarFingerPrintEnvio
(
$posAutCode, $timestamp, $amount,
$merchantRef, $merchantSession, $posID,
$currency, $transactionCode, $entityCode,
$referenceNumber
)
{
$toHash = base64_encode(hash('sha512', $posAutCode, true)) . $timestamp . ((int)((float)$amount * 1000))
. $merchantRef . $merchantSession . $posID
. $currency . $transactionCode . $entityCode . $referenceNumber
;
return base64_encode(hash('sha512', $toHash, true));
}
O FingerPrint de validar a resposta em caso de sucesso calcula-se de forma semelhante porêm com campos adicionais,
o desenvolvedor deve calcular o finger print de resposta seguindo a documentação disponibilizada pela SISP. Caso o desenvolvedor não valide o FingerPrint de resposta podem ser feitas compras fraudulentas no seu site ou sua aplicação.
function GerarFingerPrintRespostaBemSucedida
(
$posAutCode, $messageType, $clearingPeriod,
$transactionID, $merchantReference, $merchantSession,
$amount, $messageID, $pan,
$merchantResponse, $timestamp, $reference,
$entity, $clientReceipt, $additionalErrorMessage,
$reloadCode
)
{
// EFETUAR O CALCULO CONFORME A DOCUMENTAÇÃO
$toHash = base64_encode(hash('sha512', $posAutCode, true)) . $messageType . $clearingPeriod . $transactionID
. $merchantReference . $merchantSession .
((int)((float)$amount * 1000)) . $messageID . $pan .
$merchantResponse . $timestamp . $reference .
$entity . $clientReceipt . $additionalErrorMessage .
$reloadCode
;
return base64_encode(hash('sha512', $toHash, true));
}
Para enviar os dados o programador deve gerar um formulário e permitir que este faça post de forma automática.
Segue o código de Exemplo.
<html>
<head>
<title>Pagamento vinti4</title>
</head>
<body onload='autoPost()'>
<div>
<h5>Processando o pagamento...</h5>
<form action='<?= $postUrl ?>' method='post'>
<?php
foreach ($fields as $key => $value) {
echo "<input type='hidden' name='" . $key . "' value='" . $value . "'>";
}
?>
</form>
</div>
<script>
function autoPost()
{
document.forms[0].submit();
}
</script>
</body>
</html>
No End Point (URL a receber resposta de pagamento) para validar o resultado de pagamento deve-se verificar se a resposta é de sucesso ou não, recordando que em caso de sucesso o campo messageType terá um dos seguintes valores "8", "10", "M" ou "P".
Além de verificar o campo messageType deve-se verificar se o FingerPrint recebido no campo resultFingerPrint é igual ao esperado que é calculado conforme a utilização da função GerarFingerPrintRespostaBemSucedida.
<?php
// resposta_pagamento.php
// OBTER DADOS
$posAutCode = "123456789A";
// CONSTANTES DE RESPOSTA DE SUCESSOS
$successMessageType = array('8', '10', 'P', 'M');
// TRANSAÇÃO COM RESPOSTA DE SUCESSO
if(isset($_POST["messageType"]) && in_array($_POST["messageType"], $successMessageType))
{
// CALCULAR FINGERPRINT
$fingerPrintCalculado = GerarFingerPrintRespostaBemSucedida(...);
/*ATENÇÃO: VALIDAR FRINGERPRINT DE SUCESSO
PARA OBTER UMA MELHOR GARANTIA DE SEGURANÇA*/
if($_POST["resultFingerPrint"] == $fingerPrintCalculado)
{
// TRANSACAO BEM SUCEDIDA
echo "Sucesso";
}
else
{
// FINGER PRINT RECEBIDO E CALCULADO SAO DIFERENTES
echo "Erro";
echo "Finger Print de Resposta Inválida";
}
}
else if(isset($_POST["UserCancelled"]) && $_POST["UserCancelled"] == "true")
{
echo "Utilizador cancelou a requisição de compra";
}
else
{
echo "Erro";
echo "<br>";
echo $_POST["merchantRespErrorDescription"];
echo "<br>";
echo $_POST["merchantRespErrorDetail"];
}
?>