using System.Globalization;
using System.Security.Cryptography;
public static void Main()
string signatureTrx = "86853468CD67DA84D42B8FF43BFBB55095E4F1484CF82A5C55F331CDFFFC2076";
string trxPAN = "9360000917283257735";
string trxCode = "000000";
string trxAmount = "000005500000";
string trxTime = "132458";
string merchantType = "5814";
string acquirerID = "93600009";
string retrievalReferenceNumber = "RCA000000005";
string terminalID = "ID00055POS08 ";
string merchantID = "614705261 ";
string issuerID = "93600009";
string invoiceNumber = "B004129186B004129186";
string signatureData = (trxPAN + trxCode + trxAmount + trxTime + trxDate + merchantType + acquirerID + retrievalReferenceNumber + terminalID + merchantID + issuerID + invoiceNumber);
string signatureTrxCheck = signature(signatureData, acquirerID);
if (signatureTrx.Equals(signatureTrxCheck)){
Console.WriteLine("SAMA : " + signatureTrx + " + " + signatureTrxCheck);
Console.WriteLine("BEDA : " + signatureTrx + " + " + signatureTrxCheck);
public static string signature(string signatureData, string acquirerID)
string signatureTrx = string.Empty;
string secretKey = "f7cb5c27-073d-4f7c-a4af-e9dd2befc356";
string secretKeySPE = "c4fd5b46-23bd-4cd8-b635-607cc4a73cfd";
if (acquirerID.Equals("93600009"))
signatureTrx = ComputeSha256Hash(signatureData + secretKeySPE);
Console.WriteLine("signatureDataBNIxSPE : " + signatureData + secretKeySPE);
signatureTrx = ComputeSha256Hash(signatureData + secretKey);
Console.WriteLine("signatureDataBNIxAJ : " + signatureData + secretKey);
Console.WriteLine("signatureTrxCheckBNI : " + signatureTrx.ToUpper());
return signatureTrx.ToUpper();
public static string ComputeSha256Hash(string text)
using (SHA256 sha256Hash = SHA256.Create())
byte[] bytes = sha256Hash.ComputeHash(Encoding.UTF8.GetBytes(text));
StringBuilder builder = new StringBuilder();
for (int i = 0; i < bytes.Length; i++)
builder.Append(bytes[i].ToString("x2"));
return builder.ToString();
public static string getQRTag(string strHex)
if (strHex.Substring(pos, 2).Equals("85"))
int taglength = int.Parse(strHex.Substring(pos + 2, 2), System.Globalization.NumberStyles.HexNumber) * 2;
Console.WriteLine("tag85 : " + strHex.Substring(4, taglength));
Console.WriteLine("Tag 85 Error");
if (strHex.Substring(pos, 2).Equals("61"))
if(strHex.Substring(pos + 2, 2).Equals("81")){
taglength = int.Parse(strHex.Substring(pos + 4, 2), System.Globalization.NumberStyles.HexNumber) * 2;
valTag61 = strHex.Substring(pos + 6, taglength);
taglength = int.Parse(strHex.Substring(pos + 2, 2), System.Globalization.NumberStyles.HexNumber) * 2;
valTag61 = strHex.Substring(pos + 4, taglength);
Console.WriteLine("tag61 : " + valTag61);
if(valTag61.Substring(pos1,2).Equals("4F")){
int taglength1 = int.Parse(valTag61.Substring(pos1 + 2, 2), System.Globalization.NumberStyles.HexNumber) * 2;
Console.WriteLine("tag4F : " + valTag61.Substring(pos1 + 4, taglength1));
if (valTag61.Substring(pos1, 2).Equals("50"))
int taglength1 = int.Parse(valTag61.Substring(pos1 + 2, 2), System.Globalization.NumberStyles.HexNumber) * 2;
Console.WriteLine("tag50 : " + valTag61.Substring(pos1 + 4, taglength1));
if (valTag61.Substring(pos1, 2).Equals("5A"))
int taglength1 = int.Parse(valTag61.Substring(pos1 + 2, 2), System.Globalization.NumberStyles.HexNumber) * 2;
Console.WriteLine("tag5A : " + valTag61.Substring(pos1 + 4, taglength1));
if (valTag61.Substring(pos1, 4).Equals("5F20"))
int taglength1 = int.Parse(valTag61.Substring(pos1 + 4, 2), System.Globalization.NumberStyles.HexNumber) * 2;
Console.WriteLine("tag5F20 : " + hex2str(valTag61.Substring(pos1 + 6, taglength1)));
if (valTag61.Substring(pos1, 4).Equals("5F2D"))
int taglength1 = int.Parse(valTag61.Substring(pos1 + 4, 2), System.Globalization.NumberStyles.HexNumber) * 2;
Console.WriteLine("tag5F2D : " + valTag61.Substring(pos1 + 6, taglength1));
if (valTag61.Substring(pos1, 4).Equals("5F50"))
int taglength1 = int.Parse(valTag61.Substring(pos1 + 4, 2), System.Globalization.NumberStyles.HexNumber) * 2;
Console.WriteLine("tag5F50 : " + hex2str(valTag61.Substring(pos1 + 6, taglength1)));
if (valTag61.Substring(pos1, 4).Equals("9F25"))
int taglength1 = int.Parse(valTag61.Substring(pos1 + 4, 2), System.Globalization.NumberStyles.HexNumber) * 2;
Console.WriteLine("tag9F25 : " + valTag61.Substring(pos1 + 6, taglength1));
if (valTag61.Substring(pos1, 2).Equals("63"))
int taglength1 = int.Parse(valTag61.Substring(pos1 + 2, 2), System.Globalization.NumberStyles.HexNumber) * 2;
string valTag63 = valTag61.Substring(pos1 + 4, taglength1);
Console.WriteLine("tag63 : " + valTag63);
if (valTag63.Substring(pos2, 4).Equals("9F74"))
int taglength2 = int.Parse(valTag63.Substring(pos2 + 4, 2), System.Globalization.NumberStyles.HexNumber) * 2;
string hexTag9F74 = valTag63.Substring(pos2 + 6, taglength2);
Console.WriteLine("tag9F74 : " + hexTag9F74);
string strTag9F74 = hex2str(hexTag9F74);
string valTag9F74 = getStr9F74(ReverseString(strTag9F74));
string[] split = valTag9F74.Split("-".ToCharArray());
Console.WriteLine("bank : " + split[0]);
Console.WriteLine("timestamp : " + split[1]);
Console.WriteLine("accountNum : " + split[2]);
if (uname.Substring(0, 1).Equals("^"))
uname = uname.Substring(1, (uname.Length - 1));
Console.WriteLine("usernme : " + uname);
Console.WriteLine("Error : " + ex.Message);
private static string getStr9F74(string valTag9F74)
string str1 = valTag9F74.Substring(0, (valTag9F74.Length / 2));
string str2 = valTag9F74.Substring((valTag9F74.Length / 2), (valTag9F74.Length / 2));
for(int i = 0; i<str1.Length;i++){
private static string ReverseString(string s)
char[] arr = s.ToCharArray();
private static string hex2str(string strHex)
StringBuilder sb = new StringBuilder();
for (int i = 0; i < strHex.Length - 1; i += 2)
sb.Append((char)Int16.Parse(strHex.Substring(i, 2), NumberStyles.AllowHexSpecifier));