Я пытаюсь реализовать платежный процессор.Чтобы подтвердить, что ответ является законным, мне нужно взять строку запроса и добавить ключ проверки, затем выполнить хэш MD5 и сопоставить мои хэшированные значения с их.
Процессор платежей генерирует их на основе хэшав строке запроса, например:
trnId = 10000041
& messageText = Дубликат + Транзакция +% 2D + Эта + транзакция + уже + была + была подтверждена
& trnAmount = 11,20
& trnDate = 6% 2F8% 2F2011 + 12% 3A32% 3A20 + PM
& trnEmailAddress = john% 2Edoe% 40gmail% 2Ecom
& avsMessage = Адрес + Проверка + не + выполнена + для + этой + транзакции% 2E
& ref1 = aab02ccd% 2D7d17% 2D4d09% 2Da30c% 2Dad6324fe33f1
Теперь, если бы я позвонил QueryString["messageText"]
, я бы получил "Duplicate Transaction - This transaction has already been approved"
.Я не могу использовать это, так как мне нужны +
и %2D
Поэтому, чтобы сгенерировать мою строку, я делаю что-то вроде этого:
NameValueCollection queryString = new NameValueCollection(QueryString);
queryString.Remove("hashValue");
List<string> parameters = new List<string>();
foreach(string qs in queryString.Keys)
parameters.Add(qs + "=" + HttpUtility.UrlEncode(QueryString[qs]));
string value = string.Join("&", parameters.ToArray());
Моя результирующая строка:
trnId = 10000041
& messageText = Дубликат + Транзакция + - + Эта + транзакция + уже + уже была + одобрена
& trnAmount = 11.20
& trnDate = 6% 2f8% 2f2011 + 1%3a05% 3a09 + PM
& trnEmailAddress = john.doe% 40gmail.com
& avsMessage = Адрес + Проверка + не + выполнена + для + этой + транзакции.
& ref1 = aab02ccd-7d17-4d09-a30c-ad6324fe33f1
Это немного ближе, но с двумя проблемами тире и периоды не кодируются, и кодировка генерирует строчные буквы вместо прописных.%2f
вместо %2F
.
Есть ли способ исправить это без string.replace
?Другой метод, который я мог бы вызвать, который бы дал желаемые результаты?