Documentação

Exemplo de Código em NodeJS



Dados a Enviar


Para efetuar o pedido de pagamento Online devem ser enviados os seguintes dados:


// CONFIGURACOES
var posID = "90051";
var posAutCode = "123456789A";


// OBTER DADOS DE PAGAMENTO
var amount = "1000";
var merchantRef = "R" + moment().format('YYYYMMDDHHmmss');
var merchantSession = "S" + moment().format('YYYYMMDDHHmmss');
var dateTime = moment().format('YYYY-MM-DD HH:mm:ss');


// URL PARA RECEBER RESPOSTA/RESULTADO DO PAGAMENTO
var responseUrl = "https://www.meusite.com/resposta-pagamento";


// DADOS A ENVIAR
var formData = {
transactionCode: "1",
posID: posID,

merchantRef: merchantRef,
merchantSession: merchantSession,
amount: amount,
currency: "132",
is3DSec: "1",
urlMerchantResponse: responseUrl,
languageMessages: "pt",
timeStamp: dateTime,
fingerprintversion: "1",
entityCode: "",
referenceNumber: ""
};


//GERAR PRINGER PRINT E ADICIONAR AOS DADOS DE ENVIOformData.fingerprint = GerarFingerPrintEnvio(		posAutCode, formData.timeStamp, formData.amount,		formData.merchantRef, formData.merchantSession, formData.posID,		formData.currency, formData.transactionCode, formData.entityCode, formData.referenceNumber	);


// URL PARA FAZER REQUISIÇÃO
var postURL = "https://mc.vinti4net.cv/Client_VbV_v2/biz_vbv_clientdata.jsp?FingerPrint=" + encodeURIComponent(formData.fingerprint ) + "&TimeStamp=" + encodeURIComponent(formData.timeStamp) + "&FingerPrintVersion=" + encodeURIComponent(formData.fingerprintversion);




Calcular Fingerprint


FingerPrint  é gerado para garantir que os dados não foram alterados no envio, dando assim uma melhor

segurança ao processamento de pagamento.


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)
{
    var toHash =
        GenerateSHA512StringToBase64(posAutCode) + timestamp + (Number(parseFloat(amount) * 1000)) +
        merchantRef.trim() + merchantSession.trim() + posID.trim() +
        currency.trim() + transactionCode.trim();
    if (entityCode)
        toHash += Number(entityCode.trim());
    if (referenceNumber)
        toHash += Number(referenceNumber.trim());
    return GenerateSHA512StringToBase64(toHash);
}

Funções auxiliares
function ToBase64 (u8) {
    return btoa(String.fromCharCode.apply(null, u8));
}
function GenerateSHA512StringToBase64(input){
return ToBase64(sha512.digest(input));
}


Depedências utilizadas na função acima.

// CARREGAR BIBLIOTECA DE SHAJS
var sha512 = require('js-sha512');
// CARREGAR BTOA (BIBLIOTECA PARA TRANSFORMAR BINARIO PARA BASE64)
var btoa = require('btoa');


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
}




Criar Formulário de Envio


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.

// CONSTRUIR UM FORM PARA FAZER POST AUTOMATICO
var formHtml = "<html><head><title>Pagamento vinti4</title></head><body onload='autoPost()'><div><h5>Processando o pagamento...</h5>";
formHtml += "<form action='" + postURL + "' method='post'>";
Object.keys(formData).forEach(function(key) {
  formHtml += "<input type='hidden' name='" + key + "' value='" + formData[key] + "'>";
});
formHtml += "</form>";
formHtml += "<script>function autoPost(){document.forms[0].submit();}</script></body></html>";
res.send(formHtml);




Validar 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.


app.post("/resposta-pagamento", urlencodedParser, function(req, res){

// CONSTANTES DE RESPOSTA DE SUCESSOS
var successMessageType = ["8", "10", "M", "P"];
if(successMessageType.includes(req.body.messageType))
{
var posAutCode = "123456789A";
var fingerPrintCalculado = GerarFingerPrintRespostaBemSucedida(
    posAutCode , req.body.messageType , req.body.merchantRespCP ,
            req.body.merchantRespTid , req.body.merchantRespMerchantRef , req.body.merchantRespMerchantSession ,
            req.body.merchantRespPurchaseAmount , req.body.merchantRespMessageID , req.body.merchantRespPan ,
            req.body.merchantResp , req.body.merchantRespTimeStamp , req.body.merchantRespReferenceNumber ,
            req.body.merchantRespEntityCode , req.body.merchantRespClientReceipt , trim(req.body.merchantRespAdditionalErrorMessage) ,
            req.body.merchantRespReloadCode
);
/*ATENÇÃO: VALIDAR FRINGERPRINT DE SUCESSO
PARA OBTER UMA MELHOR GARANTIA DE SEGURANÇA*/
if(req.body.resultFingerPrint == fingerPrintCalculado)
res.send("Pagamento bem sucedido");
else
res.send("Pagamento sem sucesso: Finger Print de Resposta Inválida");
}
else if(req.body.UserCancelled == "true")
{
res.send("Utilizador cancelou a requisição de compra");
}
else
{
res.send("Pagamento sem sucesso");
}
});