· 5 years ago · Feb 11, 2020, 07:52 AM
1 foreach (var keyPair in IPNValues)
2 {
3 var key = HttpUtility.UrlDecode(keyPair.Key);
4
5 switch (key)
6 {
7 case "IPN_PID[]":
8 size = keyPair.Value.Length;
9 PlainDataTohash.Append(size);
10 PlainDataTohash.Append(keyPair.Value);
11 break;
12 case "IPN_PNAME[]":
13 size = keyPair.Value.Length;
14 PlainDataTohash.Append(size);
15 PlainDataTohash.Append(keyPair.Value);
16 break;
17 case "IPN_DATE":
18 size = keyPair.Value.Length;
19 PlainDataTohash.Append(size);
20 PlainDataTohash.Append(keyPair.Value);
21 break;
22 }
23 }
24
25 var now = DateTime.Now.ToString("yyyyMMddHHmmss");
26 size = now.Length;
27 PlainDataTohash.Append(size);
28 PlainDataTohash.Append(now);
29 string HashData = PlainDataTohash.ToString();
30
31 //Get user
32 var userId = IPNValues["EXTERNAL_CUSTOMER_REFERENCE"];
33 var user = uow.UserInfoRepository.GetByGuid(new Guid(userId));
34
35 var conf = uow.TwoCheckoutRepo.GetByTenantId(user.TenantRefId);
36
37 hash = CreateHMACHash(HashData, conf.SecretKey);
38
39 hash = "<EPAYMENT>" + now + "|" + hash + "</EPAYMENT>";
40 Log.Information("2checkout HashData: " + HashData);
41 Log.Information("2checkout response hash: " + hash);
42
43
44
45 public string CreateHMACHash(string data, string secretKey)
46 {
47 byte[] secretBytes = Encoding.ASCII.GetBytes(secretKey);
48 string hash = string.Empty;
49
50 using (HMACMD5 hmac = new HMACMD5(secretBytes))
51 {
52 byte[] stringBytes = Encoding.ASCII.GetBytes(data);
53 var bytes = hmac.ComputeHash(stringBytes);
54 foreach (byte x in bytes)
55 {
56 hash += String.Format("{0:x2}", x);
57 }
58 }
59
60 return hash;
61 }