Documentação

Exemplo de Código em PHP



Dados a Enviar


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"]);




Como calcular o FingerPrint


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));
}




Formulário de envio de dados


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>




Resposta de Pagamento


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"];
}
?>