Exemplo de Código em C# / AspNet WebForms
Dados a Enviar
Para efetuar o pedido de pagamento Online devem ser enviados os seguintes dados:
// CONFIGURAÇÕES
var posID = "90051";
var posAutCode = "123456789A";
var amount = "1000";
var reference = "R" + DateTime.Now.ToString("yyyyMMddHHmmss");
var session = "S" + DateTime.Now.ToString("yyyyMMddHHmmss");
var datetime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
var entityCode = "";
var referenceNumber = "";
// URL PARA RECEBER RESPOSTA/RESULTADO DO PAGAMENTO
var urlMerchantResponse = "http://www.meusite.com/CallBack";
// DADOS A ENVIAR
NameValueCollection data = new NameValueCollection();
data.Add("posID", posID);
data.Add("transactionCode", "1");
data.Add("merchantRef", reference);
data.Add("merchantSession", session);
data.Add("amount", amount);
data.Add("currency", "132");
data.Add("is3DSec", "1");
data.Add("urlMerchantResponse", urlMerchantResponse);
data.Add("languageMessages", "pt");
data.Add("FingerPrintVersion", "1");
data.Add("TimeStamp", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
data.Add("entityCode", entityCode);
data.Add("referenceNumber", referenceNumber);
// GERAR PRINGER PRINT E ADICIONAR AOS DADOS DE ENVIO
data.Add("FingerPrint", GerarFingerPrintEnvio(posAutCode, data["TimeStamp"], data["amount"],
data["merchantRef"], data["merchantSession"], data["posID"],
data["currency"], data["transactionCode"], entityCode, referenceNumber
));
// URL PARA PROCESSAR PAGAMENTO
var postURL = "https://mc.vinti4net.cv/Client_VbV_v2/biz_vbv_clientdata.jsp?FingerPrint=" + HttpUtility.UrlEncode(data["FingerPrint"]) + "&TimeStamp=" + HttpUtility.UrlEncode(data["TimeStamp"]) + "&FingerPrintVersion=" + data["FingerPrintVersion"];
Como calcular o FingerPrint
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:
public static string GerarFingerPrintEnvio(
string posAutCode, string timestamp, string amount,
string merchantRef, string merchantSession, string posID,
string currency, string transactionCode, string entityCode,
string referenceNumber
)
{
string toHash =
SHA.GenerateSHA512StringToBase64(posAutCode) + timestamp + ((long)(decimal.Parse(amount, System.Globalization.CultureInfo.GetCultureInfo("en-US")) * 1000)) +
merchantRef.Trim() + merchantSession.Trim() + posID.Trim() +
currency.Trim() + transactionCode.Trim();
if (!String.IsNullOrEmpty(entityCode))
toHash += long.Parse(entityCode.Trim());
if (!String.IsNullOrEmpty(referenceNumber))
toHash += long.Parse(referenceNumber.Trim());
return SHA.GenerateSHA512StringToBase64(toHash);
}
Funções auxiliares
public class SHA
{
public static string GenerateSHA512StringToBase64(string inputString)
{
SHA512 sha512 = SHA512Managed.Create();
byte[] bytes = Encoding.UTF8.GetBytes(inputString);
byte[] hash = sha512.ComputeHash(bytes);
return System.Convert.ToBase64String(hash);
}
}
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.
public static string GerarFingerPrintRespostaBemSucedida(
string posAutCode, string messageType, string clearingPeriod,
string transactionID, string merchantReference, string merchantSession,
string amount, string messageID, string pan,
string merchantResponse, string timestamp, string reference,
string entity, string clientReceipt, string additionalErrorMessage,
string reloadCode
)
{
// EFETUAR O CALCULO CONFORME A DOCUMENTAÇÃO
}
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.
StringBuilder form = new StringBuilder();
// CREATE A FORM
form.AppendFormat("<form name='form' action='{0}' method='post'>", postURL);
foreach (string key in data)
{
form.AppendFormat("<input type='hidden' name='{0}' value='{1}' />", key, data[key]);
}
form.Append("</form>");
Panel1.InnerHtml = form.ToString();
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Postback.aspx.cs" Inherits="ExemploVBV2AspNet.Postback" %>
<html>
<head>
<title>Pagamento vinti4</title>
</head>
<body onload='autoPost()'>
<div>
<h5>Processando o pagamento...</h5>
<div id="Panel1" runat="server"></div>
</div>
<script>
function autoPost()
{
document.forms[0].submit();
}
</script>
</body>
</html>
Validar Resposta do 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.
String[] successMessageType = new String[] { "8", "10", "M", "P" };
var posAutCode = "123456789A";
if (!string.IsNullOrEmpty(Request.Form["messageType"]) && successMessageType.Contains(Request.Form["messageType"].ToString()))
{
var fingerPrintCalculado = GerarFingerPrintRespostaBemSucedida(....);
if(Request.Form["resultFingerPrint"].ToString() == fingerPrintCalculado)
{
LblResult.Text = "Pagamento bem sucedido";
}
else
{
LblResult.Text = "Pagamento sem sucesso: Finger Print de Resposta Inválida";
}
}
else if(!string.IsNullOrEmpty(Request.Form["UserCancelled"]) && Request.Form["UserCancelled"].ToString() == "true")
{
LblResult.Text = "Utilizador cancelou a requisição de compra";
}
else
{
LblResult.Text = "Erro";
LblDetail1.Text = Request.Params["merchantRespErrorDescription"];
LblDetail2.Text = Request.Params["merchantRespErrorDetail"];
}