我正在實施託管結帳,託管結帳應該將用戶重定向回我的網站,以便我可以顯示自定義收據頁面。有沒有更簡單的方法來計算這個MD5哈希?
這是一個示例查詢字符串,我會回來:
trnApproved = 0 & trnId =千萬& MESSAGEID = 71 & =的MessageText被拒& AUTHCODE = 000000 &的responseType = T & trnAmount = 20.00 & trnDate = 9%2f23%2f2011 + 9%3a30%3a56 + AM & trnOrderNumber = 1000000 & trnLanguage = eng & trnCustomerName =名字+姓氏& trnEmailAddress = something_something%40gmail.com & trnPhoneNumber = 123555 avsProcessed = 0 & avsId = 0 & avsResult = 0 & avsAddrMatch = 0 & avsPostalMatch = 0 & avsMessage =地址+驗證+ +不進行對於+ + +這個交易。 & cvdId = 3 & cardType = VI & trnType = P & PAYMENTMETHOD = CC & REF1 = 9dae6af7-7c22-4697-B23A-413d8a129a75 & REF2 = & REF3 = & REF4 = & REF5 = &散列值= 33dacf84682470f267b2cc6d528b1594
爲了驗證請求,我應該從查詢字符串的末尾刪除&hashValue=f3cf58ef0fd363e0c2241938b04f1068
,然後附加一個鍵。然後我執行整個字符串的MD5哈希,結果應該是33dacf84682470f267b2cc6d528b1594
,與原始相同。
這很容易,除了一些領域對我造成問題。這是我使用的代碼(從虛擬應用程序中獲得,因此可以忽略一些不好的編碼):
// Split up the query string parameters
string[] parameters = GetQueryString().Split(new[] { "&" }, StringSplitOptions.None);
var querySet = new List<string>();
// Rebuild the query string, encoding the values.
foreach (string s in parameters)
{
// Every field that contains a "." will need to be encoded except for trnAmount
querySet.Add(param.Contains("trnAmount") ? param : UrlEncodeToUpper(param));
}
// Create the querystring without the hashValue, we need to calculate our hash without it.
string qs = string.Join("&", querySet.ToArray());
qs = qs.Substring(0, qs.IndexOf("&hashValue"));
qs = qs + "fb76124fea73488fa11995dfa4cbe89b";
var encoding = new UTF8Encoding();
var md5 = new MD5CryptoServiceProvider();
var hash = md5.ComputeHash(encoding.GetBytes(qs));
var calculatedHash = BitConverter.ToString(hash).Replace("-", String.Empty).ToLower();
這就是以UrlEncode方法我用。
private static string UrlEncodeToUpper(string value)
{
// Convert their encoding into uppercase so we can do our hash
value = Regex.Replace(value, "(%[0-9af][0-9a-f])", c => c.Value.ToUpper());
// Encode the characters that they missed
value = value.Replace("-", "%2D").Replace(".", "%2E").Replace("_", "%5F");
return value;
}
這一切工作(直到有人進入角色,我還沒有計入),除了這似乎更復雜比它應該是。我知道我不是唯一必須將這個HCO實現到ASP.NET應用程序中的人,所以我不認爲簡單的驗證應該如此複雜。
我錯過了一個更簡單的方法來做到這一點?必須遍歷字段,編碼其中的一些而跳過其他字符,將其編碼轉換爲大寫字母,然後有選擇地替換字符似乎有點奇怪。
Yay GET請求改變狀態......更好的希望谷歌有足夠的錢來支付它將要從你的網站上購買的所有東西! – Blindy
@Bindind,改變狀態?此請求沒有任何變化。我們只向將要進行身份驗證的用戶顯示收據。 – Brandon
你可以做一個帖子,而不是使用查詢字符串嗎? –