標籤:
昨天下午易寶維護人員聯絡我,詢問我三筆訂單的狀態,他們是計費成功了,我們這還是訂單待計費狀態,經過檢查發現雙方的簽名有問題,仔細一看這三筆訂單都有一個共性,使用者名稱都包含中文,然後就對症下藥。。。
由於易寶再計費成功後通知我方前,對字串用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 else36 {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"];
c# url自動解碼解決方案