Как я могу закодировать эту строку запроса? - PullRequest
3 голосов
/ 09 июня 2011

Я пытаюсь реализовать платежный процессор.Чтобы подтвердить, что ответ является законным, мне нужно взять строку запроса и добавить ключ проверки, затем выполнить хэш 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?Другой метод, который я мог бы вызвать, который бы дал желаемые результаты?

Ответы [ 2 ]

1 голос
/ 09 июня 2011

Используйте QueryString.ToString(), чтобы получить полную строку запроса в виде одной большой закодированной строки, включая все &, + и т. Д. Если это все же отличается от того, что вы ожидаете, вы можете пойти на один уровень глубже и захватить Request.RawUrl.Split('?')[1].

1 голос
/ 09 июня 2011

Рик Страл (Rick Strahl) достаточно хорошо описывает это здесь: Html и Uri String Encoding без System.Web

В этой статье его цель состоит в том, чтобы избежать использования System.Web из-за смешанных результатов,что является именно той проблемой, с которой вы столкнулись (противоречивые результаты по сравнению с источником).

Если худшее становится наихудшим, вам, возможно, придется вернуться к использованию string.Replace () или string.ToUpper () - asВаши строки не огромны, это не должно сильно сказываться на производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...