昨天下午易寶維護人員聯系我,詢問我三筆訂單的狀態,他們是扣費成功了,我們這還是訂單待扣費狀態,經過檢查發現雙方的簽名有問題,仔細一看這三筆訂單都有一個共性,用戶名都包含中文,然后就對症下葯。。。
由於易寶再扣費成功后通知我方前,對字符串用gb2312 urlencode了,而我方接口是用.net實現的,所以默認的編碼格式是utf-8,所以接收到請求后就把字符串的內容用utf-8 urldecode了,導致我這邊HttpUtility.UrlDecode(Request["user_name"], Encoding.GetEncoding("GB2312")) 獲得到的數據就是亂碼了。
現在問題找到原因了,怎么修改呢。。。
我查看了整個request對象,發現Request.Url.Query中,獲得的參數是最原始的沒有經過url解碼前的值然后就這么修改了
1 public static NameValueCollection GetQueryString(string queryString, Encoding encoding) 2 { 3 queryString = queryString.Replace("?", ""); 4 NameValueCollection result = new NameValueCollection(StringComparer.OrdinalIgnoreCase); 5 if (!string.IsNullOrEmpty(queryString)) 6 { 7 int count = queryString.Length; 8 for (int i = 0; i < count; i++) 9 { 10 int startIndex = i; 11 int index = -1; 12 while (i < count) 13 { 14 char item = queryString[i]; 15 if (item == '=') 16 { 17 if (index < 0) 18 { 19 index = i; 20 } 21 } 22 else if (item == '&') 23 { 24 break; 25 } 26 i++; 27 } 28 string key = null; 29 string value = null; 30 if (index >= 0) 31 { 32 key = queryString.Substring(startIndex, index - startIndex); 33 value = queryString.Substring(index + 1, (i - index) - 1); 34 } 35 else 36 { 37 key = queryString.Substring(startIndex, i - startIndex); 38 } 39 40 result[key] = HttpUtility.UrlDecode(value, encoding); 41 42 if ((i == (count - 1)) && (queryString[i] == '&')) 43 { 44 result[key] = string.Empty; 45 } 46 } 47 } 48 return result; 49 } 50 51 NameValueCollection col = GetQueryString(Request.Url.Query, Encoding.GetEncoding("GB2312")); 52 string user_id = col["user_name"];