Формирование параметра WMI_SIGNATURE

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
String signature = string.Empty;
String signatureKey = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX";
StringBuilder signatureData = new StringBuilder();
Byte[] signatureHash = new Byte[24];
HashAlgorithm cryptoProvider = new MD5CryptoServiceProvider();
SortedDictionary<string, string> orderParams = new SortedDictionary<string, string>();
// Добавление параметров формы в словарь, сортированный по именам ключей.
orderParams.Add("WMI_MERCHANT_ID", "123456789012");
orderParams.Add("WMI_PAYMENT_AMOUNT", "100.00");
orderParams.Add("WMI_CURRENCY_ID", "643");
orderParams.Add("WMI_PAYMENT_NO", "12345");
orderParams.Add("WMI_DESCRIPTION", "Оплата заказа 12345 в магазине myshop.ru");
orderParams.Add("WMI_EXPIRED_DATE", "");
orderParams.Add("WMI_SUCCESS_URL", "http://www.myshop.ru/payment/success.php");
orderParams.Add("WMI_FAIL_URL", "http://www.myshop.ru/payment/fail.php");
orderParams.Add("WMI_AUTO_ACCEPT", "0");
orderParams.Add("CustomParam1", "Value of custom param 1"); // Дополнительные параметры
orderParams.Add("CustomParam2", "Value of custom param 2"); // магазина тоже учавствуют
orderParams.Add("CustomParam3", "Value of custom param 3"); // в формировании подписи.
// Формирование сообщения, путем объединения значений формы,
// отсортированных по именам ключей в порядке возрастания и
// добавление к нему "секретного ключа" торговой точки.
foreach (string key in orderParams.Keys)
{
signatureData.Append(orderParams[key]);
}
signatureData.Append(signatureKey);
// Формирование значения параметра WMI_SIGNATURE, путем
// вычисления отпечатка, сформированного выше сообщения,
// по алгоритму MD5 и представление его в Base64.
signatureHash = cryptoProvider.ComputeHash(Encoding.GetEncoding(1251).GetBytes(signatureData.ToString()));
signature = Convert.ToBase64String(signatureHash);
// Добавление параметра WMI_SIGNATURE в словарь параметров формы.
orderParams.Add("WMI_SIGNATURE", signature);