2011-09-23 80 views
2

我正在實施託管結帳,託管結帳應該將用戶重定向回我的網站,以便我可以顯示自定義收據頁面。有沒有更簡單的方法來計算這個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應用程序中的人,所以我不認爲簡單的驗證應該如此複雜。

我錯過了一個更簡單的方法來做到這一點?必須遍歷字段,編碼其中的一些而跳過其他字符,將其編碼轉換爲大寫字母,然後有選擇地替換字符似乎有點奇怪。

+1

Yay GET請求改變狀態......更好的希望谷歌有足夠的錢來支付它將要從你的網站上購買的所有東西! – Blindy

+2

@Bindind,改變狀態?此請求沒有任何變化。我們只向將要進行身份驗證的用戶顯示收據。 – Brandon

+0

你可以做一個帖子,而不是使用查詢字符串嗎? –

回答

1

這裏有一個更好的方式與查詢字符串的工作:

var queryString = "trnApproved=0&trnId=10000000&messageId=71&messageText=Declined&authCode=000000&responseType=T&trnAmount=20.00&trnDate=9%2f23%2f2011+9%3a30%3a56+AM&trnOrderNumber=1000000&trnLanguage=eng&trnCustomerName=FirstName+LastName&trnEmailAddress=something_something%40gmail.com&trnPhoneNumber=1235550123&avsProcessed=0&avsId=0&avsResult=0&avsAddrMatch=0&avsPostalMatch=0&avsMessage=Address+Verification+not+performed+for+this+transaction.&cvdId=3&cardType=VI&trnType=P&paymentMethod=CC&ref1=9dae6af7-7c22-4697-b23a-413d8a129a75&ref2=&ref3=&ref4=&ref5=&hashValue=33dacf84682470f267b2cc6d528b1594"; 
var values = HttpUtility.ParseQueryString(queryString); 
// remove the hashValue parameter 
values.Remove("hashValue"); 
var result = values.ToString(); 
// At this stage result = trnApproved=0&trnId=10000000&messageId=71&messageText=Declined&authCode=000000&responseType=T&trnAmount=20.00&trnDate=9%2f23%2f2011+9%3a30%3a56+AM&trnOrderNumber=1000000&trnLanguage=eng&trnCustomerName=FirstName+LastName&trnEmailAddress=something_something%40gmail.com&trnPhoneNumber=1235550123&avsProcessed=0&avsId=0&avsResult=0&avsAddrMatch=0&avsPostalMatch=0&avsMessage=Address+Verification+not+performed+for+this+transaction.&cvdId=3&cardType=VI&trnType=P&paymentMethod=CC&ref1=9dae6af7-7c22-4697-b23a-413d8a129a75&ref2=&ref3=&ref4=&ref5= 

// now add some other query string value 
values["foo"] = "bar"; // you can stuff whatever you want it will be properly url encoded 

然後,我不太明白你想要做什麼。你想計算一個MD5的結果?你可以做到這一點,然後追加到查詢字符串。

+0

問題是,我不能只是刪除hash值並執行散列,因爲在做散列之前,我需要通過字段並「修復」他們發送的響應中某些字符的編碼我。 – Brandon

+1

@Brandon,你是什麼意思*修正一些字符的編碼*?你沒有一個真正的查詢字符串? –

+0

是的。當我調用HttpContext.Current.QueryString時,我得到了我在我的問題中發佈的結果。我無法對該查詢字符串執行MD5散列,因爲它提供了不正確的結果。爲了獲得正確的結果,我需要執行我在問題中提到的修改。基本上,我不能像原樣使用查詢字符串,因爲它不是HCO提供程序用來計算哈希值的字符串。 – Brandon