Проблема с интеграцией платежного шлюза Securepay

Я работаю над интеграцией Securepay с моей веб-страницей ASP.NET, согласно их документации, я генерирую SHA1 из следующей информации:

Отпечаток пальца представляет собой хэш SHA1 из указанных выше полей плюс пароль транзакции SecurePay в следующем порядке с разделителем вертикальной черты «|»:

  1. EPS_MERCHANTID
  2. Пароль транзакции (предоставляется службой поддержки SecurePay)
  3. EPS_TXNTYPE (как 0)
  4. EPS_REFERENCEID (для целей тестирования 123)
  5. EPS_AMOUNT (для целей тестирования 100,00)
  6. EPS_TIMESTAMP (для целей тестирования 20120910203805)

Хотя я следовал приведенным выше инструкциям, но всякий раз, когда я выполняю платеж, появляется сообщение «Неверный отпечаток пальца». Пример кода:

FormsAuthentication
  .HashPasswordForStoringInConfigFile("xxx|xxx|0|123|100.00|201‌20910203805","sha1")
  .ToLower();`

person Harshil Shukla    schedule 10.09.2012    source источник
comment
Пожалуйста, не могли бы вы показать свой код (с замаскированными секретами)   -  person Mr. Mr.    schedule 10.09.2012
comment
Хорошо, это выглядит следующим образом: FormsAuthentication.HashPasswordForStoringInConfigFile(xxx|xxx|0|123|100.00|20120910203805, sha1).ToLower();   -  person Harshil Shukla    schedule 10.09.2012
comment
Итак, вы используете это для создания хэш-пароля, который будет сохранен в файле конфигурации? Просто спрашиваю, потому что в документах говорится, что он подходит для хранения в конфигах.   -  person Mr. Mr.    schedule 10.09.2012
comment
Я не использую хэш-пароль для сохранения в файле конфигурации, но приведенная выше функция создает SHA1 без его сохранения.   -  person Harshil Shukla    schedule 10.09.2012
comment
Я думаю, вам нужно ближе прочитать документацию о том, как хешировать, потому что я думаю, что вы хотите, чтобы безопасный хэш отправлялся с запросом, чтобы они (поставщик платежных услуг) могли убедиться, что ваш запрос от вас? Обычно у вас есть общее секретное слово, которое хешируется с другими битами информации.   -  person Mr. Mr.    schedule 10.09.2012
comment
Кроме того, вы уверены, что это правильный класс для этого, он не кажется правильным, потому что имя метода, кажется, подразумевает, что он используется для другой цели?   -  person Mr. Mr.    schedule 10.09.2012
comment
Я проверил это дальше и обнаружил, что SHA1, приведенный в примере из Servicepay и созданный с помощью приведенного выше кода, не совпадают. Это отличается. Я использовал этот FormsAuthentication.HashPasswordForStoringInConfigFile(ABC0010|txnpassword|0|Test Reference|1.00|20110616221931, sha1).ToLower(); и у меня есть SHA1 как 7871d5c9a366339da848fc64cb32f6a9ad8fcadd и 01a1edbb159aa01b99740508d79620251c2f871d, это предложено Securepay.   -  person Harshil Shukla    schedule 10.09.2012


Ответы (3)


Убедитесь, что вы правильно заканчиваете строку, либо заканчивая символом '|' или удаление ненужного завершающего символа «|».

Также убедитесь, что метод, который вы используете, не добавляет внутрь метода ничего, что могло бы исказить то, что вы ожидаете. (Я думаю, что соль, основанная на конкретной машине, на которой вы находитесь, не знает, делает ли она это или нет)

Я пытался сгенерировать хэш здесь http://shagenerator.com/, используя это:

ABC|password|1|Te‌​st Reference|1.00|20120912123421

дает:

25a1804285bafc078f45e41056bcdc42e0508b6f

Можете ли вы получить тот же ключ с вашим кодом, используя мой ввод?

Обновлять:

Можете ли вы попробовать этот метод вместо HashPasswordForStoringInConfigFile() и посмотреть, станете ли вы ближе:

private string GetSHA1String(string text)
{
    var UE = new UnicodeEncoding();
    var message = UE.GetBytes(text);

    var hashString = new SHA1Managed(); 
    var hex = string.Empty;

    var hashValue = hashString.ComputeHash(message); 
    foreach (byte b in hashValue)
    { 
        hex += String.Format("{0:x2}", b);
    } 

    return hex;
}

ОБНОВЛЕНИЕ 2:

Проверьте свою кодировку, я обнаружил, что могу сопоставить вывод хэша с:

var UE = new UTF8Encoding();

ОБНОВЛЕНИЕ 3:

Следующий код работал у меня в консольном приложении, я видел, что хэши генерируют одно и то же значение, и я смог сравнить вывод с http://shagenerator.com/ также:

using System;
using System.Security.Cryptography;
using System.Text;
using System.Web.Security;

namespace SecurepayPaymentGatewayIntegrationIssue
{
    class Program
    {
        static void Main(string[] args)
        {
            var text = @"ABC|password|1|Te‌​st Reference|1.00|20120912123421";
            Console.WriteLine(GetSHA1String(text));

            Console.WriteLine(FormsAuthentication.HashPasswordForStoringInConfigFile(text, "sha1").ToLower());

            Console.ReadKey();
        }

        private static string GetSHA1String(string text)
        {
            var UE = new UTF8Encoding();// ASCIIEncoding(); // UnicodeEncoding();
            var message = UE.GetBytes(text);

            var hashString = new SHA1Managed();
            var hex = string.Empty;

            var hashValue = hashString.ComputeHash(message);
            foreach (byte b in hashValue)
            {
                hex += String.Format("{0:x2}", b);
            }

            return hex;
        }
    }
}
person Mr. Mr.    schedule 10.09.2012
comment
Привет, я попробовал с вашим вводом, и я получил SHA1 как: c09e1bf5f6c201d7dfb3574305458d48f9714a05, который отличается от вашего приведенного выше кода. - person Harshil Shukla; 10.09.2012
comment
Пожалуйста, покажите больше своего кода, так как этот код хеширования, который я предоставил, действительно работает, поэтому проблема заключается до или после вызова хеширования. - person Mr. Mr.; 11.09.2012
comment
Привет, Monkieboy, большое спасибо за вашу помощь, все сработало. - person Harshil Shukla; 11.09.2012
comment
Вы исправили свою проблему, если да, не забудьте отметить это как ответ. - person Mr. Mr.; 11.09.2012
comment
Он исправлен для активного URL-адреса для безопасной оплаты, но для тестового URL-адреса безопасной оплаты по-прежнему отображается та же старая ошибка «Неверный отпечаток пальца». - person Harshil Shukla; 11.09.2012

У меня была такая же проблема, и я решил ее, используя метод ниже:

 private string GetSHA1HashData(string data)
        {   

            SHA1 sha1 = new SHA1CryptoServiceProvider();

            //convert the input text to array of bytes
            byte[] hashData = sha1.ComputeHash(Encoding.Default.GetBytes(data));

            //create new instance of StringBuilder to save hashed data
            StringBuilder returnValue = new StringBuilder();

            //loop for each byte and add it to StringBuilder
            for (int i = 0; i < hashData.Length; i++)
            {                
                returnValue.Append(hashData[i].ToString("x2"));
            }

            // return hexadecimal string
            return returnValue.ToString();
        }

При загрузке страницы я преобразовал это возвращаемое значение в нижний регистр. потому что вышеуказанный метод возвращает значение в верхнем регистре

string VAL="ABC|password|1|Te‌​st Reference|1.00|20120912123421";
fingerPrint = GetSHA1HashData(VAL);
person DevT    schedule 10.03.2014
comment
1) Кодировка по умолчанию здесь, безусловно, неправильная идея, поскольку она различается в зависимости от компьютера, с которого вы работаете. Вместо этого используйте фиксированную кодировку. Я ожидаю, что UTF-8 будет лучшим выбором. 2) Я рекомендую разделить кодировку хэша из GetSHA1HashData. (принцип единой ответственности) 3) Trim бесполезен, в выводе не будет пробелов. 4) Вместо ToLowerInvariant можно использовать ToString("x2"). 5) комментарий создать новый экземпляр md5 не соответствует коду. 6) Вы должны избавиться от sha1. - person CodesInChaos; 10.03.2014
comment
@CodesInChaos спасибо за информацию. я сделал изменения, которые вы упомянули. но в моем сценарии я должен использовать кодировку по умолчанию, потому что она упоминается для использования .. спасибо - person DevT; 11.03.2014

использовать время как UTC Now: string epsTimestamp = DateTime.UtcNow.ToString(@"yyyyMMddHHmmss");

А также убедитесь, что вы использовали sha1 для шифрования:

string data = EpsMerchant + "|" + EpsPassword + "|" + EpsTxnType + "|" + 
EpsReferenceId + "|" + EpsAmount + "|" + epsTimestamp;
string epsFingerprint = GetSha1String(data);

А ниже код для получения sha1

string GetSha1String(string input)
        {
            StringBuilder stringBuilder = new StringBuilder();
            foreach (byte b in GetHash(input))
                stringBuilder.Append(b.ToString("X2"));
            return stringBuilder.ToString();
        }

    public static byte[] GetHash(string inputString)
    {
        HashAlgorithm obj = SHA1.Create();
        return obj.ComputeHash(Encoding.UTF8.GetBytes(inputString));
    }
person Raju Chapagain    schedule 25.10.2018