using System.Security.Cryptography;
using System.Collections.Generic;
public static void Main()
var merchantCode = "034761064";
var transactionType = "0";
var merchantUrl = "http://www.prueba.com/urlNotificacion.php";
var urlOK = "http://www.prueba.com/urlOK.php";
var urlKO = "http://www.prueba.com/urlKO.php";
var commerceOrderNumber = "12010111041";
var commerceKey = "sq7HjrUOBfKmC576ILgskD5srU870gJ7";
RedsysAPI redsysParameters = new RedsysAPI();
redsysParameters.SetParameter("DS_MERCHANT_AMOUNT", amount);
redsysParameters.SetParameter("DS_MERCHANT_ORDER", commerceOrderNumber);
redsysParameters.SetParameter("DS_MERCHANT_MERCHANTCODE", merchantCode);
redsysParameters.SetParameter("DS_MERCHANT_CURRENCY", moneda);
redsysParameters.SetParameter("DS_MERCHANT_TRANSACTIONTYPE", transactionType);
redsysParameters.SetParameter("DS_MERCHANT_TERMINAL", terminal);
redsysParameters.SetParameter("DS_MERCHANT_MERCHANTURL", merchantUrl);
redsysParameters.SetParameter("DS_MERCHANT_URLOK", urlOK);
redsysParameters.SetParameter("DS_MERCHANT_URLKO", urlKO);
string parameters = redsysParameters.createMerchantParameters().Dump("PARAMETEEEEEEEEEEEEEEERS!!!!!!!!!!!!!");
string firma = redsysParameters.createMerchantSignature(commerceKey).Dump("FIRMAAAAAAAAAAAAAAA!!!!!!!!!!!!!!!!!");
public static class DumpExtensions
public static string Dump(this string text, string caption=null)
if(!string.IsNullOrEmpty(caption))
Console.WriteLine(caption);
private Dictionary<string, string> m_keyvalues;
m_keyvalues = new Dictionary<string, string>();
public string GetParameter(string key)
if (m_keyvalues.ContainsKey(key))
public void SetParameter(string key, string value)
m_keyvalues.Add(key, value);
private string ToJson(Dictionary<string, string> keyvalues)
string res = JsonConvert.SerializeObject(keyvalues, Newtonsoft.Json.Formatting.None);
catch (JsonSerializationException ex)
throw new JsonSerializationException(ex.Message);
private string Base64Encode(string toEncode)
byte[] toEncodeAsBytes = System.Text.Encoding.UTF8.GetBytes(toEncode);
string returnValue = System.Convert.ToBase64String(toEncodeAsBytes);
catch (FormatException ex)
throw new FormatException(ex.Message);
private string Base64Encode_url(string toEncode)
byte[] toEncodeAsBytes = System.Text.Encoding.UTF8.GetBytes(toEncode);
string returnValue = System.Convert.ToBase64String(toEncodeAsBytes).Replace('+', '-').Replace('/', '_');
catch (FormatException ex)
throw new FormatException(ex.Message);
private string Base64Encode2(byte[] toEncode)
= System.Convert.ToBase64String(toEncode);
catch (FormatException ex)
throw new FormatException(ex.Message);
private string Base64Decode_url(string encodedData)
byte[] encodedDataAsBytes = System.Convert.FromBase64String(encodedData.Replace('-', '+').Replace('_', '/'));
string returnValue = System.Text.Encoding.UTF8.GetString(encodedDataAsBytes);
return HttpUtility.UrlDecode(returnValue);
catch (FormatException ex)
throw new FormatException(ex.Message);
private byte[] Base64Decode(string encodedData)
byte[] encodedDataAsBytes = System.Convert.FromBase64String(encodedData);
return encodedDataAsBytes;
catch (FormatException ex)
throw new FormatException(ex.Message);
public string createMerchantParameters()
string json = ToJson(m_keyvalues);
string j = Base64Encode(json);
private string getOrder()
if (m_keyvalues.ContainsKey("DS_MERCHANT_ORDER"))
numOrder = m_keyvalues["DS_MERCHANT_ORDER"];
if (m_keyvalues.ContainsKey("Ds_Merchant_Order"))
numOrder = m_keyvalues["Ds_Merchant_Order"];
public string createMerchantSignature(string key)
byte[] k = Base64Decode(key);
string ent = createMerchantParameters();
byte[] kk = cryp.Encrypt3DES(getOrder(), k);
byte[] res = cryp.GetHMACSHA256(ent, kk);
string result = Base64Encode2(res);
public string decodeMerchantParameters(string dat)
return Base64Decode_url(dat);
private Dictionary<string, string> FromJson(string json)
Dictionary<string, string> res = JsonConvert.DeserializeObject<Dictionary<string, string>>(json);
catch (JsonSerializationException ex)
throw new JsonSerializationException(ex.Message);
private string GetOrderNotif()
if (m_keyvalues.ContainsKey("Ds_Order"))
numOrder = m_keyvalues["Ds_Order"];
if (m_keyvalues.ContainsKey("DS_ORDER"))
numOrder = m_keyvalues["DS_ORDER"];
public string createMerchantSignatureNotif(string key, string data)
var k = Base64Decode(key);
var deco = Base64Decode_url(data);
m_keyvalues = FromJson(deco);
var derivatekey = cryp.Encrypt3DES(GetOrderNotif(), k);
var res = cryp.GetHMACSHA256(data, derivatekey);
string res2 = Base64Encode2(res);
return res2.Replace('+', '-').Replace('/', '_');
public byte[] GetHMACSHA256(string msg, byte[] key)
byte[] msgBytes = Encoding.UTF8.GetBytes(msg);
using (HMACSHA256 hmac = new HMACSHA256(key))
byte[] hashValue = hmac.ComputeHash(msgBytes, 0, msgBytes.Length);
catch (CryptographicException ex)
throw new CryptographicException(ex.Message);
public byte[] Encrypt3DES(string plainText, byte[] key)
if (String.IsNullOrEmpty(plainText))
throw new FormatException();
byte[] toEncryptArray = Encoding.UTF8.GetBytes(plainText);
TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
byte[] SALT = new byte[8] { 0, 0, 0, 0, 0, 0, 0, 0 };
tdes.Mode = CipherMode.CBC;
tdes.Padding = PaddingMode.Zeros;
var cTransform = tdes.CreateEncryptor();
cTransform.TransformFinalBlock(toEncryptArray, 0,
catch (CryptographicException ex)
throw new CryptographicException(ex.Message);