如何对此查询字符串进行编码

本文关键字:编码 字符串 查询 | 更新日期: 2023-09-27 17:58:38

我正在尝试实现一个支付处理器。为了验证响应是否合法,我必须获取查询字符串并附加验证密钥,然后执行 MD5 哈希并将我的哈希值与他们的值匹配。

付款处理器根据如下所示的查询字符串生成其哈希:

trnId=10000041
&messageText=Duplicate+Transaction+%2D+This+transaction+has+already+been+approved
&trn金额=11.20
&trnDate=6%2F8%2F2011+12%3A32%3A20+PM
&trnEmailAddress=john%2Edoe%40gmail%2Ecom
&avsMessage=Address+Verification+not+performed+for+this+transaction%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=Duplicate+Transaction+-+This+transaction+has+already+been+approved
&trn金额=11.20
&trnDate=6%2f8%2f2011+1%3a05%3a09+PM
&trnEmailAddress=john.doe%40gmail.com
&avsMessage=地址+验证+不+执行+为+此+事务。
&ref1=AAB02CCD-7D17-4D09-A30C-AD6324FE33F1

这有点接近,但有 2 个问题,破折号和句点没有编码,编码生成的是小写而不是大写。 %2f而不是%2F.

有没有办法在不做string.replace的情况下解决这个问题?我可以调用另一种方法来提供我想要的结果?

如何对此查询字符串进行编码

使用 QueryString.ToString() 将完整的查询字符串作为一个大的编码字符串获取,包括所有&+等。如果这仍然与您的预期不同,您可以更深入地了解并抓住Request.RawUrl.Split('?')[1]

Rick Strahl在这里很好地介绍了这一点:没有System.Web的HTML和Uri字符串编码

在那篇文章中,他的目标是避免使用System.Web,因为它的结果混合,这正是您遇到的问题(与源相比结果不一致(。

如果最坏的情况发生,您可能不得不回退到使用字符串。替换(( 或字符串。ToUpper(( - 由于您的字符串不是很大,这应该不会产生太大的性能影响。